STM32中断,及FreeRTOS中断优先级配置

发布者:糖果龙猫最新更新时间:2021-01-25 来源: eefocus关键字:STM32中断  FreeRTOS 手机看文章 扫描二维码
随时随地手机看文章

图片

    很多朋友对中断的一些知识还是不了解,今天就写点关于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任务优先级是数值越大,优先级越高。需要和中断优先级区分开来。


关键字:STM32中断  FreeRTOS 引用地址:STM32中断,及FreeRTOS中断优先级配置

上一篇:CRC校验、STM32中CRC计算单元、CRC应用
下一篇:ADC,DMA,多路,单次/连续转换

推荐阅读最新更新时间:2024-11-10 00:16

STM32自学笔记——外部中断
stm32的每个IO口都可以作为外部中断的入口。stm32f103的中断控制器支持19个外部中断/事件请求(question1:外部中断和时间请求的区别?),这19个外部中断中0-15对应外部IO口的输入中断16连接到PVD输出(question2:什么是PVD输出?)17连接到RTC闹钟事件(question3:这有什么意义)18连接到USB唤醒事件(question4:USB唤醒事件是什么?)。由上可以看出stm32供IO的中断线只有16个但是stm32的IO口远远不止16个那么怎么一一对应呢?于是 STM32 就这样设计, GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分别对应中断线
[单片机]
STM32之系统中断处理
点击(此处)折叠或打开 /******************************************************************************* * Function Name : SysTickHandler * Description : This function handles SysTick Handler. * Input : None * Output : None * Return : None **************************************************************************
[单片机]
<font color='red'>STM32</font>之系统<font color='red'>中断</font>处理
STM32 串口 通信 中断
一、数据发送与接收。 (1)、STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。 当向该寄存器写数据的时候,串口就会自动发送; 当收到数据的时候,也是存在该寄存器内。 1)STM32 库函数操作 USART_DR 寄存器发送数据的函数是: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);通过该函数向串口寄存器 USART_DR 写入一个数据。 2)STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_Ty
[单片机]
STM32 外部中断_ 外部中断和事件
1.GPIO 的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO
[单片机]
<font color='red'>STM32</font> 外部<font color='red'>中断</font>_ 外部<font color='red'>中断</font>和事件
stm32专题七:EXTI(二) 外部中断
EXTI外部中断的配置过程: 开启GPIO时钟,初始化要连接的GPIO端口为浮空输入(参考手册); 开启AFIO时钟; 设置IO口与中断线的映射关系,调用函数GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); 初始化EXTI,设置触发条件等; 初始化NVIC(注意,有几个中断就要写几次中断源); 编写中断服务函数; 常见的中断服务函数写法: void EXTI3_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line3)!=RESET) //判断某个线上的中断是否发生 { // 中断逻辑…
[单片机]
STM32外部中断处理流程及注意事项
STM32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。 外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10,Pin0--Pin4有各自独立的中断, Pin5--Pin9共用一个中断,Pin10--Pin15共用一个中断。 中断号 Pin脚 EXTI0 Pin0 EXTI1 Pin1 EXTI2 Pin2 EXTI3 Pin3 EXTI4 Pin4 EXTI9_5 Pin5--Pin9 EXTI15_10 Pin10--Pin15 外部中
[单片机]
STM32中断优先级相关概念与使用笔记
一、基本概念 1.ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK等)也都属于cortex_m3内核的部分。STM32采用了cortex_m3内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是cortex_m3内核的NVIC的子集。 2.STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位,见后面解释)。《参考最新101xx-107xx STM32 Re
[单片机]
STM32中断函数介绍篇
NVIC驱动有很多的用途,如使能或者失能IRQ(中断请求),或者是使能或失能单独的IRQ通道,或者是改变其优先级。以下介绍相关函数的功能和基本用法。 1.NVIC_DeInit函数的功能是将外设NVIC寄存器重设为默认值。 2.NVIC)PriorityGroupConfig函数的功能是设置优先级分组:先占优先级和从优先级,且有一个输入参数是优先级分组的长度 例:定义先占优先级1,从优先级3. NVIC_PriorityGroupConfig(NVICPriorityGroup_1); 3.NVIC_Init函数的功能是根据NVIC_InitStruct里面指定的参数初始化外设NVIC寄存器,其中NVIC_In
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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