ARM coretex_m3内核支持256个中断和可编程256级中断优先级设置。
Stm32的NVIC是coretex_m3的NVIC的子集。
Stm32目前支持84个中断和16级可编程中断优先级。仅使用中断优先级设置8位中的高四位。
每个中断对应一个外围设备,每个外围设备包括许多个引起中断的中断源或中断事件。这些中断源与中断事件都要通过指定的中断通道向内核申请中断。中断通道的优先级确定设备整体的优先级,而设备本身的多个中断执行顺序由用户的中断服务程序决定。
Stm32的68个外部中断通道固定分配给相应的外部设备。每个终端通道都具备自己的中断优先级控制字节PRI_n(8位,用高四位),每四个通道构成一个32位优先级寄存器。总共17个32位的优先级寄存器。
上表中断优先级寄存器的配置需在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这三位中,这三位叫做PRIGROUP。
假如写入的是0x04(即011)到PRIGROUP中,则有8个抢先式优先级和两个子优先级。
当上电Reset后,寄存器AIRC中的PRIGROUP值为0,既有16个抢先优先级,无子优先级。
对于某一个外部中断通道,有相应的控制字和控制位,用于单独的和总的控制该中断通道:
中断优先级控制字:PRI_n;
中断允许设置位:在ISER寄存器中;
中断允许清除位:在ICER寄存器中;
中断悬挂pending位置位:在ISER寄存器中;
中断悬挂pending为清除:在ICER寄存器中;
正在被服务的中断标志位:在IABR寄存器中。只读,用来了解当前内核正在处理哪个中断通道。
这些都是在NVIC寄存器中配置。
详细步骤(以TIME2为例)
NVIC_InitTypeDef NVIC_InitStructure;
//该结构体中有四个成员,分别为:
// uint8_t NVIC_IRQChannel; 中断通道
// uint8_t NVIC_IRQChannelPreemptionPriority; 抢先优先级
// uint8_t NVIC_IRQChannelSubPriority; 子优先级
// FunctionalState NVIC_IRQChannelCmd; 中断使能
1.设置寄存器AIRC中PRIGROUP的值,规定抢占优先级和子优先级的个数:
//选择中断分组1(即编号6)
//NVIC_PriorityGroup_1|0-1|0-7|1 bits for pre-emptionpriority|3 bits for subpriority
//即有2个抢先优先级和6个子优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
设置TIME2本身的寄存器,允许相应中断。如允许UIE。
//选择TIM2的中断通道
//在stm32f10x.h这个文件中,定义了一系列的中断通道,
//并以结构体的形式报存,并针对18以后的位置以版本型号加以区分,
//与手册中相对应。
//有STM32F10X_LD、STM32F10X_LD_VL、STM32F10X_MD、STM32F10X_MD_VL、
// STM32F10X_HD、STM32F10X_HD_VL、STM32F10X_XL、STM32F10X_CL、
//其中TIME_IRQn是28,TIM2 global Interrupt,与手册对应了起来。
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
设置TIME2中断通道的抢先优先级和子优先级(IP[28],在NVIC中)。
//抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//子优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
设置允许TIME2中断通道,在NVIC寄存器组的ISER寄存器的一位。
//使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//将上述参数写入寄存器
NVIC_Init(&NVIC_InitStructure);
2.当TIME2的UIE条件成立(更新,上溢或下溢),硬件将TIME2的UIE中断标志位置位。内核硬件将TIME2的pending置位,表示TIME2有中断申请。
如果当前有高于TIME2的中断在执行,则保持pending,还可以通过软件将ICPR寄存器中相应位清除掉。
如果内核有空,开始相应TIME2中断。硬件将相应标志位置位,同时硬件清除TIME2的pending。
3.通过软件将TIME2具体事件的中断标志位清除。判断哪个是TIME2的具体事件中断,并转移到相应的代码段。
如果TIME2本身中断事件多于2,其先后顺序由程序员的中断服务决定。
4.执行完中断服务后,进入中断返回过程:硬件将IABR寄存器相应标志位清除,表示本中断处理完成。如果TIME2本身还有中断标志位,表示TIME2还有中断在申请,则重新将TIME2的pending置位1,等待再次进入TIME2的中断服务。
上一篇:STM32 USB如何配置多个CDC设备---5个CDC设备
下一篇:关于STM32的ADC/DAC问题汇总
推荐阅读最新更新时间:2024-11-03 11:52
设计资源 培训 开发板 精华推荐
- SI87XXSDIP6-KIT、带有 Si87XX LED 仿真器输入隔离器的 SDIP6 封装评估板套件
- 使用 Richtek Technology Corporation 的 RT8567A 的参考设计
- 2相双极步进电机驱动IC —— TB6608FNG
- 使用PCB制做8段数码管
- GL823K TF(Micro SD)读卡器
- Arduino UNO 测速扩展板
- 使用 ON Semiconductor 的 RC4190 的参考设计
- AS5215-DB,AS5215 可编程 360 度磁角编码器演示板,带 SINE 和余弦输出信号
- 5V 超级电容 UPS
- 使用 Infineon Technologies AG 的 IRPT1058A 的参考设计