完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言:
要想学习STM32中断,要先掌握STM32对优先级的定义;有51单片机开发经验会比较容易理解中断优先级;本篇博文基于STM32F103ZET6芯片和3.5.0标准库编写, 从寄存器入手,最终实现编程的步骤。 一 基础知识 1. cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断) 2. stm32只有84个中断,包括16个内核中断和68个可屏蔽中断 3. stm32f103上只有60个可屏蔽中断,f107上才有68个中断 4. 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。 次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。 NVIC是什么? 嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级; 分组的方式有两种: (1)Cortex-m3内核提供了一种3位宽度的PRIGROUP数据区,用于指示一个8位数据序列中的小数点的位置,从而表示中断优先级的分组。见下表: (2)而实际上STM32并没有用到这么多中断,所以在分组上只分了5个组,并且表示方法有所不同;见下表: 我们在应用当中只会用到STM32的分组(5组)方式,所以下面着重于5组分组方式; 二 中断向量表 (STM32F10x系列) (图片来自STM32使用手册,只需看,不需要熟记,知道大概这么多中断就好) 三 配置中断相关寄存器 /* cortex-m3内核分组方式(8组)结构体表达方式: */ typedef struct { __IO uint32_t ISER[8]; 中断使能设置寄存器 /*!《 偏移量: 0x000 Interrupt Set Enable Register */ uint32_t RESERVED0[24]; __IO uint32_t ICER[8]; 中断清除使能寄存器 /*!《偏移量: 0x080 Interrupt Clear Enable Register */ uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; 中断挂起设置寄存器 /*!《 偏移量: 0x100 Interrupt Set Pending Register */ uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; 中断清除挂起寄存器 /*!《偏移量: 0x180 Interrupt Clear Pending Register */ uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; 中断激活状态位寄存器 /*!《 偏移量: 0x200 Interrupt Active bit Register */ uint32_t RESERVED4[56]; __IO uint8_t IP[240]; 中断优先级寄存器 /*!《 偏移量: 0x300 Interrupt Priority Register (8Bit wide) */ uint32_t RESERVED5[644]; 软件触发方式寄存器 __O uint32_t STIR; /*!《 偏移量: 0xE00 Software Trigger Interrupt Register */ } NVIC_Type; /* STM32分组(5组)方式结构体表达方式 typedef struct { vu32 ISER[2]; u32 RESERVED0[30]; vu32 ICER[2]; u32 RSERVED1[30]; vu32 ISPR[2]; u32 RESERVED2[30]; vu32 ICPR[2]; u32 RESERVED3[30]; vu32 IABR[2]; u32 RESERVED4[62]; vu32 IPR[15]; } NVIC_TypeDef; */ 以上寄存器介绍: 对一些概念的解释: 1. 挂起:当置位中断挂起寄存器的时候,相应的中断将会被挂起,这是这个中断将不会立即执行,而是等待可执行的时候再执行;比如高低级别的中断同时产生,就先挂起低级别的中断,等高级别的中断执行完毕,解除并执行低级中断; 2. 对中断优先级控制寄存器的解释 推荐去观看一位前辈的博客: http://blog.csdn.net/DLUTXIE/article/details/7059184?locationNum=4&fps=1 四 编程步骤 (1)选择优先级分组 /* a. 此函数在库文件misc.h文件下; b. 参数可参照下面图片: c. 功能:选择分组方式; */ void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 栗子:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //抢占优先级可选0~3,响应优先级可选0~3; (2)选择,配置,并使能中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择EXTI2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //响应优先级为2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能EXTI2中断; NVIC_Init(&NVIC_InitStructure); //初始化以上参数; (3)写出相应中断函数 栗子: void EXTI2_IRQHandler(void) { //逻辑代码; EXTI_ClearITPendingBit(EXTI_Line2); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1801 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
745浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 08:55 , Processed in 1.542867 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号