深圳品牌做网站,网站开发过程阶段,Wordpress不同分类下分页,中国建设教育学会网站一、什么是中断#xff1f;
想象一下你正在家里做饭#xff0c;突然门铃响了#xff0c;你听到门铃声后#xff0c;会暂时放下手中的事情#xff08;比如炒菜#xff09;#xff0c;去开门看看是谁。在这个例子中#xff0c;门铃声就是一个“中断”#xff0c;它打断…一、什么是中断
想象一下你正在家里做饭突然门铃响了你听到门铃声后会暂时放下手中的事情比如炒菜去开门看看是谁。在这个例子中门铃声就是一个“中断”它打断了你原本在做的事情炒菜。
在STM32一个常用的微控制器中中断也是类似的概念。STM32有很多功能比如控制LED灯、读取传感器数据、与电脑通信等。当STM32正在执行某个任务时如果外部发生了某个事件比如一个按钮被按下、一个传感器值发生了变化这个事件就会产生一个“中断信号”告诉STM32“嘿有事情发生了你需要停下来看看”
STM32在接收到中断信号后会暂时放下当前的任务就像你放下炒菜的铲子去开门一样然后跳转到专门处理这个中断的程序我们称之为“中断服务程序”去执行。在这个中断服务程序中STM32会处理这个中断事件比如读取按钮的状态、处理传感器的数据等。处理完中断事件后STM32会返回到之前被打断的任务中继续执行。
STM32支持多种类型的中断比如外部IO中断比如按钮被按下、定时器中断比如每隔一段时间就触发一次、串口通信中断比如接收到电脑发来的数据等。每种中断都可以设置不同的优先级这样当多个中断同时发生时STM32会先处理优先级高的中断。 二、外部中断
了解了什么是中断以后我们来介绍一下STM32的外部中断此处以STM32F429为例它拥有22个外部中断每个中断设有状态位每个中断/事件都有独立的触发和屏蔽设置。这22个中断分别为
EXTI 线 0~15对应外部 IO 口的输入中断。EXTI 线 16连接到 PVD 输出。EXTI 线 17连接到 RTC 闹钟事件。EXTI 线 18连接到 USB OTG FS 唤醒事件。EXTI 线 19连接到以太网唤醒事件。EXTI 线 20连接到 USB OTG HS(在 FS 中配置)唤醒事件。EXTI 线 21连接到 RTC 入侵和时间戳事件。EXTI 线 22连接到 RTC 唤醒事件。
从上面看到EXTI线0-15对应了外部的IO口中断但是那么多的IO口是如何对应这16个EXTI线的呢
STM32是这么设计的PA0,PB0,PC0...PI0也就是所有的GPIO0对应了EXTI0。然后PA1,PB1,PC1...PI1所有的GPIO1对应了EXTI1。这样依次类推一直到EXTI15。中断可以监控GPIO的上升沿或者下降沿并跳转到我们写的对应的函数注意的是一个EXTI线中断只能给一个引脚使用比如给PA0加了外部中断以后就不能再给PB0加外部中断了。 三、代码实现
比如这里我们给GPIO_PE3加一个上升沿触发的中断。
1.使能GPIO GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIOE时钟//PE3 输入GPIO_Initure.PinGPIO_PIN_3; //PE3GPIO_Initure.ModeGPIO_MODE_IT_RISING; //上升沿触发GPIO_Initure.PullGPIO_NOPULL; //上拉GPIO_Initure.SpeedGPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOE,GPIO_Initure);//给PE3加上升沿中断HAL_NVIC_SetPriority(EXTI3_IRQn,4,2); //抢占优先级为4子优先级为2HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能中断线3
2.中断函数
void EXTI3_IRQHandler(void)
{if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_3) ! RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);Gather_FLAG1;}
}
这段代码里面如果进了中断先清除外部中断位然后改变了一个全局变量的标识符我们可以通过标识符的改变在其它运行的代码中继续我们耗时的工作切忌不要在中断里面进行耗时工作。
注意在编写中断服务程序时一定要确保在中断处理完成后清除相应的中断标志位否则中断可能会持续触发导致程序无法正常工作。