打印
[STM32F1]

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

[复制链接]
9113|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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赋值就可以读写这个相关寄存器

使用特权

评论回复
5
jlyuan| | 2021-6-17 23:45 | 只看该作者
难道在Arm架构里,C语言和汇编的接口就是#define指令?

使用特权

评论回复
6
wyjie| | 2021-6-17 23:47 | 只看该作者
51 的内存容量有限, 用 SFR 定义高 128 字节直接地址.

使用特权

评论回复
7
dingy| | 2021-6-17 23:48 | 只看该作者
stm32 的内存空间很大, 所以内存和寄存器统一编址, 用相同的方式访问

使用特权

评论回复
8
jiajs| | 2021-6-17 23:50 | 只看该作者
内核都不一样,没有什么奇怪的

使用特权

评论回复
9
yszong| | 2021-6-17 23:52 | 只看该作者
这也跟编译器有关系吧,人家设计的就是这样

使用特权

评论回复
10
ousj| | 2021-6-17 23:54 | 只看该作者
我们只是用,就按人家规定的方式就行了,研究太深也没用。

使用特权

评论回复
11
xxrs| | 2021-6-17 23:55 | 只看该作者
位数不一样吧

使用特权

评论回复
12
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。
内部寄存器只能直接访问。

使用特权

评论回复
13
huangchui| | 2021-6-17 23:58 | 只看该作者
是不是就是位数不一样啊

使用特权

评论回复
14
redone| | 2021-6-30 17:00 | 只看该作者
我觉得在使用上,跟资源的关系很大。
51来说,你直接操作寄存器,就那么几个,无所谓了。
对ARM来说,操作寄存器,但凡你用的资源多点,没几天自己就不认识了。

使用特权

评论回复
15
spark周|  楼主 | 2021-7-3 08:14 | 只看该作者
哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

821

主题

10121

帖子

4

粉丝