刚开始学习STM32单片机时,对中断优先级的规则不是很明白,通过今天的学习,对这方面的内容有了新的了解,记录下来以便日后查看。
首先说一下STM32的中断:
STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个)
中断的管理方法:
1.首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置:
即设置优先级分组:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
2.然后对单个的中断进行抢占优先级和响应优先级设置:
typedef struct
{
uint8_t NVIC_IRQChannel; //设置中断通道
uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级
uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级
FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
对于某些刚学习的人来说对设置分组这一措施不太明白其意义,这里我就说一下我的理解(分组的意义):分组之后,IP的位也就分配完毕了,原本IP就只有4位,一位上有两种状态,也就是0和1,2^4 = 16,也就是有16级可编程优先级,分组后,抢占优先级的位数和响应优先级的位数确定,即可配置各个中断的优先级,另一方面也说明了,分组之后不要轻易再改变分组,否则设定好的各个中断抢占优先级和响应优先级就会改变。
关键字:STM32 中断优先级
引用地址:
STM32中断优先级--学习心得
推荐阅读最新更新时间:2024-03-16 16:03
STM32的官方库函数调用
例如添加 #include stm32f10x.h 添加stm32f10x_gpio.c、stm32f10x_usart.c 再在stm32f10x_conf.h 中去掉相应的头文件注释
[单片机]
关于STM32单片机GPIO口上拉与下拉输入
以前GPIO上接的电路都是低电平触发的那种,新画了个板子有一个按键设计的是高电平触发,结果IO口设置成上拉输入后,怎么读都不正确,按键电路如图1。无奈只能去调试一下,发现当设置为上拉输入后,其ODR(GPIO输出数据寄存器)相应的也置为1,百思不得其解。 图1 按键电路 于是去看一下GPIO的结构图: I/O引脚结构图 由图可以发现其实输出寄存器与输入寄存器之间在I/O引脚处是线与状态,在GPIO设置成上位输入时,其上拉电阻闭合,这时如果输出寄存器设置为0那么在IO口内部就会自己损耗电流,而这些电流的损耗是会增加功耗的。因此当GPIO设置成上拉输入时,相应的输出寄存器也设置为1. 将按键电路与I/O
[单片机]
STM32中断NVIC部分知识总结
1.assert_param 实际上assert_param是一个宏定义,在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。当参数无效时,assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误。 2.NVIC_TypeDef结构体成员: (1)ISER (Interrupt Set Enable Register)中断使能,ISER 的bit0~bit31对应中断0~31,ISER 的bit0~bit27对应中断的32~59,置1对应中断被使能;(还要分组、屏蔽、IO映射) (2)ICER (Clear),置1有效; (3)ISPR (Set Pending)置1正在执行的对应中
[单片机]
stm32 SD卡
容量等级 SD容量有8MB、16MB、32MB、64MB、128MB、256MB、512MB、1GB、2GB SDHC容量有2GB 、4GB、8GB、16GB、32GB SDXC容量有32GB、48GB、64GB、128GB、256GB、512GB、1TB、2TB SD卡寄存器 命令格式 所有命令均遵守此格式,总共48位。一个起始位,一个方向位,6个命令位,32位参数(有些命令需要),CRC 7位校验,1个停止位 Command Classes 注: 命令详细解释见SD卡2.0协议 部分命令 应答 应答格式有多种,以R1举例 初始化流程 以SPI模式举例 典型初始化流程 1.使能SPI时钟 2.使能GPIO
[单片机]
STM32超声波测距
超声波测距模块是HC-SR04,C-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测 距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。 HC-SR04基本工作原理: (1)采用IO口TRIG触发测距,给最少10us的高电平信呈。 (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。 程序编写思路是:1、配置好使用到的GPIO以及定时器; 2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时
[单片机]
STM32 外部中断 易出错总结
前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark。 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发; 二:外部中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。 STM32 分组和对应中断处理函数分配: 管脚 中断标志
[单片机]
STM32什么时候使用AFIO?
什么时候要开启AFIO呢?参考手册: 说的很明白,操作AFIO的三类寄存器时需要开启: AFIO_EVCR AFIO_MAPR AFIO_EXTICRx 这三类其实是AFIO的全部寄存器, AFIO_EVCR是事件相关的,AFIO_MAPR是与重映射相关的,AFIO_EXTICRx是与外部中断相关的。 因此管脚重映射、外部中断、事件时开启AFIO。
[单片机]
STM32输入捕获,实现红外解码,支持长按
初始化代码: static void RCC_Configuration( void ); static void GPIO_Configuration( void ); static void NVIC_Configuration( void ); void InputCaptureInit( void ) { TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; RCC_Configuration(); NVIC_Configuration(); GPIO_Conf
[单片机]