翻译STM32 #define __IO volatile /*!< defines 'read / write' permissions */ IO表示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译STM32 #define __IO volatile /*!< defines 'read / write' permissions */ IO表示相关的知识,希望对你有一定的参考价值。

表明此变量随时可能会改变状态
读此值或者给此赋新值时都必须重新读取或者写入
因为普通变量会遭到编译器优化处理,比如:
int a=5;
..... //中间没有对a操作
b = a;// 编译器就将5给b

__IO int a=5;
..... //中间没有对a操作
b = a;// 编译器不做优化,去a的地址读取值后,再将最新的值赋给b(因为此变量声明为__IO)
参考技术A volatile的作用在于:
不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。
__I :输入(input)。既然是输入,那么寄存器的值就随时会外部修改,那就不能进行优化,每次都要重新从寄存器中读取。也不能写,即只读,不然就不是输入而是输出了。
__O :输出(output),也不能进行优化,不然你连续两次输出相同值,编译器认为没改变,就忽略了后面那一次输出,假如外部在两次输出中间修改了值,那就影响输出
__IO:输入输出,同上追问

看了几遍你的回答。我理解的是输入就是输入一个值给寄存器,但是这样想就解释不通了,怎么输入就变成了只读呢?输入不是写入的意思吗?

本回答被提问者采纳

STM32 keil中__IO得意思

__IO解释

STM32得库函数中(HAL和LL库都有),存在一个__IO得宏定义

#define     __I         volatile const        /*!< defines 'read only' permissions      */
#define     __O     volatile                  /*!< defines 'write only' permissions     */
#define     __IO    volatile                  /*!< defines 'read / write' permissions   */

volatile得含义为

允许硬件改变变量得数值

我来解释一下

假如我们定义一个变量

int Flash_Num __attribute__((at(Outer_Flash_ADDR)));
/*******************************************
解释
int x __attribute__((at(ADDR)));
可以将x存放在指定的地址ADDR中
********************************************/

而这个变脸得地址,我们利用attribute((at(ADDR)));这个功能将Outer_Flash_ADDR将定义的Flash_Num变量数据存入了外部扩展flash中。

这时,突然!有一个外部得设备,用硬件得方式把Flash_Num地址中存储得变量给更改了!!!我们这时还想知道更改后得数据是啥。

但是,悲剧发生了,我们用软件读出来得变量数值竟然毫无变化!

因为软件只能读软件改变得变量,读不出来硬件改变得变量,呐怎么办呐????

这时候你只需要在定义变量前加一个__IO

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

瞬间就成功读出来了~~~


总结

volatile形变量可以被硬件改变
在需要硬件改变变量得场合中不可或缺!!!

以上是关于翻译STM32 #define __IO volatile /*!< defines 'read / write' permissions */ IO表示的主要内容,如果未能解决你的问题,请参考以下文章

STM32F030 IO口外部中断应用

STM32中断函数

__io_putchar() 和 __io_getchar() 定义在哪个文件中?

关于STM32 __IO 的变量定义

硬件实现IIC协议读取EEPROM

STM32的IO口的8种配置