本文是《ALIENTEK STM32F429 FreeRTOS 开发教程》第四章学习笔记
第一章笔记–FreeRTOS简介与源码下载
第二章笔记–FreeRTOS在STM32F4上移植
第三章笔记-FreeRTOS系统配置
一、Cortex-M中断管理
1.1 中断概述
中断由硬件产生,当中断产生后CPU就会中断当前流程转去处理中断服务,Cortex-M内核的MCU提供一个用于管理中断的嵌套向量中断控制器(NVIC)
NVIC 与 CM3 内核共同完成对中断的响应。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC 还包含了 MPU
的控制寄存器、 SysTick 定时器以及调试控制。
Cortex-M3和M4的NVIC最多支持249个外部中断输入(IRQs)、1个不可屏蔽中断(NMI)、1个Systick(滴答定时器)定时器中断和多个系统异常
1.1.1中断类型
在 NVIC 的中断控制及状态寄存器中,有一个 VECTACTIVE 位段;另外,还有一个特殊功能寄存器IPSR。在它们二者的里面,都记录了当前正服务异常的编号,编号为 1-15 的对应系统异常,
编号大于等于 16 的则全是外部中断
1.2 中断管理
Cortex-M处理器有多个用于管理中断和异常的可编程寄存器,这些寄存器都在NVIC和系统控制块(SCB)中,CMSIS将这些寄存器定义为结构体。
NVIC访问地址是0xE000_E000,打开core_cm4.h文件:
可以看到NVIC基址是从 0xE000_E000 + 0x0100UL = 0xE000_E100开始的
宏定义的NVIC中有一结构体 NVIC_Type
1.2.1NVIC_Type
typedef struct
{
__IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[24U];
__IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[24U];
__IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[24U];
__IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[24U];
__IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
uint32_t RESERVED4[56U];
__IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644U];
__OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
} NVIC_Type;
1.2.1.1 中断使能除能寄存器
CM3和CM4 中可以有240对使能位/除能位,每个中断拥有一对。这 240 个对子分布在8对32位寄存器中(最后一对没有用完)。欲使能一个中断,需要写 1 到对应 SETENA 的位中;欲除能一个中断,需要写 1 到对应的 CLRENA 位中;如果往它们中写 0,