STM32中断与嵌套NVIC快速入门

发布者:TranquilMind最新更新时间:2021-05-25 来源: eefocus关键字:STM32  中断与嵌套  NVIC 手机看文章 扫描二维码
随时随地手机看文章

简介:STM32 中断与嵌套NVIC 快速入门


//====================================================


// STM32 中断与嵌套NVIC 快速入门


// netjob 2008-8-1


//====================================================


STM32中断与嵌套NVIC快速入门


我也是靠看这本书才弄懂的:


Cortex-M3 权威指南


Joseph Yiu 著


宋岩 译


其实很简单。


//CM3 有 最多240个中断(通常外部中断写作IRQs),就是 软件上说的 IRQ CHANAELx(中断通道号x)


每个中断有自己的可编程的中断优先级【 有唯一对应的 中断优先级寄存器 】.


由于CM3支持 硬件中断嵌套,所以可以有 256 级的可编程优先级


和 256级中断嵌套【 书上称:抢占(preempt) 优先级】


所以大家可以设:


IRQ CHANAEL 0 通道 = 2 中断优先级 WWDG 窗口定时器中断


IRQ CHANAEL 1 通道 = 0 中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断


IRQ CHANAEL 3 通道 = 255 中断优先级 RTC 实时时钟(RTC)全局中断


IRQ CHANAEL 6 通道 = 10 中断优先级 EXTI0 EXTI线0中断


.....


IRQ CHANAEL 239 通道 = (0


这个实在是太恐怖了! 是的,其实CM3 并没有这样做。


实在的芯片例如STM32等就只有设计来可用才64级可编程优先级和8级中断嵌套。


对 64级中断就是说:( INT0 到 INT63)这个大家比较好理解,其它的64···239就不用了。


IRQ CHANAEL 0


。。。


IRQ CHANAEL 63


而8级中断嵌套这又是何解呢?


是这样的,上面说 一个 【中断】对应 一个【中断优先级寄存器】,而这个寄存器是 8 位的。


当然就是 256级了。而现在就用了 它其中的 BIT7,IT6,BIT5 三位来表示,而且是MSB对齐的。


用了3 个位来表达优先级(MSB 对齐的我们能够使用的8 个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0 以及0xE0。)


这样我们在【中断优先级寄存器】就不能按理论的填 0到255之间的数了,


而只能填0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0 以及0xE0。)


所以大家可以设:


IRQ CHANAEL 0 通道 = 0x20 中断优先级 WWDG 窗口定时器中断


IRQ CHANAEL 1 通道 = 0x40 中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断


IRQ CHANAEL 3 通道 = 0x20 中断优先级 RTC 实时时钟(RTC)全局中断


IRQ CHANAEL 6 通道 = 0xA0 中断优先级 EXTI0 EXTI线0中断


.....


IRQ CHANAEL 63 通道 = 【0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0 以及0xE0。)】


大家注意到了,上面通道0和通道3 的优先级都是0X20, 这怎么办?


// 如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ #0会比IRQ #3 先得到响应


而且文中还讲了 【优先级分组】,这又是什么回事?


其实我回头看来,这个【优先级分组】和【抢占优先级】【亚优先级】都毫无意义的。


如果当时用 256级即是 把【中断优先级寄存器】的8位都全用上,就没这个必要了。还什么优先级分组呢!


就是因为厂家现在【偷工减料】,才搞出这个明堂来的。


是这样的,在 应用程序中断及复位控制寄存器(AIRCR) 中的 10:8 位【3位】是表示【优先级分组】


它作用主要是 用于对【中断优先级寄存器】『我们现在中用了BIT7,BIT6,BIT5三位』的功能的说明。


有一个表,在《Cortex-M3 权威指南》的110页, 例如我们把AIRCR的10:8 位设为【5】 ,


查表可得【抢占优先级】=【7:6】,【亚优先级】=【5:0】,


对于【中断优先级寄存器】只用了BIT7,6,5, 因此我们可以看作是 【7:6】,【5】。那4-0 可以不管。


现在我们的 IRQ0=0X20, IRQ3=0X20, 也就是 【0 0 1 0 】『 bit7=0,bit6=0,bit5=1,bit4=0』


