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位,即2^{0} -1= 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函数前还有启动文件,用汇编语言编写。

    1. 堆栈(SP)初始化
    2. PC初始化,PC是program counter指针,指向地址,地址处程序运行。
    3. 向量表初始化,把ISR填入中断向量表中。
    4. __main呼唤main函数

    作者:全沾点工程师

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32G431(ARM Cortex M4内核)中断机制详解与个人总结

    发表回复