STM32中断优先级实例

发布者:Shuangfei最新更新时间:2024-10-17 来源: cnblogs关键字:STM32  中断优先级 手机看文章 扫描二维码
随时随地手机看文章

本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。


设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。


这3个中断的优先级设置如下:

  EXTI Line3: PreemptionPriority = PreemptionPriorityValue

              SubPriority = 0

  EXTI Line4: PreemptionPriority = 0

              SubPriority = 1           

  SysTick Handler: PreemptionPriority = !PreemptionPriorityValue

                   SubPriority = 0   

初始时,PreemptionPriorityValue的值为0,这意味着外部中断线路3(EXTI Line3)有着比SysTick中断更高的优先级。

在外部中断线路4的中断中,程序交换EXTI Line和SysTick中断的优先级。

  1. /*******************************************************************************

  2. * Function Name : EXTI4_IRQHandler

  3. * Description : This function handles External interrupt Line 4 request.

  4. * Input : None

  5. * Output : None

  6. * Return : None

  7. *******************************************************************************/

  8. void EXTI4_IRQHandler(void)

  9. {

  10. NVIC_InitTypeDef NVIC_InitStructure;


  11. if(EXTI_GetITStatus(EXTI_Line4) != RESET)

  12. {

  13. PreemptionPriorityValue = !PreemptionPriorityValue;

  14. PreemptionOccured = FALSE;


  15. /* Modify the EXTI3 Interrupt Preemption Priority */

  16. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;

  17. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;

  18. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  19. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  20. NVIC_Init(&NVIC_InitStructure);


  21. /* Configure the SysTick Handler Priority: Preemption priority and subpriority */

  22. NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0);


  23. /* Clear EXTI Line4 pending bit */

  24. EXTI_ClearITPendingBit(EXTI_Line4);

  25. }

  26. }

在外部中断线路3的中断中,程序设置SysTick中断的pending比特,这样,如果SysTick中断的优先级较高,他就会被打断,反之则不会。

  1. /*******************************************************************************

  2. * Function Name : EXTI3_IRQHandler

  3. * Description : This function handles External interrupt Line 3 request.

  4. * Input : None

  5. * Output : None

  6. * Return : None

  7. *******************************************************************************/

  8. void EXTI3_IRQHandler(void)

  9. {

  10. /* Generate SysTick exception */

  11. NVIC_SetSystemHandlerPendingBit(SystemHandler_SysTick);


  12. /* Clear EXTI Line3 pending bit */

  13. EXTI_ClearITPendingBit(EXTI_Line3);

  14. }

在SysTick中断中,程序检查是否中断是由打断外部中断线路3的中断进入的,如果是,把PreemptionOccured的值置为True。

  1. /*******************************************************************************

  2. * Function Name : SysTickHandler

  3. * Description : This function handles SysTick Handler.

  4. * Input : None

  5. * Output : None

  6. * Return : None

  7. *******************************************************************************/

  8. void SysTickHandler(void)

  9. {

  10. /* If the EXTI3 IRQ Handler was preempted by SysTick Handler */

  11. if(NVIC_GetIRQChannelActiveBitStatus(EXTI3_IRQChannel) != RESET)

  12. {

  13. PreemptionOccured = TRUE;

  14. }

  15. }

当PreemptionOccured的值不为False时,连接在PC.04 – PC.07上的4个LED开始闪耀。

  1. while (1)

  2. {

  3. if(PreemptionOccured != FALSE)

  4. {

  5. GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_4)));

  6. Delay(0x5FFFF);

  7. GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_5)));

  8. Delay(0x5FFFF);

  9. GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));

  10. Delay(0x5FFFF);

  11. GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

  12. Delay(0x5FFFF);

  13. }

  14. }

综上所述,运行程序结果如下:

刚下载进去程序,按key2是不会有LED闪耀的,因为SysTick中断的优先级比外部中断线路3优先级低,如果先按key3,交换EXTI Line和SysTick中断的优先级,则再按key2时候PreemptionOccured的值被置为True,LED闪耀。再次按key3的话,又交换一次,SysTick中断的优先级变低,key2的中断不会被被SysTick中断打断,4个LED停止闪耀。

1. 当第一次外部中断线路4的中断发生后,SysTick中断的优先级变得比外部中断线路3的优先级高,因此,一旦发生外部中断线路3的中断,它将被SysTick中断打断,PreemptionOccured的值被置为True,4个LED开始闪耀。

2. 再次发生外部中断线路4的中断,PreemptionOccured的值被置回False,SysTick中断的优先级变得比外部中断线路3的优先级低,因此,一旦发生外部中断线路3的中断,它不会被SysTick中断打断,4个LED停止闪耀。

以上2种情况会循环发生。


关键字:STM32  中断优先级 引用地址:STM32中断优先级实例

上一篇:STM32低功耗Demo
下一篇:STM32入门-时钟篇

