[STM32F1] C51和ARM读写寄存器方式的疑惑

[复制链接]
 楼主| spark周 发表于 2021-6-17 23:37 | 显示全部楼层 |阅读模式
C51里访问寄存器的方式是:例如sfr P0 = 0x80;  然后对P0的赋值就可以读写这个寄存器了, C语言和汇编语言的接口就是这个sfr指令
 楼主| spark周 发表于 2021-6-17 23:39 | 显示全部楼层
而ARM架构里,在C程序中翻到最后就只能看到define定义了一个地址
liliang9554 发表于 2021-6-17 23:42 | 显示全部楼层

什么意思?不是很明白你说的什么,能再解释一下这个现象吗
 楼主| spark周 发表于 2021-6-17 23:44 | 显示全部楼层
例如 #define UART1_BASE   (APB2PERIPH_BASE+0x3800),然后对UART_BASE赋值就可以读写这个相关寄存器
jlyuan 发表于 2021-6-17 23:45 | 显示全部楼层
难道在Arm架构里,C语言和汇编的接口就是#define指令?
wyjie 发表于 2021-6-17 23:47 | 显示全部楼层
51 的内存容量有限, 用 SFR 定义高 128 字节直接地址.
dingy 发表于 2021-6-17 23:48 | 显示全部楼层
stm32 的内存空间很大, 所以内存和寄存器统一编址, 用相同的方式访问
jiajs 发表于 2021-6-17 23:50 | 显示全部楼层
内核都不一样,没有什么奇怪的
yszong 发表于 2021-6-17 23:52 | 显示全部楼层
这也跟编译器有关系吧,人家设计的就是这样
ousj 发表于 2021-6-17 23:54 | 显示全部楼层
我们只是用,就按人家规定的方式就行了,研究太深也没用。
xxrs 发表于 2021-6-17 23:55 | 显示全部楼层
位数不一样吧
jiahy 发表于 2021-6-17 23:56 | 显示全部楼层
你这还是没理解51的总线架构。

ARM是全片统一编址,无论寄存器、RAM、还是Flash,都统一编址到2的32次方,0x00000000到0xFFFFFFFF范围内,理论上用指针可以访问到任意地址的内容,指针访问属于间接访问。

51的总线分为外部RAM、内部RAM、内部寄存器0x80--0xFF、外部ROM、内部ROM。外部ROM与内部ROM的地址是重叠的,但是好在有个EA引脚,EA引脚的状态决定了只能访问外部和内部ROM中的其中一个,不能同时访问。
外部RAM、外部ROM,分别用MOVX和MOVC来访问,在C51中就得在定义数据类型的时候来区分,得加上xdata或code指示数据是存在外部RAM还是ROM。
内部RAM的低128字节,包括地址为0x80到oxFF的内部寄存器,可以用MOV指令直接访问,MOV Ri #12H 之类的。C51定义内部RAM低128字节变量时用data。
内部RAM的高128字节,只能MOV间接访问,MOV @Ri, A,也就是要访问的地址必须先存入Ri中,然后@Ri就是Ri值对应的地址。C51定义内部RAM高128字节变量时用idata。
内部寄存器只能直接访问。
huangchui 发表于 2021-6-17 23:58 | 显示全部楼层
是不是就是位数不一样啊
redone 发表于 2021-6-30 17:00 | 显示全部楼层
我觉得在使用上,跟资源的关系很大。
51来说,你直接操作寄存器,就那么几个,无所谓了。
对ARM来说,操作寄存器,但凡你用的资源多点,没几天自己就不认识了。
 楼主| spark周 发表于 2021-7-3 08:14 | 显示全部楼层
哦,那我就知道怎么回事了,多谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

821

主题

10121

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部