几乎所有 MCU 都有中断,中断可以打断主程序的执行,实时地应对突发事件。一般情况下,我们可以把中断用于定时器、串口数据传输等,配套可以实现很多特殊操作。这边以 stm32 和 EFM32 为例,了解下中断的操作。

中断简要描述

由于使用的 ARM Mx 系列的内核,因此这几款处理器配置中断的过程都相似,具体步骤如下:

  • 配置相关模块(如:定时器、串口等)
  • 选择开启模块的哪个中断标志位(即:中断使能标识),只有开启了该功能,才会在该事件发生时至位产生中断请求
  • NVIC 配置中断优先级,内核的不同这边会略有差别,在 NVIC->IP 中配置。
  • NVIC 使能该模块对应中断向量的中断。

实际工作过程可以看出 NVIC 在内核中,而它掌管着整个中断,每个模块使能中断后,在发生中断时会给出一个中断请求信号给 NVIC,然后 NVIC 打断主程序。手册解释,当 NVIC 未被开启时会收到模块请求会挂起中断,而等待中断使能。这边可以理解为任何时候模块发送中断请求后,会将挂起位 ISPR 至位,如果中断开启的话,且没有高优先级的中断正在执行,则 ISPR 被清除,同时立即执行该中断;否则如果中断未被开启或者高优先级程序正在执行,则中断继续挂起等待执行。

优先级

NVIC 配置中断优先级,一般有抢占优先级和响应优先级,详细内容可以参见内核手册,内核的不同这边会略有差别,如:M0 就没有响应优先级。

优先级的配置需要考虑多种因素,需要考虑主程序的功能、硬件设施、所有使用的中断等,一般来说没有固定的模式可以套用(可能缺少某些外设,内核需要休眠,中断程序需要在主程序中执行等),中断的优先级配置更多的是逻辑问题,逻辑上面没有漏洞即可行,这边还是会提供一些常用的方法,仅供参考(数值越小、优先级约高):

  • 存储数据优先级 0
  • 接受数据优先级 1
  • 发送数据优先级 2
  • 定时器优先级和其他中断优先级 3
  • 按键优先级 5

中断技巧

中断的配合使用,可以实现很多特殊功能,如均匀脉冲的输出、串口数据的分帧、定时 DMA-uart 发送数据等。这边只举几个常用案例。

串口数据分帧

思路:首先协议约定当超过三个波特率时间未收到数据,则认为一帧数据接受完成,因此,我们可以使用串口中断和定时器中断结合,每次串口中断接受到数据后,启动定时器计时,如果再次收到数据,定时器则清空重新计数,如果未收到数据定时器超时,则进入定时器中断,定时器中断中标记一帧接受完成。


后续补充

参考链接:
http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html
http://www.voidcn.com/article/p-wzqbmjzl-xr.html