STMCU小助手
发布时间:2022-4-30 21:55
|
概述6 e% D1 h( o6 t0 X' }- E- W3 q 外部中断和事件控制器 (EXTI) 管理外部和内部异步事件 / 中断,并生成相应的事件请求到CPU/ 中断控制器和到电源管理的唤醒请求。本例程主要讲解如何使用外部中断触发LED。( X8 P9 Y2 B- t1 [) Y/ j4 ] 硬件准备% B9 `; a9 S$ z! s% ~7 m 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 5 B) i' M# U& P4 f
选择芯片型号" i; j2 L3 {! h* t 使用STM32CUBEMX选择芯片stm32f030r8,如下所示:. a5 C% W4 G' v; P ~( L) @0 a- {
- t2 f& ?* v0 a9 z) b 配置时钟源' Z2 E' s$ K: D) {6 i HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:8 Q, F3 E6 R W( U: h9 ^3 u* f" n % ?9 ?2 m; O% r% h" f4 f( z
配置时钟树 STM32F0的最高主频到48M,所以配置48即可: $ C9 Z! {6 b( k/ Z! q
4 v3 O/ e9 y( a& t) ~ 中断口配置 开发板上的PC13为蓝色按钮,故配置此端口为中断口。4 @% |$ m# l) H2 o; u0 Y . _5 J/ `$ j% F. c! c, f1 c4 k
/ H1 x1 C- o1 k& o; ]! w GPIO 口连接到 16 个外部中断 / 事件线如下图 。可以看到PC13应该是在EXTI13上。6 g: U4 K; g/ L% A 4 f/ Y, _7 }6 D1 p2 m$ A/ s" e
外部中断/事件控制器用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请求的状态线。
1 c% m. s9 K- W( G 所以需要配置中断口是上升沿触发或者下降沿触发。( f6 @, B0 C: \5 ~9 g9 {- p z* G & q" ]/ P) R; u; D/ |/ W/ { P4 K \7 ~
查看向量表可以得知PC15应该开启EXIT4到15的中断。 5 D: V: J( k# f. g
GPIO配置3 K+ U$ k- ?- b4 R4 h; u0 J6 w0 K PA5为板上LED灯,配置PA5为输出口,当中断发生时候改变IO口极性。
% K, M/ C6 _) m+ [; ?* t+ J- a, l2 y 生成工程设置! S5 G, |8 ^5 f 注意在生产工程设置中不能出现中文,不然会报错。
; z- v5 h6 x5 D ^( J 生成代码( } N* D; J( ^9 g% [0 w' n
配置keil$ x1 @( B% Z) q q. s( o/ j5 V
设置IO口模式,触发条件,设置 IO 口与中断线的映射关系4 m5 ^- Y' U7 C 首先在mian.c的MX_GPIO_Init中,GPIO_Initure.Mode=GPIO_MODE_IT_RISING,这里设置为上升沿触发。Mode值为GPIO_MODE_IT_RISING(外部中断上升沿触发),GPIO_MODE_IT_FALLING(外部中断下降沿触发)或者GPIO_MODE_IT_RISING_FALLING(外部中断双边沿触发)。 GPIO_InitStruct.Pull=GPIO_NOPULL,这个为管脚悬空,没有上下拉。" {; R# c, i/ u 3 b# }+ ` J: e
配置中断优先级(NVIC),并使能中断. U! f. | d6 d4 c2 h# P1 \ 同样的,在mian.c的MX_GPIO_Init中,设置好中断线和 GPIO 映射关系,然后又设置好了中断的触发模式等初始化参数。既然是外部中断,涉及到中断我们当然还要设置 NVIC 中断优先级。 HAL_NVIC_SetPriority的中间0表示抢占优先级为0,最右边的0表示子优先级为0。# w; N9 |8 c$ S$ O0 r% V( P & c- k; }8 o+ h+ @ 1.抢占优先级比子优先级的优先权更高,这意味抢占优先级更高的中断会先执行,而不管子优先级的优先权,数值越低优先级越高。5 a0 g2 s! s* P0 B* e0 S2 n: Z 2.同理,如果抢占优先级相同,那么就会比较子优先级,子优先级更高的中断将会先被执行,数值越低优先级越高。 3.当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
中断服务函数 配置完中断优先级之后,接着要做的就是编写中断服务函数。中断服务函数的名字是在 HAL 库中事先有定义的。STM32F0的IO口外部中断函数只有3个。 6 H% s* }# O7 e/ h' v5 H8 |! ] ) ~' s3 @3 t; v4 h2 |+ k5 q- h4 L 中断线 0-1每个中断线对应一个中断函数,中断线 2-3共用中断函数 ,中断线 4-15 共用中断函数。一般情况下,我们可以把中断控制逻辑直接编写在中断服务函数中,但是 HAL 库把中断处理过程进行了简单封装。6 B4 N! ?, L9 i7 n; e! O* f% ? . {+ H; R% i$ S$ R1 \: \; a EXTI4_15_IRQHandler 在stm32f0xx_it.c中,程序开始执行EXTI4_15_IRQHandler函数,EXTI4_15_IRQHandler函数只是调用了另一个函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
1 {- ^8 \* R4 d8 X1 c9 l- h HAL_GPIO_EXTI_Callback" I' u3 F+ X. i- w: d/ t" n @ 在stm32f0xx_hal_gpio.c中,HAL_GPIO_EXTI_IRQHandler该函数实现的作用非常简单,就是清除中断标志位,然后调用回调函数HAL_GPIO_EXTI_Callback()实现控制逻辑。根据函数名Callback也能看出来这里才是真正执行具体功能的函数,该函数需要在mian.c文件中重写,通过判断中断是来自哪个IO口编写相应的中断服务控制逻辑。 ! J1 W; P7 C- Q8 _; I
代码 在main.c中,重写HAL_GPIO_EXTI_Callback。/ E% a4 O& `* ]' H# A$ N$ c , s2 v1 m H/ i8 w# m G
5 \0 E; C) T0 K+ A- e 演示效果 LED灯随着按键按下改变极性。 7 C) J) @$ O. V- A1 I9 a
|
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版