打印
[STM32G4]

理解和正确使用__IO是

[复制链接]
1055|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
理解和正确使用__IO是非常重要的,特别是在处理外设寄存器或者需要与硬件交互的情况下。让我来进一步解释一下__IO的作用和使用场景:

1. 宏定义解释
在STM32的库函数中,__IO是一个宏定义,其定义如下:

__I: 表示只读权限,通常用于声明只能读取、不能修改的寄存器或变量。
__O: 表示只写权限,用于声明只能写入、不能读取的寄存器或变量。
__IO: 表示读写权限,用于声明可读可写的寄存器或变量。
这些宏定义帮助我们在声明变量时明确其访问权限,特别是在操作硬件寄存器时非常有用。

使用特权

评论回复
沙发
工程师犹饿死|  楼主 | 2024-6-30 12:04 | 只看该作者
使用场景
a. 操作硬件寄存器
当我们需要与外部硬件进行通信,并且需要读写硬件寄存器时,应该使用__IO来声明变量。这样做的好处是确保编译器不会对这些变量进行优化,以免意外修改或读取硬件状态。

c__IO uint32_t * const GPIOA_CRH = (__IO uint32_t *)0x40010804;


GPIOA_CRH是一个指向GPIOA的控制寄存器的指针,使用__IO确保在读写这个寄存器时,编译器不会对其进行优化。

使用特权

评论回复
板凳
工程师犹饿死|  楼主 | 2024-6-30 12:05 | 只看该作者
外部存储器访问
如果你在外部扩展Flash或其他外设上存储数据,并且需要确保在软件读取时能够正确反映硬件改变的值,也应该使用__IO:

c

__IO int Flash_Num __attribute__((at(Outer_Flash_ADDR)));

这样声明的Flash_Num变量,在使用attribute((at(Outer_Flash_ADDR)))指定其存放地址后,可以确保软件能够正确读取和写入外部Flash中的数据,即使硬件设备直接修改了该存储地址的值。

使用特权

评论回复
地板
工程师犹饿死|  楼主 | 2024-6-30 12:05 | 只看该作者
总结
使用__IO是确保在需要与硬件直接交互或者在特定存储位置存取数据时的关键。它保证了编译器不会对这些变量的读写行为进行优化,从而确保与硬件交互的正确性和可靠性。在开发嵌入式系统时,特别是处理外设寄存器或外部存储器时,正确理解和使用__IO是至关重要的一步。

使用特权

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

本版积分规则

75

主题

886

帖子

0

粉丝