最近,在做一个智能锁的项目,由于,今天碰到了一个关于中断的问题,因此,又回来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。
本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示)
首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。
其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断,ICER用来清除中断,IP用来设置中断优先级。
其次,我们了解一下中断优先级,中断优先级寄存器NVIC_IPRx,本寄存器宽度为8位,原则上每个外部中断可配置的优先级为0~255,实际上精简了,只用到了它的高4位。这4位,又被分成了抢占优先级和响应优先级两组,然后,中断优先级有分为以下几种情况:
1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级数字越小,优先级越高)
2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)
3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)
中断优先级分组,因为中断优先级只使用了高4位,所以,中断优先级的分组分别有以下几种情况:
优先级分组
抢占优先级
响应优先级
描述
NVIC_PriorityGroup_0
0
0到15的取值
高4位全部是响应优先级,无抢占优先级
NVIC_PriorityGroup_1
0到1的取值
0到7的取值
抢占优先级为1位,响应优先级为3位
NVIC_PriorityGroup_2
0到3的取值
0到3的取值
抢占优先级为2位,
响应优先级为2位
NVIC_PriorityGroup_3
0到7的取值
0到1的取值
抢占优先级为3位,响应优先级为1位
NVIC_PriorityGroup_4
0到15的取值
0
高4位全部是抢占优先级,无响应优先级
最后,总结一下中断编程的三步曲:
第一步:使能外设某个中断,具体由对应的中断使能位控制。
(例如:我们使用到GPIO之前必须开启GPIO端口的时钟,用到EXTI必须开启AFIO时钟)
第二步:初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和响应优先级,使能中断请求。
库函数:
NVIC_IRQChannel()设置不同的中断源,在IRQn_Type IRQn结构体寻找自己对应的中断源。
NVIC_IRQChannelPreemptionPriority()设置抢占优先级
NVIC_IRQChannelCmd() 中断使能或者取消使能
第三步:编写中断服务函数,在stm32f0xx_it.c文件中,都有一个根据中断向量表,实现的一个空的中断服务函数,需要我们自己重新编写。
关键字:STM32 中断设置 中断优先级
引用地址:
STM32中断设置以及中断优先级设置
推荐阅读最新更新时间:2024-03-16 16:22
STM32启动过程相关代码分析
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO路径下的文件进行分析。对了,我用的库是3.5的。 system_stm32f10x.c SystemInit(): 在 startup_stm32f10x_xx.s 文件中被调用,功能是设置系统时钟(包括时钟源,PLL系数,AHB/APBx的预分频系数还有 flash的设定),这个函数 会在系统复位之后首先被执行。文件中默认的一些设置:允许HSE(外部时钟),FLASH(允许预取缓冲区,设置2个等待周 期),PLL系数为9,开启PLL并选择
[单片机]
基于STM32单片机低功耗模式机制详细解析
本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32f030f4,CORTEX-M0.封装TSSOP20. 运行模式:内部时钟(HSI),系统时钟频率采用48MHZ。 工作电压:3.3V 芯片具体参数如下: 二、芯片功耗 功耗: 芯片工作模式: 工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。 睡眠模式:只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。 停机模式:1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时
[单片机]
STM32 PWM输出函数
1、参考资料 《STM32F1开发指南-库函数版本》-第14章 PWM输出实验 《STM32中文参考手册V10》-第14章 通用定时器 2、STM32 PWM工作过程 ·STM32 PWM工作过程(通道1为例) CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。 CCMR1: OC1M 位: 对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。 CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打
[单片机]
关于STM32单片机采用CH340串口烧写程序的细节
针对STM32系列单片机,大家一般采用STLink和Jlink来下载程序,这里我们试一下CH340 USB转串口芯片的下载方法,主要是将Boot电平设置好。 采用:STM32F103C6T6芯片microUSB 接口连上电脑,com3端口 环境:Win10,提前安装好CH340/341系列的驱动 针对BOOT0和BOOT1的不同接线方式(高电平,低电平,不接线),开发板的下载情况分析如下图:(“x”代表不接线,“√”代表能成功下载) Boot接线方式 首先对BOOT0与BOOT1如何连接及连接方式介绍一下。 STM32 单片机的BOOT0 和BOOT1 应用原理 STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:
[单片机]
从51到stm32开发入门
本来只是路过,写详细一点。 我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了, 再动手吧。 我做了个实例,不用 ST 的库来点LED,解答你的问题 我的 KeilMDK 3.5 我的 STM32 板子奋斗版是 ,IC 是 STM32F103VET6 调试工具 JLINK V8 LED 接在 PB5 ,高电平点亮 既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?然后查了百度之后又能懂多少? (一)新建 keil 工程,IC选择 ST 公司的 STM32F103VE,keil提示是否copy 启动文件,选择是。 这里
[单片机]
基于STM32的红外遥控重点解析
今天本文有两个内容:一、红外遥控协议的的讲解;二、解码程序解析(参考正点原子的代码) 红外的介绍、优点、缺点就不给大家说了,网上书上都有。。下面进入正题→_→ 一、红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制) 本文将以NEC协议实现红外遥控。 NEC协议的特征: 1、8位地址和8位指令长度; 2、地址和命令两次传输;(确保可靠性) 3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为38KHz 5、位时间为1.125ms和2.25ms
[单片机]
【菜鸟入门】stm32 之 iic
纠结了两天,终于重新开始写了,这两天一直卡在硬件iic上,由于硬件iic是比较难啃的一块骨头,问题一大堆,明明感觉配置好,测试时,一会出这个问题,一会出那个问题,哎,说多了都是泪。。。。 最后木有办法了,总不能吊死在一棵树上吧,然后就写了个模拟的iic的,由于对iic研究和应用的比较多(我们实验室的设备都是iic通信的,所有设备的驱动都是我来写的),所以在搞这个的时候得心应手,一个小时就把所有的搞定了,有花了1个小时把eeprom(at24c02)调通; 我大致测了下,我的板子上的eeprom电路类似这个: 所以我要做的是就是把PB6配置称时钟线SCL,PB7配置成数据线SDA 这里我们再配置输出的时候,要把管脚配
[单片机]
基于STM32的FreeRTOS开发(1)----FreeRTOS简介
为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统。它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务管理功能,可以让您在嵌入式系统中实现多任务环境,这对于涉及多个独立功能的系统是非常重要的。它还提供了一些高级功能,如事件组、信号量、邮箱等,可用于实现任务之间的同步和通信。 FreeRTOS还提供了许多可移植性,可以在各种不同的硬件平台上运行,并且有大量的文档和示例代码可以帮助您快速上手。 总之,FreeRTOS是一个非常受欢迎的嵌入式实时操作系统,因为它简单易用,资源占用小,功能丰富,可移植性好,对于嵌入式
[单片机]