历史上的今天
返回首页

历史上的今天

今天是:2025年01月25日(星期六)

2021年01月25日 | STM32中断,及FreeRTOS中断优先级配置

2021-01-25 来源:eefocus

图片

    很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。


1写在前面

写本文之前,先写点相关的扩展内容。


STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。


可以参看我之前分享文章:从Cortex-M到Cortex-A认识ARM处理器,了解一下关于ARM处理器的种类。


本文主要结合Cortex-M3下面STM32F1系列处理器为例来讲述中断控制相关内容。而Cortex-M其它系列,或者说STM32其它系列关于中断的内容类似。


Cortex-M3只是STM32F1的一个内核。反过来说STM32F1是在Cortex-M3基础上增加了一些外设(如:USART、AD等)的芯片。


2STM32中断控制

NVIC:Nested Vectored Interrupt Controller,即嵌套向量中断控制器。


STM32中NVIC我们比较熟悉,编程的时候使用中断都会对NVIC进行配置。


而STM32F1中的NVIC是属于Cortex-M3中的一部分,而不是STM32增加的外设。


NVIC向量中断控制器是Cortex‐M3不可分离的一部分,它与 CM3 内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。


所以,NVIC相关的寄存器位于Cortex-M手册中。讲述STM32的中断控制,还得从Cortex-M3的NVIC讲起,


1.中断输入向量表

Cortex-M3的NVIC支持1至240个中断输入,比如STM32中xxxIRQs,也就是中断向量表,具体的数值由芯片厂商在设计芯片时决定。


比如STM32F1的中断和异常向量表:

图片

图片


2.中断和异常区别

很多初学的朋友不知道什么是中断?什么是异常?甚至有人直接把中断和异常笼统称为“中断”。


中断和异常其实有差异,也有关联,我们常说的中断其实是包含了异常。异常可以理解为MCU,或者程序处于了某种异常状态。


这么区分吧,看上面向量表,上部分有灰色背景的为异常,下部分白色的为中断。


异常属于Cortex‐M3内核的一部分,而中断属于MCU(STM32)的一部分(由厂家决定)。


所以:

1.站在Cortex‐M3内核角度,像STM32中USART这类中断,属于外部中断。


2.站在STM32角度,EXTI外部引脚中断才属于中断。


3.优先级

对于Cortex-M3来说,每个外部中断都有一个对应的优先级寄存器。


每个寄存器占用8位,但是允许最少只使用最高3位,在STM32F1中使用了高4位。(也就是我们可以分16个优先级)


优先级可以被分为高低两个位段,分别是抢占优先级和亚(响应)优先级。

图片

提示:

1.STM32中断优先级数值越小,优先级越大。


2.优先级分组:Cortex-M3,M4具有分组功能,即存在抢占优先级和响应优先级,如下图:

图片

而有的内核就没有,如Cortex-M0就没有。


3.参考资料

可以参看《Cortex-M3权威指南》


STM32的内核编程手册:

http://www.st.com/stonline/products/literature/pm/15491.pdf


3FreeRTOS中断优先级配置

本节内容讲述一下FreeRTOS最大中断优先级配置问题,也就是FreeRTOSConfig.h配置文件中的:

configMAX_SYSCALL_INTERRUPT_PRIORITY


你们知道配置数值的含义吗?


这里就需要结合NVIC相关的内容来理解。


上面说了,在STM32中,使用了NVIC优先级的高4位,而我们配置时需要对高4位进行配置(低4位未使用)。

图片

看上图,明白了吗,上面这个数值就是95,但代表的优先级为5。


这个配置数值的含义,大概意思是:你代码中使用的中断(比如USART1_IRQn)优先级需要大于5才可行。


如下面配置,优先级为2就不行(当然,有分组的还牵涉到分组问题)。

图片


关于FreeRTOS最大优先级配置的内容可以参考:

https://www.freertos.org/RTOS-Cortex-M3-M4.html


提示:

FreeRTOS任务优先级是数值越大,优先级越高。需要和中断优先级区分开来。


推荐阅读

史海拾趣

问答坊 | AI 解惑

【EEWORLD】救火车和你一起学ARM系列活动之六

IO引脚配置和输入输出实验 在前几个实验中,我们一直在研究ARM核心东西。本次实验,我们要把最基本的外设----IO引脚学习一下。学习中要注意的几个问题:1、定时器时钟源的倍频分频。2、理解匹配及如何产生中断。3、产生中断后,如何跳转到中断函数 ...…

查看全部问答>

王越院士畅谈2009年NEC电子杯出题理念

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 在5月22日新闻发布会上,王越院士表示“今年我们开始强调两个方面的应用。第一个就是做出来的产品的性能价格比应该是比较好的。不能为完成一个比较简单的任务,用一个非常复杂,非常昂贵的小系统合和 ...…

查看全部问答>

求助椭圆滤波器

最近在看DDS,好多资料都采用的是椭圆滤波器,我也想做一个来试试,貌似椭圆滤波器的要求很高,请问做过的大虾们我应该怎样做一个性能好的滤波器呢?采用别的简单的滤波器可以实现么?…

查看全部问答>

大家帮我看看这个异常是怎么产生的?

是SPI初始化代码,也不是每次都会有异常,偶尔重新烧写NK的时候才出现。奇怪这如果错误了,怎么不是每次都出现! 定义: typedef struct __SPIRX_BUFFER_INFO {         ULONG        Read;  &nbs ...…

查看全部问答>

如何判断仪表返回的数据有多少位?

通过串口发送指令,不知道返回的数据有多少位?难道末位有特殊的结束符吗?…

查看全部问答>

请教 编写uart在2410板上运行出现的错误

下面是原程序: #include #include #include #include #include #include #include #define UART_ULCON1     (*(volatile unsigned *)0x50004000) //UART 1 Line control #define UART_UCON1  &nb ...…

查看全部问答>

如何判断串口数据发送完毕

平台:s3c2440 + wince5.0 在串口驱动文件pdds3c2440_ser.cpp中 void    CPdd2440Uart::XmitInterruptHandler(PUCHAR pTxBuffer, ULONG *pBuffLen) {     ......     for (DWORD dwByteWrite=0; dwByteWriteWrite ...…

查看全部问答>

送分!

坐沙发者即送分!…

查看全部问答>

LPC1100大家族

LPC1100家族不断庞大,期待未来更多的型号。 …

查看全部问答>

开关电源适配器12V 2A是个什么意思?

我的理解是,电源输出电压恒定为12V,输出电流视负载大小而定,从0到2A,不知道有没有问题? 如果是这样理解,那么能带的最大负载是12V/2A=6Ω,小于6Ω的负载是否会产生过流保护?如果没有过流保护电路,是否烧电源? 开关电源的过压保 ...…

查看全部问答>