因为大家(IRQ0/IRQ3)的 【抢占优先级】=【7:6】都是0, 说明它们的中断相应级别是一样的。


再继续判断它们哪个更优先的责任就要看【5】,结果连【5】都是一样的!


那就按默认:


// 如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ #0会比IRQ #3 先得到响应


由于CM3没有 进中断【关全局中断相应】这事,只要是中断通道打开了,就会存在 通道间的 嵌套,即是会发生


【抢占】的情况了。


上面就简短的说明,如果要详细理解,可以看《Cortex-M3 权威指南》。


有任何理解不当,请各位多多指教!


补充注意:


“2)抢占式优先级别相同的中断源之间没有嵌套关系;”


所以大家可以设:


IRQ CHANAEL 0 通道 = 0x20 中断优先级 WWDG 窗口定时器中断


IRQ CHANAEL 1 通道 = 0x40 中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断


IRQ CHANAEL 3 通道 = 0x20 中断优先级 RTC 实时时钟(RTC)全局中断


IRQ CHANAEL 6 通道 = 0xA0 中断优先级 EXTI0 EXTI线0中断


这样 0 通道和3 通道就不会有嵌套情况,而是0 通道按默认比3 通道优先高些。


而0 通道与1 通道就会有嵌套情况。


芯片复位后,默认的优先级分组 是 0, 就是 【7:1】表示抢占式优先级,【0】表示亚优先级,


这样对于MSB对齐的 8 个优先级为:0x00(最高),0x20,0x40,0x60,0x80,0xA0,0xC0 以及0xE0。)


使用就很方便了,建议大家就用默认的默认的优先级分组 是 0,也就是复位后的值,哈哈!


例如下面的两个按键,都使用外中断方式, 使用了PD.3,和PD.4两个引脚。这两个中断的优先级都是0X20,


按默认的优先级分组,它们之间不会发生中断嵌套。


/* Enable the EXTI3 Interrupt on PD.3 */


STM32_Nvic_Regs->Priority[9].all=0x20; // 中断的优先级是 0X20


STM32_Nvic_Regs->Enable[0].bit.INT9=1; // 开INT9 中断 IRQ9


/* Enable the EXTI4 Interrupt on PD.4 */


STM32_Nvic_Regs->Priority[10].all=0x20; // 中断的优先级是 0X20


STM32_Nvic_Regs->Enable[0].bit.INT10=1; // 开INT10 中断 IRQ10


关键字:STM32  中断与嵌套  NVIC 引用地址:STM32中断与嵌套NVIC快速入门

上一篇:STM32GPIO——快速IO的使用
下一篇:利用FPGA实现无线分布式采集系统设计

推荐阅读最新更新时间:2024-11-07 17:58

