完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基础知识
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. 对中断优先级控制寄存器的解释 |
|
|
|
编程步骤
(1)选择优先级分组 /* 1. 此函数在库文件misc.h文件下; 2. 参数可参照下面图片: 3. 功能:选择分组方式; */ 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); } |
|
|
|
只有小组成员才能发言,加入小组>>
1905个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36355 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4392 浏览 0 评论
6044 浏览 1 评论
6760 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4209 浏览 0 评论
618浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
613浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
603浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
693浏览 2评论
792浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 21:39 , Processed in 0.998345 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号