STMCU小助手
发布时间:2022-4-26 23:04
|
简介 本次主要讲解STM32的外部中断以及使用STM32CubeMX编写中断程序,实现按键按下点亮LED灯。+ F+ U! z) u3 r4 C! z+ q STM32的中断介绍& a+ c/ P0 R1 {- ?& I 中断是什么 我们可以暂时认为单片机的执行流程是单向的,这件事做完做下一件事。而中断顾名思义,就是当单片机接收到一个信号后,停下手上的程序,转而去执行中断函数里面的程序,执行完再返回原来程序的位置,继续执行未完成的原程序。(就比如你在打单机,结果舍友说等下要上课,你接收到了这个信息,然后只能把游戏存档,先去上课,上完课再继续读档)5 S& a* w! p& {4 o) F STM32的中断系统; N6 Y/ X0 B3 N- a 几个概念:中断源,中断通道,中断优先级,NVIC(嵌套向量中断控制器),中断服务程序。4 }! [0 `( M7 U0 V J 中断源:* w7 I0 ~1 v. [% g' i& ~2 w1 P 所谓中断源,就是触发中断的方式。即引起中断的事件或原因,或发出中断申请的来源。分内部和外部中断源。3 K; y' S, ^% y: H7 \ 3 K! o9 [# @( q) u 中断通道 STM32的中断系统比51单片机强大的多。8051只有两个外部中断的IO口,而STM32的每一个GPIO都能作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求:) V3 R; `: ~) d: \8 M0 d 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。6 H9 _, M2 F& K! {' M4 G" q 线18:连接到USB唤醒事件。 / `( {% n1 Q9 j* C5 u 每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),* A. U1 Q5 ~+ r+ ^ " x. \. Q4 d2 e4 A) r" w; W( A2 \ STM32F103RCT6(51),那么中断线怎么跟io口对应?
7 `1 B: r8 p$ ` 从图上可以看到每组IO的0引脚都对应EXTI0,1引脚对应EXTI1。。。。。以此类推9 _3 N; E$ Z) ?/ _- W4 o 中断优先级4 x; F* q O( s- _. ~* a) B! V: l 当出现多个中断的时候,单片机要先执行哪个中断呢? 为了解决这个问题,单片机设计了中断优先级来安排每个中断的执行先后顺序,也因此产生了中断嵌套。 32有两个优先级,占先优先级和副优先级。规则如下:* K; J7 C, P! s' i6 [1 v 1.高占先优先级的中断可以打断低占先优先级的中断服务,从而构成中断嵌套。相同占先优先级的中断之间不能构成中断嵌套,只能按先来后到执行。7 ?' |& ~9 v ?5 W- N m 2.副优先级不能中断嵌套,但在占先优先级相同的情况下,优先响应副优先级高的中断。 ( q( ]% G6 M* |" ~* i NVIC(嵌套向量中断控制器) NVIC的作用就是优先级分组(说人话就是,分配有几个占先优先级有几个副优先级)9 s: d1 I' _4 z( c- u' r& \ $ b: d f d: P* t& h
; P- ^5 p0 ], {. j+ u STM32以4个比特位表示中断的抢占优先级和响应优先级。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有2的三次方等于8种级),1位用于响应优先级(优先级有2的一次方等于2种优先级)。) h: e2 o8 N' ?% B; ? 中断服务程序 就是一个函数,里面写你要执行的程序。. s& s6 M2 y9 T8 A: Q& D " z/ `9 u, {" `5 e; i 使用STM32CubeMx编写中断程序的步骤% d+ ~; u1 h! B' T/ l, o) T, | 我们打开上一篇教程的工程,在此基础上增加PA9这个外部中断口。 如图选择IO模式 - F' f+ r, h) N! p; U3 o+ p# b& s
4 }+ ^, r9 {! q% A4 W' F 打开NVIC,勾选EXTI line优先级使能
! W3 Q. g# T0 U( j% x 打开GPIO中的NVIC,发现已经配置好了 / {% K4 G F- H* o: V
$ X& I! y' U c7 i 接下来配置GPIO的模式,选择下降沿触发,依然是推挽输出7 @5 [7 s0 D$ Q- f' ?. U9 @& i , r9 E0 o# g% m" e
9 e/ C+ n. A/ m g: ~' g; d6 j( H 然后生成工程(时钟树之前配置过了). o' g3 L: ~) Z 我们打开工程可以看到在gpio.c文件里面看到,软件已经自动帮我们把IO口配置好了 . v3 v, R, ?9 ~ Z
stm32f1xx_it.c文件里面的EXTI9_5_IRQHandler函数是PA9的中断服务函数。 e. z G; b4 r7 Q* R4 n+ W - h5 s8 q- K, ?7 d* s& S
我们查看HAL_GPIO_EXTI_IRQHandler的定义 0 f! j/ k! Z3 _! K- q/ t$ q N
2 [* H8 }1 e, j q
+ a# l$ w! s) [/ s 从他的程序中我们不难看出HAL_GPIO_EXTI_IRQHandler这个函数是用来清除中断标志位的* O4 p! e* k- a: q$ G& E3 g: O* E 在清除之后,还调用了 HAL_GPIO_EXTI_Callback这个函数。 & J0 C9 f* I; m& Z4 p. {
我们右键跳转到它的定义我们发现,这是一个中断回调函数,而且这个函数里面什么都没有。通过注释的提示我们知道,我们不要在这里就进行修改,而是要在用户文件中重构这个函数。: h) f+ _- W/ I$ I& s6 V 而且有个问题,为什么这个函数前面有一个__weak? (关于__weak修饰符可以看这里链接博文讲的很详细)( d0 N( y6 r7 W0 |4 D$ F 于是我们重新回到main函数,编写了 HAL_GPIO_EXTI_Callback,简单给按键写一下消抖。 ) m' i5 B8 t$ ~# j5 r* O7 g. V
记得把HAL_GPIO_EXTI_IRQHandler函数里面的中断清除语句注释掉,因为我们写在callback函数里面了。) `- Y3 R6 X; o: F& | 实现按键控制数码管。 ) O [" ~' ]9 w- [5 p i6 n" _& c) H5 G9 F5 u3 D |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版