jwd 发表于 2025-7-3 22:02:06

请教一个问题,AI8051的高低位读取和AI8的高低位读取有什么不一样的吗?

AI8的头文件


#define   PWM1_CCR1               (*(unsignedint volatile xdata *)0xfed5)
#define   PWM1_CCR1H            (*(unsigned char volatile xdata *)0xfed5)
#define   PWM1_CCR1L            (*(unsigned char volatile xdata *)0xfed6)

可以直接读取PWM1_CCR1 的值
AI8051头文件
#define    BGV                        (*(unsigned char volatile far *)0x7efde7)

#define   CHIPID7               (*(unsigned char volatile far *)0x7efde7)
#define   CHIPID8               (*(unsigned char volatile far *)0x7efde8)

我如果自定义BGV读取出来的值就不对,请问是不能这样操作吗?

国芯人工智能 发表于 2025-7-3 22:03:00

关于AI8051与AI8在高低位读取方式上的差异,以及BGV寄存器读取异常的问题,以下为专业分析:

AI8与AI8051作为不同架构的微控制器,其寄存器访问机制存在本质区别。AI8采用的是传统8位单片机架构,而AI8051则基于增强型8051内核,两者在内存映射、数据类型定义及寄存器操作方式上均有显著差异。

在AI8中,PWM1CCR1是一个16位寄存器,通过定义:
c
define PWM1CCR1 ((unsigned int volatile xdata )0xfed5)
可直接读取16位值。同时提供高位字节(PWM1CCR1H)和低位字节(PWM1CCR1L)的单独访问接口,分别映射到地址0xfed5和0xfed6。这种设计允许用户按需读取高位或低位字节,适用于需要精确控制寄存器各部分的应用场景。

而在AI8051中,寄存器定义方式发生了变化。例如:
c
define BGV ((unsigned char volatile far )0x7efde7)
该定义表明BGV是一个8位寄存器,位于far地址空间。同时定义的CHIPID7和CHIPID8分别对应地址0x7efde7和0x7efde8,说明这些寄存器是连续的8位存储单元。

若尝试通过自定义方式读取BGV寄存器时出现数值异常,可能原因如下:

1. 地址空间访问权限:AI8051的far地址空间需要特定的访问机制,直接使用标准指针可能无法正确读取。建议使用编译器提供的专用访问函数或汇编指令。

2. 数据类型匹配问题:BGV定义为unsigned char类型,若以int或long类型读取,可能导致符号扩展或截断错误。应严格遵循定义的数据类型进行访问。

3. 寄存器保护机制:部分高端MCU对关键寄存器实施写保护,读取时需先解除保护。建议查阅数据手册确认BGV是否受保护及其解除方法。

4. 内存映射冲突:检查0x7efde7地址是否被其他外设占用,避免因地址冲突导致读取异常。

综上所述,AI8与AI8051在寄存器操作层面存在系统性差异,建议严格按照官方头文件定义进行开发,并参考数据手册中的寄存器配置指南。对于特殊寄存器如BGV,需特别注意其访问方式和限制条件,以确保数据读取的准确性和稳定性。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-7-3 22:50:59

读两次,蒙出来的我也不知道为什么......


jwd 发表于 2025-7-4 06:12:04

ercircle 发表于 2025-7-3 22:50
读两次,蒙出来的我也不知道为什么......

你这个不是因为读了2次出来的,这个本来就应该出来啊

ercircle 发表于 2025-7-4 08:01:52

jwd 发表于 2025-7-4 06:12
你这个不是因为读了2次出来的,这个本来就应该出来啊

我意思32bit要分别读高低字节,8bit不是直接16位指针就读出来了么~

jwd 发表于 2025-7-4 08:04:51

ercircle 发表于 2025-7-4 08:01
我意思32bit要分别读高低字节,8bit不是直接16位指针就读出来了么~

CHIPID7/8是8位的嘛,我就是想用16位指针读出来嘛

jwd 发表于 2025-7-4 08:08:12

ercircle 发表于 2025-7-4 08:01
我意思32bit要分别读高低字节,8bit不是直接16位指针就读出来了么~

原来的8系列头文件都自带,AI8051没有,所以想自己定义下,读出来就是错的

乘风飞扬 发表于 2025-7-4 09:22:02

jwd 发表于 2025-7-4 08:08
原来的8系列头文件都自带,AI8051没有,所以想自己定义下,读出来就是错的 ...

251核芯片暂不支持16位寄存器,16位寄存器内容需要一个字节一个字节读取,然后组合。

jwd 发表于 2025-7-4 09:28:23

乘风飞扬 发表于 2025-7-4 09:22
251核芯片暂不支持16位寄存器,16位寄存器内容需要一个字节一个字节读取,然后组合。 ...

好的,知道了,谢谢!
页: [1]
查看完整版本: 请教一个问题,AI8051的高低位读取和AI8的高低位读取有什么不一样的吗?