中断系统

  • 可屏蔽中断交给NVIC硬件,由NVIC进行抢占仲裁、查找中断向量表,最后将中断程序地址(中断向量)交给CPU
  • 包括:EXTI(外部中断)、TIM与RTC(时钟中断)和其他外设的中断
  • 不可屏蔽中断NMI直接发给CPU,CPU会跳转到固定的NMI中断程序地址

NVIC

  • NVIC是嵌套向量中断控制器(外设)
  • Cortrx-M3内核的NVIC裁剪后,得到STM32的NVIC
  • 该外设包含7个外设寄存器(即中断寄存器)
  • 中断使能(ISER)
  • 中断优先级(IPRx)
    • 宽8bit,但只会使用高4bit
  • 中断优先级分组(AIRCR的PRIGROUP位)

    • 将中断优先级的4bit,分为抢占优先级(高n位)和响应优先级(低4-n位)
    • 抢占优先级=主优先级,响应优先级=子优先级
  • 中断仲裁逻辑

  • 先比较主优先级,相同时比较子优先级,相同时比较中断号
  • 注:优先级越低越高

EXTI

图 17‑1 EXTI功能框图

  • 输入线=GPIO或RTC或USB或以太网等(见手册)
  • GPIOx通道通过AFIO中的16个MUX进行选择,选出16bit连接到EXTI
  • 外部中断源=软件中断事件寄存器(EXTI_SWIER)| 边沿检测电路
  • 产生外部中断请求
  • 请求挂起寄存器(EXTI_PR)=外部中断源
  • 外部中断请求 = 中断屏蔽寄存器(EXTI_IMR)& EXTI_PR
  • (当屏蔽中断时,中断会存在EXTI_PR中,并且不会硬件自动清除,需要软件手动清除)
  • (当未屏蔽中断时,中断首先会存在EXTI_PR中,中断响应后被自动清除)
  • 产生外部中断事件
  • 外部中断事件 = 事件屏蔽寄存器(EXTI_EMR)& 外部中断源

GPIO产生EXTI流程例

image-20251230143039311

  • 配置GPIO:GPIO时钟、AFIO时钟、GPIO初始化
  • 注意:把AFIO和GPIO看成GPIO系统内的两个子模块
  • 配置EXTI:EXIT初始化
  • 配置NVIC:NVIC分组配置、NVIC初始化
  • 写中断处理程序:可以利用EXTI的库函数进行中断的处理

其他设备产生EXTI

  • 特点:不直接产生中断,而是借助EXTI产生中断(有些设备两者都支持)
  • 用途:当系统处于低功耗模式(如睡眠),需要外部中断来唤醒

中断函数中的状态机

  • 一般在中断函数中写状态机,而不要在一般函数中写状态机
  • 状态设计:状态a转移到状态b
  • if(状态a的进入条件)
    • 状态a的进入动作
    • if(状态a的转移条件)
    • 状态a的转移动作
  • 由于中断的触发次数有限,状态的个数要考虑触发次数 => 规定状态个数
  • 比如一次传输会触发7次中断,那么7次中断内,必须执行完一轮状态机
  • 数据传输区域中,状态机要注意避免数据覆盖 => 规定现态的转移动作和次态的进入条件
  • 使用读标志RF,写后置RF,读后清RF
  • 要求只有RF=1才能写
  • image-20260118160234648