历史上的今天
返回首页

历史上的今天

今天是:2025年03月07日(星期五)

正在发生

2018年03月07日 | STM32 中嵌套向量中断控制的理解

2018-03-07 来源:eefocus

    一、STM32 (Cortex-M3) 中的优先级概念

    STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

    1. 何为占先式优先级(pre-emption priority)


    高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。

    2. 何为副优先级(subpriority)

    在占先式优先级相同的情况下,高副优先级的中断优先被响应;

    在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。

    3. 判断中断是否会被响应的依据

    首先是占先式优先级,其次是副优先级;

    占先式优先级决定是否会有中断嵌套;

    Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。

    4. 优先级冲突的处理

    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

    5. Cortex-M3中对中断优先级的定义

    既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

    所有8位用于指定响应优先级

    最高1位用于指定抢占式优先级,最低7位用于指定响应优先级

    最高2位用于指定抢占式优先级,最低6位用于指定响应优先级

    最高3位用于指定抢占式优先级,最低5位用于指定响应优先级

    最高4位用于指定抢占式优先级,最低4位用于指定响应优先级

    最高5位用于指定抢占式优先级,最低3位用于指定响应优先级

    最高6位用于指定抢占式优先级,最低2位用于指定响应优先级

    最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

    这就是优先级分组的概念。

    6. stm32中对中断优先级的定义

    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:

    第0组:所有4位用于指定响应优先级

    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

    第4组:所有4位用于指定抢占式优先级

     

     

    AIRC(ApplICation Interrupt and Reset Register)寄存器中有用于指定优先级的 4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下:

    /* Preemption Priority Group */

    #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority

    4 bits for subpriority */

    #define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority

    3 bits for subpriority */

    #define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority

    2 bits for subpriority */

    #define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority

    1 bits for subpriority */

    #define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority

    0 bits for subpriority */

    可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

    NVIC_PriorityGroup_0 => 选择第0组

    NVIC_PriorityGroup_1 => 选择第1组

    NVIC_PriorityGroup_2 => 选择第2组

    NVIC_PriorityGroup_3 => 选择第3组

    NVIC_PriorityGroup_4 => 选择第4组

    接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

    // 选择使用优先级分组第1组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    // 使能EXTI0中断

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    // 使能EXTI9_5中断

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    --------------------------------------------------------------------------------

    要注意的几点是:

    1. 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

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

    3. 如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

    二、开关总中断

    在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

    PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。

    FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

    在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

    下面两个函数等效于关闭总中断:

    void NVIC_SETPRIMASK(void);

    void NVIC_SETFAULTMASK(void);

    下面两个函数等效于开放总中断:

    void NVIC_RESETPRIMASK(void);

    void NVIC_RESETFAULTMASK(void);

    上面两组函数要成对使用,但不能交叉使用。

    例如:

    第一种方法:

    NVIC_SETPRIMASK(); //关闭总中断

    NVIC_RESETPRIMASK();//开放总中断

    第二种方法:

    NVIC_SETFAULTMASK(); //关闭总中断

    NVIC_RESETFAULTMASK();//开放总中断

    常常使用:

    NVIC_SETPRIMASK(); // DISAble Interrupts

    NVIC_RESETPRIMASK(); // Enable Interrupts

    -------------------------------------------------------------------------------------------------

    补充:

    可以用:

    #define CLI() __set_PRIMASK(1)

    #define SEI() __set_PRIMASK(0)

    来实现开关总中断的功能。


推荐阅读

史海拾趣

Exar [Exar Corporation]公司的发展小趣事

2017年,Exar被MaxLinear公司收购,这是Exar发展历程中的一个重要里程碑。通过合并,Exar和MaxLinear的产品和技术得到了有效整合,两家公司在模拟和混合信号领域的优势得到了进一步加强。合并后的公司继续在通信、视频处理、存储、电源管理和时钟管理等多个领域发挥重要作用。

Altmustech公司的发展小趣事

随着业务规模的不断扩大,Altmustech开始实施全球化布局战略。公司在全球范围内设立研发中心和生产基地,与各地合作伙伴建立紧密的合作关系。这一战略使得公司能够更好地利用全球资源,提高生产效率,降低成本,同时也有助于提升公司在国际市场上的竞争力。

