STM32G431(ARM Cortex M4内核)中断机制详解与个人总结
怎么中断?
以USART串口为例,第一个中断是TDR寄存器空时,标志位(TXE)置位,在使能控制位(TXEIE)时触发中断,产生高电平获得上升沿,内核检测到中断。
用人话说就是串口在发送数据,当数据发送完,TDR寄存器空了,就会产生中断,内核知道空了就能继续发送数据。
注:每次中断后执行完相应程序时,要把标志位清零,防止中断死循环,对应Interrupt clear method
嵌套向量中断控制器Nested vectored interrupt controller (NVIC)
向量是什么?
向量(vector),刚开始理解是非常抽象的,顾名思义,向量就是一个箭头,指向了中断服务程序入口地址,这个地址在单片机的程序进入main函数之前就配置好的,具体如下:
中断向量表初始化
中断是单片机响应外部事件或内部特定条件的一种机制。中断向量表是存储中断服务程序入口地址的表格。
在进入main
函数之前,需要对中断向量表进行初始化,将各个中断源对应的中断服务程序入口地址填入中断向量表中,以便当相应的中断事件发生时,单片机能够准确地找到并跳转到对应的中断服务程序进行处理。
所以向量就是指向某中断的地址,使PC(program counter)指针指向它,程序就进入中断。
NVIC有什么用?
首先要知道中断和异常,中断就是外部中断,异常就是内部中断,NVIC负责外部中断,分好组排好序,优先级最高的交给CPU。
图中灰底就是内部中断,priority就是优先级(注:数字越小优先级越高,类比孔融让梨),position就是IRQn的number。
使能中断:
void NVIC_EnableIRQ(IRQn_Type IRQn)
挂起中断:当两个中断同时产生,优先级高的先处理,优先级低的被挂起(标记位置位),等待优先级高的处理完再处理。若在处理完之前清楚挂起等于没有触发中断。
void NVIC_SetPendingIRQ(IRQn_Type IRQn);
分组
抢占优先级优于响应优先级,因为你已经优先到可以不需要响应就能抢占了。所以优先比较抢占优先级。
分组方式 | 抢占优先级 | 响应优先级 |
---|---|---|
0 | 0位,即 |
4位,即0~15 |
1 | 1位,即0~1 | 3位,即0~7 |
2 | 2位,即0~3 | 2位,即0~3 |
3 | …… | …… |
4 | …… | …… |
假如一个抢占优先级为1的中断正在进行,突然来了一个抢占优先级为0的中断,就会发生中断嵌套,内核停止1去做0,做完0再做1。
如果来的是抢占优先级为1,但响应优先级更低,不会发生中断嵌套。
注:比较是看两者的抢占/响应优先级,而非自身比较抢占、响应优先级。
(太抽象了,我理解了半天)
main函数之前的事情
在初学c语言时,为了简化及方便理解,默认程序直接从main函数开始,然而单片机程序非也,在进入main函数前还有启动文件,用汇编语言编写。
- 堆栈(SP)初始化
- PC初始化,PC是program counter指针,指向地址,地址处程序运行。
- 向量表初始化,把ISR填入中断向量表中。
- __main呼唤main函数
作者:全沾点工程师