|
本来不想写这个测试了,在单片机应用中算是比较常规了,后来发现这一版库函数定义还是蛮复杂的,反正比我想的复杂。尤其是中断这块还得需要熟悉。这个测试为了实现按键中断翻转LED灯。这些资源板卡上都有。原理图截图如图1所示:
. _% w: i8 ~/ K5 H
完成这个功能,就是初始化时钟,引脚定义,外部中断,写中断函数,基本就是这样。我研究了一下库函数,宏写的多,觉得读起来和移植都挺复杂的,就给改成原来熟悉的样子了,简化了一下。 GPIO及中断初始化如下: - GPIO_InitStruct.Pin = GPIO_PIN_13;4 k+ S( O' S* |2 q
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;5 Y% v1 S7 w! T; Y
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;, Y' t2 Q a- w& B
- /* Configure Button pin as input with External interrupt */. }( z6 X! r- `6 V; x- u) F5 ]1 z
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;7 a2 H4 l. q( o0 C! }7 k
# p& Q6 I) i0 P4 j- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/ e4 P" a4 j- P" y* u* N - & c) J0 o/ t3 G' A% z) H$ j d
- (void)HAL_EXTI_GetHandle(&hpb_exti, EXTI_LINE_13);
& t: s5 y- T/ q5 f( N9 s: f - (void)HAL_EXTI_RegisterCallback(&hpb_exti, HAL_EXTI_COMMON_CB_ID,0);
' |- `& p( l/ B% ?3 e
- k% B8 p! Q H. ?- /* Enable and set Button EXTI Interrupt to the lowest priority */
3 e7 a3 z2 u+ [( C - HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0x00);: o( R4 l \3 V1 B! Y2 D2 D! ]
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
复制代码 ; k! i: J' W9 E) |; {& n
调用外部中断Callback函数: - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin), ]* }8 r; J4 Q$ i9 Z
- {% Z* d9 \! k6 c d/ a# _/ t
- if (GPIO_Pin ==GPIO_PIN_13)% ^$ V, u- |" X0 {' i% P
- {
% O' d1 q& ^: G( G - // UserButtonStatus = 1;# e& [+ R( Q$ Y
- HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
- Q/ z3 e: T! ]2 ~( Y - }( B% b. }3 }1 F+ J$ d7 c1 Y
- }
复制代码 哦,对了,在初始化main函数中,初始化一下LED引脚的初始状态。 - GPIOA->BSRR = GPIO_PIN_5;
复制代码 这个测试主要就是熟悉外部中断的练习。 ' V. i2 s5 y# r' Z1 q0 D
效果如图2所示:
" W5 g4 m+ H0 t" L+ {* c |