STM32
登录
直播中
席毖庸
7年用户
1028经验值
擅长:596874
私信
关注
[问答]
小白求助,求大佬分享stm32标准库外部中断的知识点
开启该帖子的消息推送
小白求助,求大佬分享
STM32
标准库外部中断的知识点
回帖
(1)
刘艺星
2021-11-17 10:11:00
首先贴出工程
工程上传到了我的github上了,点此进入
我用的外部中断引脚是PA9,LED引脚是PC13,芯片是stm32c8t6。
首先我的程序是借鉴官方SDK而来
怎么移植我就不说了,抄作业大家都熟。。。
接下来看我写的工程
相对于上一节改变的地方我用红圈圈出来了,关于添加头文件路径和c文件请自行百度,这个我不讲。
可以看到,主程序里面就只有三个初始化,我来一 一解读。
首先NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);这是一个中断优先级的分组(什么是中断优先级也请自行了解),stm32的中断优先级的分组方式有四种,这四种在源码里解释的很详细。
也就是说,stm32有一个八位的空间来表示优先级,且可以通过不同的分组来表示优先级的表示方式。很明显,这里有俩种优先级,抢占优先级和响应优先级,执行遵循下面的话。
1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级数字越小,优先级越高)
2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)
3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)
这是非常重要的,中断之间的嵌套效果会十分影响程序的运行,引起不必要的阻塞导致运行崩溃。
然后是外部中断有关的初始化
这实际上可分为三步
首先初始化引脚,然后初始化外部中断,最后设置外部中断优先级并且使能中断
初始化引脚需要注意
引脚设置为输入模式,且不要设置为浮空状态,上拉或者下拉输入(这个根据外部中断的触发方式来决定)
如果设置为浮空,则会有误判产生。
如果是下降沿触发,则设置上拉输入
如果是上升沿触发,则设置下拉输入
外部中断初始化需要注意
首先要使能引脚的时钟为复用时钟,然后EXTI_InitStructure.EXTI_Line代表我们的中断路线,32每个端口有15个引脚,每个不同编号的引脚代表不同的中断路线,这里我用的是PA9引脚,所以对应的是
EXTI_Line9。
中断优先级注意
标准库的优先级数字越高优先级越低,并且我用的是NVIC_PriorityGroup_0,所以PreemptionPriority这个设置没什么意义,SubPriority = 0表示响应优先级最高
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;这句话也很重要,我们来看看中断向量表
所以大家应该理解这里为什么会设置为EXTI9_5_IRQn了。
最后就是我们的中断服务函数了
中断服务函数于中断向量表是对应的,可以理解为,中断向量表里的那些就是指向中断服务函数的
简单地做了一个led闪烁的例子。里面的消抖和清楚中断标志位我就不说了。
说一下现象和做一个说明
PC13接led,PA9作为外部中断输入,当PA9捕捉到一个上升沿的时候,led会翻转。
注意我是上升沿触发中断
然后我的中断分组为NVIC_PriorityGroup_0,这实际上是一个不当操作,它不允许中断嵌套,所以在外部中断的时候其它中断是没法嵌入的,而这个里面又有一个消抖的操作占用了5ms时间,这5ms所有其它程序都处于阻塞状态也就是没法运行,这是不理智的,中断里阻塞的时间尽量不要超过1ms。而当我允许嵌入的话,其它中断在这5ms里是可以响应的,只是会阻塞主循环而已。这个留个自己思考。。。
首先贴出工程
工程上传到了我的github上了,点此进入
我用的外部中断引脚是PA9,LED引脚是PC13,芯片是stm32c8t6。
首先我的程序是借鉴官方SDK而来
怎么移植我就不说了,抄作业大家都熟。。。
接下来看我写的工程
相对于上一节改变的地方我用红圈圈出来了,关于添加头文件路径和c文件请自行百度,这个我不讲。
可以看到,主程序里面就只有三个初始化,我来一 一解读。
首先NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);这是一个中断优先级的分组(什么是中断优先级也请自行了解),stm32的中断优先级的分组方式有四种,这四种在源码里解释的很详细。
也就是说,stm32有一个八位的空间来表示优先级,且可以通过不同的分组来表示优先级的表示方式。很明显,这里有俩种优先级,抢占优先级和响应优先级,执行遵循下面的话。
1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级数字越小,优先级越高)
2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)
3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)
这是非常重要的,中断之间的嵌套效果会十分影响程序的运行,引起不必要的阻塞导致运行崩溃。
然后是外部中断有关的初始化
这实际上可分为三步
首先初始化引脚,然后初始化外部中断,最后设置外部中断优先级并且使能中断
初始化引脚需要注意
引脚设置为输入模式,且不要设置为浮空状态,上拉或者下拉输入(这个根据外部中断的触发方式来决定)
如果设置为浮空,则会有误判产生。
如果是下降沿触发,则设置上拉输入
如果是上升沿触发,则设置下拉输入
外部中断初始化需要注意
首先要使能引脚的时钟为复用时钟,然后EXTI_InitStructure.EXTI_Line代表我们的中断路线,32每个端口有15个引脚,每个不同编号的引脚代表不同的中断路线,这里我用的是PA9引脚,所以对应的是
EXTI_Line9。
中断优先级注意
标准库的优先级数字越高优先级越低,并且我用的是NVIC_PriorityGroup_0,所以PreemptionPriority这个设置没什么意义,SubPriority = 0表示响应优先级最高
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;这句话也很重要,我们来看看中断向量表
所以大家应该理解这里为什么会设置为EXTI9_5_IRQn了。
最后就是我们的中断服务函数了
中断服务函数于中断向量表是对应的,可以理解为,中断向量表里的那些就是指向中断服务函数的
简单地做了一个led闪烁的例子。里面的消抖和清楚中断标志位我就不说了。
说一下现象和做一个说明
PC13接led,PA9作为外部中断输入,当PA9捕捉到一个上升沿的时候,led会翻转。
注意我是上升沿触发中断
然后我的中断分组为NVIC_PriorityGroup_0,这实际上是一个不当操作,它不允许中断嵌套,所以在外部中断的时候其它中断是没法嵌入的,而这个里面又有一个消抖的操作占用了5ms时间,这5ms所有其它程序都处于阻塞状态也就是没法运行,这是不理智的,中断里阻塞的时间尽量不要超过1ms。而当我允许嵌入的话,其它中断在这5ms里是可以响应的,只是会阻塞主循环而已。这个留个自己思考。。。
举报
更多回帖
rotate(-90deg);
回复
相关问答
萌新
求助
,
求
大佬
分享
STM32
的TIM延时的
知识点
2021-11-16
741
萌新
求助
,
求
大佬
分享单片机的
知识点
2021-10-18
1195
萌新
求助
,
求
STM32
外部
中断
管理的
知识点
2021-11-18
443
小白
求助
,
求
大佬
分享C51复习纲要及核心模块
知识点
总结
2021-10-20
577
求
大佬
分享
STM32
HAL
库
中定时
中断
和编码输入的
知识点
2021-11-16
881
萌新
求助
,
求
大佬
分享
STM32
f103串口
中断
及其配置的
知识点
2021-11-17
679
外部
中断
的
知识点
汇总,绝对实用
2022-01-21
863
萌新
求助
,
求
大佬
分享
STM32
F4定时器的
知识点
2021-11-16
628
小白
求助
,
求
STM32
外部
中断
函数
2021-11-18
418
stm32
外部
中断
与定时器
中断
的
知识点
汇总
2021-11-24
1056
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分