使用STM32CubeMX開(kāi)發(fā)三:按鍵中斷實(shí)驗(yàn)
硬件平臺(tái):stm32F407Zet6
軟件平臺(tái):stm32cubeMX 4.7+MDK5.14
電路連接:PE8-LED0、PE9-LED1、PE10-LED2、PE11-LED3、PE12-KEY0、PE13-KEY1、PE14-KEY2、PE15-KEY3
第一步、使用stm32cubeMX創(chuàng)建工程,選擇相應(yīng)的芯片,配置RCC、SYS、引腳和時(shí)鐘如下圖所示:
注意,由于按鍵上有上拉電阻,這里選擇中斷模式的時(shí)候,我們選擇下降沿觸發(fā)中斷。
第二步,配置輸出Keil工程
第三步、編寫程序下載驗(yàn)證
STM32CubeMx把代碼都生成了,查找函數(shù),分析調(diào)用的過(guò)程,添加應(yīng)用層代碼就行
首先在stm32f4xx_it.c文件中查找,所有的中斷函數(shù)都是放在這個(gè)文件中的,代碼如下:
voidEXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
}
可以看出,這四個(gè)按鍵的中斷觸發(fā)后首先會(huì)調(diào)用這個(gè)函數(shù),這個(gè)函數(shù)有調(diào)用HAL_GPIO_EXTI_IRQHandler,再看一下這個(gè)函數(shù)的原型
voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
__weakvoidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)
{
}
根據(jù)程序可以知道,當(dāng)中斷發(fā)生的時(shí)候會(huì)調(diào)用HAL_GPIO_EXTI_Callback();程序中只給出了一個(gè)虛函數(shù),需要重新實(shí)現(xiàn)它,在main.c添加如下代碼,來(lái)重新實(shí)現(xiàn)這個(gè)函數(shù),來(lái)完成功能:
voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)
{
switch(GPIO_Pin)
{
caseGPIO_PIN_12:LED0_Toggle();break;
caseGPIO_PIN_13:LED1_Toggle();break;
caseGPIO_PIN_14:LED2_Toggle();break;
caseGPIO_PIN_15:LED3_Toggle();break;
default:break;
}
}
這樣就實(shí)現(xiàn)了當(dāng)按鍵中斷發(fā)生的時(shí)候就反轉(zhuǎn)燈的狀態(tài)。