使用STM32CubeMX開發(fā)三:按鍵中斷實(shí)驗(yàn)
硬件平臺:stm32F407Zet6
軟件平臺: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、引腳和時鐘如下圖所示:
注意,由于按鍵上有上拉電阻,這里選擇中斷模式的時候,我們選擇下降沿觸發(fā)中斷。
第二步,配置輸出Keil工程
第三步、編寫程序下載驗(yàn)證
STM32CubeMx把代碼都生成了,查找函數(shù),分析調(diào)用的過程,添加應(yīng)用層代碼就行
首先在stm32f4xx_it.c文件中查找,所有的中斷函數(shù)都是放在這個文件中的,代碼如下:
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);
}
可以看出,這四個按鍵的中斷觸發(fā)后首先會調(diào)用這個函數(shù),這個函數(shù)有調(diào)用HAL_GPIO_EXTI_IRQHandler,再看一下這個函數(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ā)生的時候會調(diào)用HAL_GPIO_EXTI_Callback();程序中只給出了一個虛函數(shù),需要重新實(shí)現(xiàn)它,在main.c添加如下代碼,來重新實(shí)現(xiàn)這個函數(shù),來完成功能:
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ā)生的時候就反轉(zhuǎn)燈的狀態(tài)。