历史上的今天
今天是:2024年12月03日(星期二)
2018年12月03日 | STM32设置中断的步骤
2018-12-03 来源:eefocus
下图概括了STM32F10XXX系列芯片的中断

默认情况下,中断向量表位于Flash等只读存储器内,而且在运行过程中无须修改向量表。中断向量表默认位于存储器的开头(地址0),查阅探索者开发板例程代码也可以发现这一点,在.s启动文件中可以看到:

对应于stm32f4xx.h中的代码:

这么多中断需要通过NVIC(内嵌向量中断控制器)来管理。
设置中断总共分三步:
1.设置中断优先级分组。
//类似于划分“阶级成分”
2.设置某中断的中断优先级
//类似于判定具体的“阶级成分”
3.使能NVIC中的该中断
//类似于“宣布判决”
以下内容摘自 https://www.cnblogs.com/121792730applllo/p/5155368.html
形象化的理解是:
你是上帝,造了N个人,这么多人要分社会阶级和社会阶层了。由于“阶级”的词性比较重,"阶层"比较中性,所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层。
如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15
另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;又有1个人SPI1_IRQChannel,设定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15
SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。
如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
还需要指定他的阶层:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1
另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。
还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
USART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。
以下的类推。
下一篇:STM32中断源位置
史海拾趣
|
项目工程,寻找合作伙伴,大概情况是这样的:ATmel芯片的ARM9200板子已经做好了,可以正常的启动,程序也可以运行。 现在这个板子的USB口可以识别FAT和FAT32格式的硬盘,不能识别NTFS格式的硬盘。板子的上所有的应用程序是在linux2.6 ...… 查看全部问答> |
|
AD summer 库元件界面中的列名如何设置,怎么只有元件名和footprint呢? 我在列名上右击,选择栏,自己把description和library添加进来了。 当时可以用了 但 为什么关了软件,重新打开,“description和library”列就又没有了,只剩下“元件名和footprint”两列了 好苦恼!… 查看全部问答> |
|
【LaunchPad】 MSP430 LaunchPad新手引导贴 最近很多新同学都拿到了团购的开发板,但是很多同学和我一样第一次接触MSP430,拿到板子之后感觉无从下手,但是感谢论坛的各位大大,为我们提供了非常多的资料和教程,所以just follow~~~step1:下载并安装开发环境。MSP430的开发环境有IAR和CCS两 ...… 查看全部问答> |
|
void DispDataWrOneNibble (CPU_INT08U data){ CPU_INT32U value; BSP_LCD_DISP_RW_LO(); ...… 查看全部问答> |
|
求助关于ATMEGA16的TWI的读写问题,请救各位AVR高手 只测试TWI的写的功能,分别写器件地址,寄存器地址,数据三个数,但是从示波器看只看到器件地址和数据的2个数据,看不到寄存器地址这是为什么呢?????求各位高手解答#include <iom16v.h>#include <macros.h>void I2C_init(){ TWS ...… 查看全部问答> |
|
结束了嵌入式生涯,现在改行了,以前的东西会慢慢被淡忘,真滴好担心,因此每天晚上都抽时间温习下,让自己每天都进步,我把自己的总结贴出来跟大家一起分享: 1.arm上wince的移植概要 需要的仅仅是bsp包,常常由厂家提 ...… 查看全部问答> |
|
看到这个nW级的定时器,我在想是不是用它做唤醒时钟是不是比430内部时钟更低功耗 这应该算是一个传统器件,就是一个定时器(1-64s),大家大可不必觉得诧异。 功耗做到了30nA,感觉我是没法测试的。 下面是基本的参数,温度范围不错,基本接近汽车级 (科普一般的定义:商业级(0~70摄氏度)、工业级(-40~85摄氏度)、汽车 ...… 查看全部问答> |