推荐阅读最新更新时间:2024-11-20 15:08

STM32开发笔记95: 处理UNUSED宏
单片机型号:STM32F091RCT6 使用C语音在PlatformIO中进行STM32Cube的工程设计,一切正常,希望使用C++语音进行程序开发,顾将main.c文件改为main.cpp文件,再次编译报如下警告: In file included from C:userssnmplink.platformiopackagesframework-stm32cubef0DriversSTM32F0xx_HAL_DriverInc/stm32f0xx_hal_rcc.h:45:0, from C:userssnmplink.platformiopackagesframework-stm32cubef0Dri
[单片机]
串口屏与stm32串口通信
串口屏与单片机的发送与接收 一.串口向单片机发送 (使用串口屏和上位机软件USART HMI) 1.波特率初始化 2.按钮控件 printh 01 二.单片机接收串口屏数据与发送给串口屏 1.单片机配置 2. 配置代码 3. 与串口通信函数 串口屏发送的 1,2,3会发送至 order里,调用order即可 单片机发送给串口屏函数: ①printf( page0.t0.txt= 111 xffxffxff );//page0页的 t0文本控件变为111 ②printf( page0.t0.txt= %d xffxffxff ,order);//传变量给t0文本控件
[单片机]
STM32应用与存储位置无关
1、前言 最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。 2、分析 在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应
[单片机]
让<font color='red'>STM32</font>应用与存储位置无关
基于STM32的CMMB智能网络监测系统的设计与实现
中国移动多媒体广播(CMMB)是我国自主研发的、具有完全自主知识产权的移动多媒体广播标准。目前,全国各大城市的CMMB网络正在建设和完善当中,而CMMB信号的覆盖测试为网络优化和调整提供了重要的数据依据。数字电视广播网络的建设是一个长期复杂的过程,需要经过不断地调整和优化才能达到一个理想的效果。而只有有效、精确的网络覆盖测试才能为调整、优化提供可靠的依据。一个成熟稳定的CMMB网络覆盖测试系统,对于CMMB的发展具有重大意义。因此,有必要设计一款针对CMMB网络的覆盖测试系统。 本设计基于高性能单片机STM32和GPRS无线通信方案实现了对测试点CMMB网络覆盖情况的实时监测,并利用GPS接收器将测试终端的地理位子信息上传到服
[单片机]
基于<font color='red'>STM32</font>的CMMB智能网络监测系统的设计与实现
stm32 TIM2定时器触发ADC、DMA采样
使用ADC的定时器触发ADC转换的功能,然后使用DMA进行数据的搬运!采用TIM2定时器的触发间隔,实现ADC定时采样转换的功能,然后可以在程序的死循环中一直检测DMA转换完成标志,然后进行数据的读取,或者使能DMA转换完成中断,这样每次转换完成就会产生中断。 做示波器时,由于要做调整横坐标显示倍数增大和缩小,故需要改变采样频率,也就是改变TIM2 的定时器时间间隔,在TIM2初始化函数定义时,添加u16 Value参数,第一次调试时,设置如下: 定时器2初始化函数void TIM2_Configuration(u16 Value),配置TIM_Period = Value - 1; TIM_TimeBaseStructu
[单片机]
CORTEX-M3与STM32_M3内核STM32的三相多功能电能表解决方案
电能表作为电能计量的基本设备,受到国家电力部门的长期重视,电能表生产企业更是不遗余力地寻求设计与开发性能俱佳且成本更低的解决方案。目前国内的电能表设计已经走过了由8位MCU向通用DSP甚至专用DSP的变革,通用DSP的应用方案的劣势在于DSP的专业应用和嵌入程度不够深的问题,成本偏高;而专用 DSP功能相对固定,这样给电能表设计和生产厂家带来功能差异化空间不足的困难。基于ARM的方案也已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的ARM9系统的复杂程度很高,成本也较高。选择一颗合适且低成本的微处理器日益成为电能表行业的关键所在,直到意法半导体公司(STMicroelectronic公司,下
[单片机]
CORTEX-M3与STM32_M3内核<font color='red'>STM32</font>的三相多功能电能表解决方案
STM32 官方固件库简介
ARM公司为了能让不同的芯片公司生产的Cortex-M3芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准CMSIS标(CortexMicrocontrollerSoftwareInterfaceStandard),翻译过来是“ARMCortex?微控制器软件接口标准”。ST官方库就是根据这套标准设计的。 CMSIS分为3个基本功能层: 1)核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数。 2)中间件访问层:定义访问中间件的通用API,也是ARM公司提供。 3)外设访问层:定义硬件寄存器的地址以及外设的访问函数。 CMSIS层在整个系统中是处于中间层,向下负责与内核和各个外设直接
[单片机]
基于STM32 MCU的太阳能-LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等
[电源管理]
基于<font color='red'>STM32</font> MCU的太阳能-LED街灯解决方案
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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