二、stm32标准库外部中断

首先贴出工程
工程上传到了我的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里是可以响应的,只是会阻塞主循环而已。这个留个自己思考。。。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值