[STM32F0] 位宽为8bits操作 , 异常现象

[复制链接]
3042|14
 楼主| 会飞的大葱 发表于 2021-7-6 18:15 | 显示全部楼层 |阅读模式
大家有没有这样操作过

将一个寄存器的地址,强转成uint8_t 的指针,然后给他写一个uint8_t 的数据

这个时候该寄存器的其他Byte也会变成写的这个uint8_t 的数据
 楼主| 会飞的大葱 发表于 2021-7-6 18:21 | 显示全部楼层
eg:

随便找一个32bits ,可读可写的寄存器
282460e42da016495.png

该寄存器的地址经过查找后为 0x40013814
操作
*(uint8_t *)(0x40013814) = 0x5A;

我认为写完之后,再去读该寄存器应该是0x0000005A

实际测试结果是0x5A5A5A5A
 楼主| 会飞的大葱 发表于 2021-7-6 18:23 | 显示全部楼层
操作
*(uint8_t *)(0x40013815) = 0x5A;

再读取该寄存器,发现也是0x5A5A5A5A

写之前肯定确保该寄存器是0哈
 楼主| 会飞的大葱 发表于 2021-7-6 19:21 | 显示全部楼层
找到原因了

手册中有描述哪些寄存器可以按照字、半字、字节访问

当某个寄存器只能按照字或者半字访问时,软件非要按照字节去访问,就会出现以上现象

ayb_ice 发表于 2021-7-7 16:05 | 显示全部楼层
为什么叫特殊功能寄存器是有原因的,不能随便转换的,要看手册
coody 发表于 2021-7-7 16:36 | 显示全部楼层
你这样操作的目的是什么?32位的MCU的寄存器都是32位操作的。
 楼主| 会飞的大葱 发表于 2021-7-7 16:44 | 显示全部楼层
coody 发表于 2021-7-7 16:36
你这样操作的目的是什么?32位的MCU的寄存器都是32位操作的。

32位的MCU的寄存器并不是都是32位操作的
比如RCC_CR 寄存器

其实没有啥目的
如果这样可以操作,会快
 楼主| 会飞的大葱 发表于 2021-7-7 16:46 | 显示全部楼层
ayb_ice 发表于 2021-7-7 16:05
为什么叫特殊功能寄存器是有原因的,不能随便转换的,要看手册

“为什么叫特殊功能寄存器是有原因的” ????

没明白这句话啥意思
 楼主| 会飞的大葱 发表于 2021-7-7 16:56 | 显示全部楼层
最后看ST手册,总结大概规律:
1.在APB上的外设寄存器,肯定不能按照Byte去访问。
2.在AHB上的外设寄寄存器,有的可以按照Byte或者半字去访问,有的不可以。

大家有兴趣的可以研究一下哈
ayb_ice 发表于 2021-7-7 16:57 | 显示全部楼层
本帖最后由 ayb_ice 于 2021-7-7 16:59 编辑
会飞的大葱 发表于 2021-7-7 16:46
“为什么叫特殊功能寄存器是有原因的” ????

没明白这句话啥意思

不能把他当成普通RAM看待,RAM你写啥,读回就是啥,而SFR不能这样去理解,所以很特殊,所以叫特殊功能寄存器
另外大部分SFR是不能随意按字节,半字,字访问的,强制转换前看手册说明,如果是51的话,还无法用指针去访问SFR,更特殊

 楼主| 会飞的大葱 发表于 2021-7-7 17:00 | 显示全部楼层
ayb_ice 发表于 2021-7-7 16:57
不能把他当成普通RAM看待,RAM你写啥,读回就是啥,而SFR不能这样去理解,所以很特殊,所以叫特殊功能寄 ...

嗯,了解

后来经过实验验证确实是这样,之前是想当然了。
renzheshengui 发表于 2021-8-6 13:37 | 显示全部楼层
有这种数据类型吗
paotangsan 发表于 2021-8-6 13:44 | 显示全部楼层
这个sfr是哪里比较特殊的呢
labasi 发表于 2021-8-6 13:48 | 显示全部楼层
有的内容是不是和手册不符呢
木木guainv 发表于 2021-8-6 13:51 | 显示全部楼层
这种寄存器是可以随便读写的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

78

帖子

1

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