Skip to content

异常和中断

中断

计算机运行的时候, 出现某些意外需要主机进行干预, 机器自动停止正在运行的程序, 转入处理程序, 处理完毕以后返回原先被暂停的程序继续进行

STM32有异常以及中断, 这个是Cortex内核支持的, ST公司进行扩展

异常是内核产生的, 中断一般是指连接到内核的外部器件产生, 他们触发的处理方式相同

优先级越小, 优先级越高, 除了固定的优先级, 其他的中断根据优先级分组进行配置, Cotex内核有8bit的优先级, 但是STM32只支持高四位也就是4bit的优先级配置

STM32使用优先级分组

分组分别为抢占优先级以及子优先级, 抢占优先级才会进行中断的嵌套, 挂起的中断里面抢占优先级相同的时候才会根据子优先级的大小进行判断哪一个中断先进行, 通过NVIC进行设置, 如果抢占优先级子优先级相同, 则IRQ小的先运行

使用NVIC可以使能失能中断, 设置中断悬起, 清除中断悬起, 获取悬起的中断, 设置中断优先级, 获取中断优先级, 以及系统复位

EXTI拓展中断和事件控制器

事件

STM32上面有很多的外设, 通过内部的信号来进行协同的工作, 这个信号可以理解为时间, 有些事件是可见的, 另一些不可见, 在寄存器里面可以查到这一些事件的标志, 通常我们把中断和事件绑定在一起, 来使用相应的事件

EXTI-拓展中断和事件控制器

可以捕获电平的变化等, 产生对应的中断

一般来说是GPIO的输入, 但是高级的芯片里面还有其他的输入, 电平变化以后根据触发选择寄存器来选择是否会向后面进行, 这时候连接的是一个或门, 还可以进行软件触发, 之后会往下进行传递, 再行下传递会进行分叉, 向上触发中断, 向左会触发脉冲, 脉冲主要用于芯片的唤醒

事件可以用于一些外设上面, 比如可以在不使用中断但是启动ADC

在H7系列的芯片里面, 对于能够在系统处于停止模式或 CPU 处于 CStop 模式时生成唤醒事件的外设,将连接至 EXTI 可配置事件输入或直接事件输入

可配置事件(Configurable events)来自GPIO,PVD以及比较器COMP1和COMP2的外部中断关联。

直接事件(Direct events)来自RTC,Tamper,I2C1,USARTS 1和2,CEC,LPUART1,LPTIM 1、2,LSE,UCPD 1、2。

使用CubeMX进行生成代码

有事件模式以及中断模式

HAL库直接使用GPIO的一个模式进行表示EXTI模式, 使用GPIO_Init函数就可以实现这一个功能

之后就可以设置生成对应的程序

程序中会生成对应的初始化代码, 同时还会生成一个中断处理函数, 进行中断的标志位的清除