前言
本文将说明在FreeRTOS嵌入式操作系统中,如何设置STM32 Cortex M3和M4系列MCU的中断优先级。
总结
【1】STM32L1系列,STM32F1系列,STM32F4系列,设置NVIC时需要使用NVIC_PriorityGroup_4。
【2】抢占优先级的要比“MAX”更大,而比“LOWEST”更小。例如
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY=5
configLIBRARY_LOWEST_INTERRUPT_PRIORITY=15
那么NVIC抢占优先级设置的具体值应该比MAX=5更大(包括等于),比LOWEST=15更小(包括等于),也就是说5,6,7,8,9,10,11,12,13,14,15肯定是合法值。
【3】FreeRTOS中,数值越大优先级越高,这种优先级可以成为逻辑优先级。Cortex M3/M4中断中,数值越大优先级越低,这种优先级成为中断优先级。两者相反,所以才会出现比"MAX"更大而比“LOWEST”更小的情况。
示意代码
【FreeRTOSConfig.h】
/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* Priority 5, or 95 as only the top four bits are implemented. */
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
【NVIC设置】
【示例A】
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = XXXX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
【示例A】
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = XXXX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY-1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
参考博文
【FreeRTOS STM32移植笔记】
【FreeRTOS学习笔记——任务间使用队列同步数据】
【FreeRTOS学习笔记——二值型信号量】
【FreeRTOS学习笔记——互斥型信号量】
【如何在FreeRTOS下实现低功耗——MSP430F5438平台】
参考资料
【1】http://www.freertos.org/RTOS-Cortex-M3-M4.html
关键字:FreeRTOS CortexM3 中断优先级
引用地址:
FreeRTOS CortexM3 M4中断优先级设置总结
推荐阅读最新更新时间:2024-03-16 15:34
【STM32】中断和中断优先级理解
在嵌入式系统开发过程中,不可避免的会和“中断”打交道。很多初学者对中断的理解不深,往往是看到中断绕着走。其实不然,费点时间搞懂中断能解决不少问题。 中断英文“Interrupt”,字面很好理解,就是打断的意思。在程序中“Interrupt”打断的自然也是程序。举个例子,有一个遥控的自动避障小车,小车在向前跑的过程中程序一直监测周围环境,实现避障功能,这个时候你想遥控小车停个三分钟,就要用到中断了,也就是打断原有的“监测环境——避障”程序流程。打断的目的就是执行“别跑啦,停下来歇歇”这个程序,我们称中断之后执行的程序为“中断服务函数”。一般情况下,中断服务函数执行完后(小车休息三分钟,或者干其他的事情完事后),会清理一下中断
[单片机]
STM32开发笔记41: 移植FreeRTOS程序后,编译报错的解决方法
单片机型号:STM32F070F6P6 项目希望使用FreeRTOS操作系统,将其移植到自己的工程中后,编译保存,如下图所示。 这个问题,我在https://blog.csdn.net/qingwufeiyang12346/article/details/79782075日志中已经介绍过,在这次移植的开始时,也希望仍然采用原先的方法加以解决,但是涉及到的语句非常多,更改起来非常麻烦。解决这个问题的另外一种方法是,去除CPP11编译,但如果这样就不能使用C++语言。所以还需使用静态库的方法加以解决,具体的就是将FreeRTOS涉及到的所有源文件,去除CPP11编译后,用C99编译为静态库,与其它C++写的程序进行链接使
[单片机]
新唐ARM Cortex- M0/M4 MCU新品发表会
台湾新竹-11/05/2013-新唐科技自2010年成功推出以ARM® Cortex™-M0 为内核的32位微控制器 - NuMicro™ 家族后,持续在高性价比微控制器解决方案上开发新产品,迄今已发表多款市场耳熟能详的NUC100、M051、Mini51、Nano100 超低功耗等系列。今年新唐将再度发表多款性能增强之新系列产品:高性能多管脚M058S系列、带内嵌2.0 B标准双CAN (Controller Area Network) 控制器局域网络总线与多组UART串口之NUC230/240系列、最佳成本优势低管脚Mini51F系列与带LCD之超低功耗Nano112系列。且将正式发表基于ARM® Cortex™-M4 内核 3
[单片机]
【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
15.1 注意事项(重要必读) 1、学习本章节前,务必保证已经学习完毕前面章节。另外,工程代码注释已经比较详细,了解了框架后,直接看源码即可。 2、仅支持800*480分辨率显示屏,如果是电容屏,无需校准。如果是电阻屏,需要校准,按下按键K1即可进入校准界面。 3、由于按键不够用,K1按键的消息处理做了三个条件编译,详情见本章15.6小节。默认K1按键执行触摸校准,也可以选择执行截图或者串口打印任务执行情况。另外,不管当前处于任何界面都可以进行触摸校准,仅电阻屏需要校准,电容屏无需校准。 4、STemWin5.40版本的截图功能有bug,详情看此贴: http://forum.armfly.com/forum.ph
[测试测量]
东芝推出TXZ+TM族高级系列基于Arm® Cortex®-M4的新款M4G组MCU
东芝推出TXZ+TM族高级系列中用于高速数据处理基于Arm® Cortex®-M4的新款M4G组微控制器 中国上海,2021年9月8日——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,已开始量产M4G组中用于高速数据处理的20种新器件。M4G组是TXZ+TM族高级系列的新成员,采用40nm工艺制造。这些产品采用带FPU的Arm Cortex-M4内核,运行频率高达200MHz,内部集成2MB代码闪存和32KB数据闪存,具有10万次的写入周期耐久性,此外还提供了丰富的接口和通信选项。因此,M4G组器件非常适用于办公设备、楼宇和工厂自动化应用。 M4G组中的微控制器配置增强型的通信功能,除UART、FUART、TS
[单片机]
【STM32】NVIC中断优先级管理(中断向量表)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F103系列上面,16个内核中断(异常)不变,而可屏蔽中断只有60个(在107系列才有68个)。 注意一下:CM3的外部中断和STM32的外部中断不是一个概念。CM3:除了内核异常之外的都是外部中断;STM32:外部中断EXTI只有6个
[单片机]
STM32中断优先级分组概念
在进行STM32f103的时候,进行中断分组的相关概念 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级 可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种: NV
[单片机]
MCS-51系统中断优先级的软扩展
摘要:鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库实现,为该方法的使用赋予友好、简洁的用户接口。
关键词:MCS-51单片机 中断优先级 软扩展 C51
引言
众所周知,MCS-51系统只提供“二级中断嵌套”,而大多数嵌入式系统希望有多于两级的优先级别。因为一般来说,系统都有掉电中断,且应置为最高优先级,这样所有其它中断只能共用一个最低优先级,如此,往往不能满足实际的逻辑需求。为了使系统具有多于两级的中断优先级别,可以利用8259A之类的中断控制芯片实现中断优先
[应用]