第三章:STM32CubeMx外部中断基本使用方法 第一步: 现在STM32CubeMx 中配置所需要IO口外部中断模式: 单击对应IO口左键-->GPIO_EXTI 第二步: 配置中断触发模式 GPIO-->GPIO_mode GPIO--> GPIO Pull-up/Pull-down 这里以外部中断模式/下降边缘触发检测,默认上拉( Pull-up) 为例 第三步: 配置中断优先级: NVIC(嵌套向量中断控制器)-->EXTI line interrupts 根据自身需要配置中断优先级 到这里STM32CubeMx 就配置完成了,之下来分析STM32CubeMx生成的源码 先看一下GPIO的初始化函数; - static void MX_GPIO_Init(void)
2 T* \# \ V) t# z/ n - {
4 M# o' ?/ p9 D7 z0 S9 b - GPIO_InitTypeDef GPIO_InitStruct = {0};
/ K) Z3 L9 E; ~
# u% H( U, p" x- /* GPIO Ports Clock Enable */% G D' [5 ~. h. }* ~
- __HAL_RCC_GPIOA_CLK_ENABLE();
- X7 j2 ]3 W% T9 j$ n6 \5 l - 0 F3 _; N4 P$ k2 s/ N9 c
- /*Configure GPIO pin Output Level */
6 N% H' E& m+ D$ R - HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高# P/ N$ o, T0 Z* M; U
3 u5 E3 M( z: l5 B- /*Configure GPIO pin : PA8 */
- M) M" ^5 S& s3 H5 I* u' b
0 b% c8 {9 O9 T1 _' q" k& @- GPIO_InitStruct.Pin = GPIO_PIN_8;//配置GPIO_PIN_8 l9 t* b1 o7 G. E
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //外部中断模式/下降边缘触发
9 Y$ Q' C9 A3 P1 O$ P3 ? \6 P3 r - GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
; L E) q$ g, ^* [# [' N. H - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);- c! R1 |1 f) {& m
5 e/ ?! ^; q5 e; m; @9 A, x7 ?- /*Configure GPIO pins : PA9 PA10 */2 @+ X8 ?' _, f+ ~, o( L' V$ }
- GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//配置GPIO_PIN_9/GPIO_PIN_10: i/ U/ M, }, n4 q+ J: O" r3 u
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;/外部中断模式/下降边缘触发* L6 J1 g' _, j3 w
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉, H4 r" J7 t' X3 u* h* V9 s
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);* Q( O8 j" A0 V! @5 z
) ^. n/ X6 Z4 j; Y9 V$ r: q. N3 B- /*Configure GPIO pin : KEY1_Pin */
2 j- o2 m6 c/ A: D - GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚
# O! A7 i" [+ q - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为输入模式) M7 m/ i7 c" g% c4 D" v
- GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉输入2 b0 a# T4 C6 d, B& O
- HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
0 m! _* }1 U' C I - ! j% U8 l8 ?5 U! R6 D( J' O5 j
- /*Configure GPIO pin : LED1_Pin */& d+ L* p0 y5 @4 r; i, ?
- GPIO_InitStruct.Pin = LED1_Pin;//初始化LED1引脚
3 c% A' S8 t. [/ `0 e3 P& {/ Z - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式: d# n2 ^* e% G9 Q* Y8 @! \
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出1 K$ V6 q3 Z! `) j
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式$ h# \: s% Q4 p/ q/ q. ~5 s6 S* |
- HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);! A- s- }3 G; @1 m3 r- O
- 8 l4 }/ G/ E3 f. d: |) @
- /* EXTI interrupt init*/
. g+ D, U; A1 F" ^" j$ F - HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
& Q4 s- Y# p8 ]+ U: }; O - HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
6 ?& C& J; C y3 f' o& g
+ v7 p0 T) i$ L2 g* w- HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
0 r& D) z4 }& C2 ` - HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);4 m; x8 D, K" v* V$ r# a% w
- }
\' j. n; s b6 X- h7 k$ [& d - ; g, J6 g v! R) o3 K
复制代码
- x/ t+ `; t$ K) l/ ^接下来开始编写中断服务函数: - //这里中断服务函数写在BEGIN 4,也可以写在其他可编辑的代码区域中,这里不明白的可以看前面几章的说明' R& G1 m: k( `& ~* X2 X
- /* USER CODE BEGIN 4 */ 4 o" t2 E4 S( c* Z @, X
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); U: F, w: {: o; p. s7 {! o
- {/ P; ?" ?7 t, }( C8 F- {1 `
- switch(GPIO_Pin) //扫描是哪个中断源触发的中断
# O" o) }+ P+ ^+ i% c- U% r* j - {7 |6 y7 ?8 ?7 X7 N9 i2 {
- case GPIO_PIN_8: //如果是GPIO8' n" j0 _2 W+ P# m; X6 w, ]
- {& p D+ d( n6 d7 X: U& w
- for(uint16_t i=0;i<2000;i++); //消抖一下
' k; }6 Z# V0 g - if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)) //再次确认一遍GPIO8是否拉低;% Q$ ^* _) y" O' f9 y
- {- c8 |7 I3 ^7 O. c+ `. I2 t
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //如果是,LED1 输出高电平,+ V+ P) r" Y, p7 z' @4 D
- }
6 j1 S2 k+ r/ Q1 _, y - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8); //清除外部中断标志位0 s5 x" b) K/ ^: M% U
- break;, ^/ @ ], D# G4 f
- }
, v3 Z3 [( g# b( U9 J4 S - case GPIO_PIN_9: //如果是GPIO9
9 `# U) j/ V1 J$ O- C8 V - {. i8 k4 P% K$ S/ W, s: M7 p0 _9 x
- for(uint16_t i=0;i<2000;i++); //消抖一下# |! g5 I' m# i$ J0 x7 f2 n8 }1 V O
- if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)) //再次确认一遍GPIO9是否拉低;
7 x2 U8 s {3 G9 z0 o - {6 h9 t; i/ e' B
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //如果是,LED1 输出低电平,' u( G' v6 A0 U2 g Y
- }: J( e! V" I/ }# m4 X# I2 C
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9); //清除外部中断标志位$ P: z: O8 k1 Z
- break;
& f- j0 Y, T) K- L - }
$ T5 C8 E& j- N" D - case GPIO_PIN_10: //如果是GPIO10
5 R4 R* m; ~' N& a6 r - {3 D" [7 h3 u8 x. M' K! W
- for(uint16_t i=0;i<2000;i++); //消抖一下& ^ s: O% l9 Z* ~) a
- if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)) //再次确认一遍GPIO10是否拉低;& C1 [1 w6 z( C
- {1 N6 J& g) d7 i1 V* z
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //如果是,翻转LED1输出电平,6 P7 F q B0 o. J3 o% _
- }
% r/ ~" b2 w5 G' ?; w8 ^ - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10); //清除外部中断标志位* T; d: y) B: v d. T
- break;
9 l2 w6 q. F, u) _0 R' L - }
. B! F, Y: Q* x O2 b3 \. S - default:break;6 l! J6 F5 N; Q1 l! l
- }
5 ^+ b# c- O6 ]5 m( c+ R7 g, x - }
`* _5 f7 R1 p& G - /* USER CODE END 4 */
复制代码
4 G z( f3 ]/ p4 G' u7 T. R
& i" L4 |0 L# C [/ u! h% W$ s如果能理解到这里,恭喜你已经学会了外部中断的基本操作! 文章出处: 电子爱好者
. r( p1 J5 J$ y, B( S" [) \3 S |