宜源科技(ETERNAL)公司的发展小趣事

面对日益严峻的环境问题,宜源科技公司积极响应国家环保政策,致力于绿色环保和可持续发展。公司采用先进的生产工艺和设备,减少生产过程中的污染排放。同时,宜源科技还积极推动绿色产品的研发和推广,为客户提供更加环保、节能的电子产品解决方案。这些努力不仅有助于保护环境,也为公司的可持续发展奠定了基础。

Future Designs, Inc. (FDI)公司的发展小趣事

在快速发展的同时,FDI也注重可持续发展。他们致力于环境保护和社会责任,积极采用环保材料和节能技术,减少生产过程中的资源消耗和污染排放。同时,FDI还关注员工的发展和福利,为员工提供良好的工作环境和培训机会,激发员工的创造力和创新精神。展望未来,FDI将继续秉承“创新、服务、质量、诚信”的核心理念,不断推动技术进步和产品升级,为电子行业的发展贡献更多的力量。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

ERNI公司的发展小趣事

20世纪70年代,ERNI开始实施全球化战略。他们意识到,只有不断扩大市场份额,才能确保公司的长期稳定发展。因此,ERNI开始在欧洲、北美和亚洲等地设立销售处和生产基地,为全球客户提供创新且高品质的产品。这一战略的实施,不仅使ERNI的销售额大幅增长,还进一步巩固了其在全球连接器市场的领先地位。

问答坊 | AI 解惑

专业人员教授如何测试MP3音质

前言 随着市场的发展,现在的MP3播放器品种越来越多,价钱也越来越实惠。也越来越多的MP3进入了用户的口袋。可以说是MP3随身听丰富了个人的世界,能随时随地随心所欲地欣赏美妙音乐。作为随身听,MP3的最终目的是还原真实的音乐。作为音响爱好者, ...…

查看全部问答>

低频数字式相位测量仪

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 低频数字式相位测量仪  …

查看全部问答>

看到一个好玩的:屁强度探测器

探测的依据是    声音  温度  浓度 …

查看全部问答>

有人熟悉NTFS格式么?

最近做一个项目,需要支持移动硬盘,移动硬盘大部分都是NTFS的格式,但是目前维护的FAT文件系统不支持, 有没人熟悉NTFS的,可以请教下…

查看全部问答>

wince中分割窗体

用vs2005开发wince sdi程序,发现没有CSplitterWnd这个类,应该如何实现分割窗体呢?…

查看全部问答>

windows xp 与 windows ce 嵌入式系统的usb通信

现有一个条形码识别掌机, 掌机系统为 windows ce.net 6.0, 有usb接口。 将掌机usb接口直接与windows vista电脑相接,不需要任何操作就可以实现通信。 但将掌机与windows xp相接,用了很多方法都不行,比如安装一个activesync 4.5,在连接 ...…

查看全部问答>

USB接口主,从控制器有什么不同?

可用于主控制的接口有CH375,SL811,还有吗?用于从控制的就多了,如PDIUSBD12,还有MCU内置,如C8051F340就内置USB控制器. 这写USB从控制器能用作主控制器吗?谢谢!…

查看全部问答>

不知道为什么uart无法使用

库文件完全一样,示例代码能运行,但是即使把示例代码完全复制到自己的工程中都不能输出正确的结果。复制到自己的项目中后,完全相同的代码但是编译后的大小要比demo工程直接编译的大一点点。一直到不到哪里出了问题。有人遇到过吗?或者给点查错的 ...…

查看全部问答>

武林学习LM3S811(五)中断按键

参考周立功的实例,实现按键中断翻转LED的功能。为的下次触摸芯片驱动做准备。 工程:…

查看全部问答>

新一代FPGA设计学习工具:Robei

美国Robei公司开发了一套全新的FPGA设计仿真工具,现在在教育界和工业界引起巨大的反响。 下面是这个软件的简单介绍: Robei FPGA仿真软件是一款世界上最小的FPGA仿真工具。该软件具备先进的图形化设计工具,代码修改,Verilog编译仿真和波形分析 ...…

查看全部问答>