这个关键词主要是用于定义寄存器的,也就是用volatile修饰定义的变量,其值得更新与硬件密切相关,主要硬件寄存器的值变化了,就立即发生变化,对于这样的变量,在使用是,应当首先用临时变量保存起来。
比如说:
#define INT_STATUS_REG (*(volatile unsigned long*)0x40001200)
定义了一个中断状态寄存器,地址为0x40001200(Cortex M3的一个APB16外设中断)
在相应的中断服务程序中,依据这个寄存器的值来判断当前该外设的状态,则应当在中断一开始就用临时变量将其保存,在做后续处理,如下:
void XXX_Interrupt_Handle(void)
{
uint32_t Interrupt_Status = INT_STATUS_REG;//get the interrupt status
if (Interrupt_Statuse&0x03)
{
................
}
else if (Interrupt_Statuse&0x0C)
{
.....................
}
else
....................
}
这样,才能保证你在中断处理过程中,处理是是中断发生时的实际情况,因为在处理中断的过程中,该中断寄存器的值有可能继续发生了变化。
反正,如果你直接使用该寄存器进行判断的话,则可能导致有些中断处理始终得不到响应。
打赏帖 | |
---|---|
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 | |
VOFA+波形显示+JYD-31蓝牙发送和解析不定长数据被打赏10分 | |
【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度被打赏22分 | |
【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器被打赏23分 | |
宏定义和const关键字定义被打赏5分 | |
【分享开发笔记,赚取电动螺丝刀】几个单片机I2S外设的BLCK时钟对比被打赏20分 | |
【功率监测与控制系统DIY活动成果贴】DIY功率计与LabVIEW数据采集被打赏100分 | |
【分享开发笔记,赚取电动螺丝刀】使用ESP32S3调试I2S音频模块MAX98357被打赏22分 | |
【Freertos】任务管理被打赏10分 |