看到一个交流群在讨论关于【关于STM32中断优先级的话题】,其中就有小伙伴提到:为什么有些STM32中断没有【子优先级】? 比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级】:
然而,有时候你会发现又有Sub Priority【次优先级】:
这个问题就牵涉到STM32,准确的来说的是 Cortex-M NVIC嵌套向量中断控制器的问题。
下面就展开来说说关于ARM单片机NVIC的内容。
关于Cortex-M的NVIC
NVIC:Nested Vectored Interrupt Controller,嵌套向量中断控制器。 在每个Cortex-M内核中都有这么一个NVIC嵌套向量中断控制器,当MCU使用的内核不同,其中的NVIC也可能不同。 比如,Cortex-M0和Cortex-M3内核中NVIC功能就不同。 其中,中断优先级分组功能就不同。 Cortex-M0的NVIC没有优先级分组功能,Cortex-M3、 M4、M7有分组功能。
所以,你在使用STM32CubeMX配置时,M0/M0+内核的STM32是没有【次优先级】那个选项的。 Cortex-M0包含STM32F0、L0、G0等处理器。 对底层感兴趣的朋友可以继续往下看。
NVIC寄存器
NVIC寄存器,需查看对应的内核(Cortex-M)手册,在ARM官网能找到(M3也有对应的中文翻译版,大家可以自己网上搜索)。 内核中的寄存器和我们STM32参考手册中寄存器一样,不同的Bit位代表含义不同。 但是,对于NVIC来说,由于包含众多优先级相关配置,寄存器数量相对较多(NVIC寄存器族)。
拿M3来说,优先级分组的配置,位于NVIC的AIRCR应用程序中断及复位控制寄存器中:
这里推荐阅读之前我写过的一篇文章:Cortex-M中断在RTOS中的应用及注意事项
中断入口
额外提下一个小伙伴问的问题:为什么外部中断8和9都使用同一个中断?
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
/* 代码 */
EXTI_ClearITPendingBit(EXTI_Line8);
}
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
/* 代码 */
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
我想,这个问题应该不难。好比一个main程序入口,进入之后需要处理很多事情,只是在里面需要区分事件。 很多外设中断,都会使用同一个中断入口,有一个原因:节约中断入口资源分配。 像USART发送和接收中断,TIM不同通道捕获中断等。
关键字:STM32 中断
引用地址:
STM32中断没有子优先级?
推荐阅读最新更新时间:2024-11-07 11:33
TQ2440按键中断
有几点需要注意: 1、需要调用MMU函数,实现内存的映射; 2、在中断触发跳入中断处理函数后,首先要清除SRCPND和INTPND相应的位,如果用到次级中断源,如这里用到了EINT4_7中的EINT4,就要清除EINTPEND相应的位。一般来说,应该先清除次级中断源相应的位,再清除中断源,否则中断源会发生多次中断。在完成清除后再进行具体的处理。 #include def.h #include option.h #include 2440addr.h #include 2440lib.h #include 2440slib.h #include mmu.h #define LED1 (1 5) //must be (
[单片机]
stm32ADC的DMA模式
//变量定义 __IO uint16_t ADCConvertedValue ; //ADC 外设的数据寄存器 #define ADC1_DR_Address ((uint32_t)0x4001244C) //ADC_DR(ADC规则数据寄存器),偏移量=0x4c ADC1(0x40012400-0x400127ff) //ADC1_GPIO配置 void ADC1_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure PC.01 (ADC Channel11) as analog inpu
[单片机]
如何创建一个STM32工程模板
一。开发环境和固定库版本 二。准备工作 三。建立工程模板 1. 建立一个Template的文件夹 2.在Template文件夹下建立下面3个文件夹 CORE 用来存放核心文件和启动文件, OBJ 是用来存放编译过程文件以及 hex 文件, STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括 system_stm32f10x.c 等等。 3. 在STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver 下面,将目录下面的 src
[单片机]
利用STM32单片机串口发送字符串
最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。 其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。 //程序功能:利用串口发送一个字符串 // 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6) str 需要发送的字符串 #include “stm32f10x.h” void Usart_SendString(USART_TypeDef* US
[单片机]
STM8S208R8的第七个程序---定时中断
#include iostm8s208r8.h #define LED PC_ODR_ODR1 void GPIO_INIT()//PC1推挽输出 { PC_DDR_DDR1=1; PC_CR1_C11=1; LED=1;//先熄灭LED } void TIM2_INIT() { TIM2_PSCR_PSC=11;//计数器时钟F_CLK=F_CPU/2的PSC次方,此处是2的11次方 TIM2_ARRH=0X03;//自动重装载高8位 TIM2_ARRL=0XE8;//自动重装载低8位TIM2_ARR=0X03E8=1000,即计数1000次产生一次中断 TIM2_IER_UIE=1;//允许中断更新 TIM2
[单片机]
STM32 USB 设备音频数据流
音频数据流的应用 音频数据流是没有任何压缩的音频数据,我们可以直接通过I2S传输到数字功放,也可以对这些数字音频进行处理,比如EQ音量控制、音质补偿等等。 典型应用举例 首先是PC,然后PC通过USB数据线连接到MCU,MCU再通过I2S输出到功放,最后连接到喇叭或耳机。 当然,还有GUI的部分显示可以控制,同时还可以通过麦克风把音频传输到PC进行刻录或保存。 同步问题 USB外设时钟、I2C外设时钟和外部功放时钟是同步的,因为它们共用一个时钟域,但不能同步PC的时钟域。 这些不同的时钟域将会造成音频的不同步,出现断音或丢失部分音频。 主要问题 1. USB的参考时钟(SOF)并不跟系统时钟同步,主要表现在三个方面
[单片机]
循迹小车计数器0中断的编写
一,对于中断的理解 CPU在处理某一时间A时,发生了另一事件B请求CPU迅速去处理(发生中断),CPU暂时中断当前工作,转去处理事件B(中断响应和中断服务),待CPU将时间B处理完毕后,再回到原来事件A被中断的地方继续处理(中断返回)。 以循迹小车的左转中断为例 CPU在处理循迹程序时,中断左转请求CPU迅速去处理,CPU暂时停止处理循迹程序,转去处理中断左转,待CPU将该程序处理完毕后,再回到循迹程序中断的地方继续处理循迹程序
[单片机]
STM32 PWM问题
本文不提供完整程序,仅点出要点 1:时钟配置。因为PWM输出属于复用功能,所以时钟使能必须使能RCC_APB2Periph_AFIO ; 2:IO口使能。因为PWM属于复用功能,所以IO输出设置要配置成GPIO_Mode_AF_PP;而不能配置成普通输出IO的GPIO_Mode_OUT_PP模式; 3:PWM初始化代码如下,本程序只用通道3输出,所以pwm输出只配置了通道3,TIM_OC3Init(TIM3, &TIM_OCInitStructure);需要多通道输出PWM则需要配置多个PWM输出通道,通过改变TIM_Pulse 的值可以改变pwm的占空比(可以通过直接操作寄存器TIM3- CCR3=2400来实现)。 /* Ti
[单片机]