怎样在Linux上开发STM32程序
步骤1:下载所需的一切 您需要下载三个部分才能正常工作: 用于ARM的GCC编译器 STM32固件文件 St-link实用程序 Sample Project 编译器是将我们的C代码和所有其他库文件编译成stm32控制器可以理解的机器语言的主要软件。下载此编译器的最新预编译版本。 包含STM32固件的文件夹是保存主处理器运行所需的所有启动文件和核心文件的文件夹。我们将使用HAL已超越的标准外围设备库。我更喜欢StPeriphLibrary,因为使用该处理器的公司都在使用它们,因为它功能强大,更老旧并且受支持。它也更坚固。它不会减少初始化外围设备或打开LED所需的工作,但是会迫使您学习这些处理器的工作方式。这样一来,您将对内部工作
[单片机]
怎样在Linux上开发<font color='red'>STM32</font>程序
STM32 输入捕获功能
01、STM32捕获功能 从STM32的定时器框图中看 ①部分基础定时器模块,已经在《 STM32基础定时器详解 》讲解过了。 ②部分捕获/对比通道模块,已经在《 定时器的PWM功能 》讲解过了。 ③部分是本文的重点,输入捕获模块。 从上图可以看出定时器1共有4个输入捕获通道。 下文以定时器1的捕获通道2为例讲解。 首先确定下对应的GPIO,从STM32F207数据手册的Alternatefunction mapping看出,定时器1通道2对应的GPIO有PA9和PE11,下文将使用PE11。 02、输入捕获过程 输入阶段采样对应的对输入TIx,去产生滤波后的信号TIxF。然后极性选择边沿检测器产生一个信号(TIx
[单片机]
<font color='red'>STM32</font> 输入捕获功能
STM32单片机-汇编指令2
目录: 11、STMFD和LDMFD指令 1)STMFD SP! ,{R0-R7,LR} 2)LDMFD SP! ,{R0-R7,LR} 99、伪指令 1)PROC伪指令 2)EXPORT伪指令 3)IMPORT伪指令 4)DCD与DCDU伪指令 5)ALIGN伪指令 6)AREA伪指令 7)SPACE和DCD伪指令的区别 8)ENTRY伪指令 ----------------------------------------- 说明: STM32单片机-汇编指令使用1 STM32单片机-汇编指令使用2 ------------------------------
[单片机]
<font color='red'>STM32</font>单片机-汇编指令2
STM32 关闭JTAG 使用相应GPIO口 简单记录
STM32 的PA13-PA14-PA15-PB3-PB4-PB5主要是用来JTAG调试用的,于是在默认下是启动后为JTAG模式,但是对于不需要JTAG而需要充分利用GPIO口时,就需要将JTAG关闭,设置为GPIO模式。 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开PA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开PB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI
[单片机]
基于STM32战舰开发板的内部温度传感器实验
内部温度传感器简介 测量的温度位置 内部温度传感器集成在芯片中,测量的是芯片的温度。 如何测量对应位置的温度? 温度传感器与ADC1_CH16相连,另外ADC1_CH17是与内部参照电压VREF+相连,因此我们可以通过ADC1的第16路通道测量芯片温度实时对应的电压转换得来的数字量,也可以通过ADC1的第17路通道测量内部参照电压对应的数字量。 我们知道STM32的ADC转换DATA是12Bits的,因此输入电压(小于3.3V大于0V)ADC转换为数字量的值为“大于0小于4096”。 我们由“T-V关系图”,“V的数字量”和“ADC量程”,可以得知“此时的温度”。 内部传感器配置注意事项 ① 读取内部温度传
[单片机]
基于<font color='red'>STM32</font>战舰开发板的内部温度传感器实验
(八)STM32的CAN模块实验
bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。 主要特点 *****; 支持CAN协议2.0A和2.0B主动模式 *****; 波特率最高可达1兆位/秒 *****; 支持时间触发通信功能 发送 *****;3个发送邮箱 *****; 发送报文的优先级特性可软件配置 *****;记录发送SOF时刻的时间戳 接收 *****; 3级深度的2个接收FIFO *****; 14个位宽可变的过滤器组-由整个CAN共享 ***
[单片机]
STM32学习记录之cubemx配置IIC+逻辑分析仪的学习
首先 这里用的开发板是原子的STM32F429,就是通过CUBEMX配置IIC的总线,话不多说,上图 因为原子429的板子的IIC的数据线和时钟线是PH4和PH5,而I2C2的默认并不是这个引脚,大家要根据手上实际的电路图来呀。 这些都是初始化配置,没有需要修改的,就这样默认就好了,至于系统时钟的配置,选用的是外部时钟,只要不超出范围就好了。然后就是生成工程。 下面是主要的程序 #define ADDR_AT24C02_Write 0xA0 #define ADDR_AT24C02_Read 0xA1 uint8_t I2C_Buffer_Write ; uint8_t I2C_Buffer_Read ;
[单片机]
<font color='red'>STM32</font>学习记录之cubemx配置IIC+逻辑分析仪的学习
STM32-4-NVIC串口
STM32有好几个串口。比如说STM32F103ZET6有5个串口,串口1的引脚对应的IO为PA9,PA10.PA9,PA10默认功能是GPIO,所以当PA9,PA10引脚作为串口1的TX,RX引脚使用的时候,那就是端口复用。 复用端口初始化有几个步骤: 1) GPIO端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 2) 复用的外设时钟使能。比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USAR
[单片机]
STM32-4-<font color='red'>NVIC</font><font color='red'>与</font>串口
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved