打印
[STM32F0]

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

[复制链接]
2735|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家有没有这样操作过

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

这个时候该寄存器的其他Byte也会变成写的这个uint8_t 的数据

使用特权

评论回复
沙发
会飞的大葱|  楼主 | 2021-7-6 18:21 | 只看该作者
eg:

随便找一个32bits ,可读可写的寄存器


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

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

实际测试结果是0x5A5A5A5A

使用特权

评论回复
板凳
会飞的大葱|  楼主 | 2021-7-6 18:23 | 只看该作者
操作
*(uint8_t *)(0x40013815) = 0x5A;

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

写之前肯定确保该寄存器是0哈

使用特权

评论回复
地板
会飞的大葱|  楼主 | 2021-7-6 19:21 | 只看该作者
找到原因了

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

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

使用特权

评论回复
5
ayb_ice| | 2021-7-7 16:05 | 只看该作者
为什么叫特殊功能寄存器是有原因的,不能随便转换的,要看手册

使用特权

评论回复
6
coody| | 2021-7-7 16:36 | 只看该作者
你这样操作的目的是什么?32位的MCU的寄存器都是32位操作的。

使用特权

评论回复
7
会飞的大葱|  楼主 | 2021-7-7 16:44 | 只看该作者
coody 发表于 2021-7-7 16:36
你这样操作的目的是什么?32位的MCU的寄存器都是32位操作的。

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

其实没有啥目的
如果这样可以操作,会快

使用特权

评论回复
8
会飞的大葱|  楼主 | 2021-7-7 16:46 | 只看该作者
ayb_ice 发表于 2021-7-7 16:05
为什么叫特殊功能寄存器是有原因的,不能随便转换的,要看手册

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

没明白这句话啥意思

使用特权

评论回复
9
会飞的大葱|  楼主 | 2021-7-7 16:56 | 只看该作者
最后看ST手册,总结大概规律:
1.在APB上的外设寄存器,肯定不能按照Byte去访问。
2.在AHB上的外设寄寄存器,有的可以按照Byte或者半字去访问,有的不可以。

大家有兴趣的可以研究一下哈

使用特权

评论回复
10
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,更特殊

使用特权

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

嗯,了解

后来经过实验验证确实是这样,之前是想当然了。

使用特权

评论回复
12
renzheshengui| | 2021-8-6 13:37 | 只看该作者
有这种数据类型吗

使用特权

评论回复
13
paotangsan| | 2021-8-6 13:44 | 只看该作者
这个sfr是哪里比较特殊的呢

使用特权

评论回复
14
labasi| | 2021-8-6 13:48 | 只看该作者
有的内容是不是和手册不符呢

使用特权

评论回复
15
木木guainv| | 2021-8-6 13:51 | 只看该作者
这种寄存器是可以随便读写的吗

使用特权

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

本版积分规则

17

主题

66

帖子

1

粉丝