STM32開發,使用HAL庫函數外部中斷功能實現按鍵控制LED燈
1 概述
1.1 資源概述
開發板:ST官方NUCLEO-F103RB開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
1.2 引腳資源分配
序號 | 引腳 | 資源 | 備註 |
---|---|---|---|
1 | PA13 | SWDIO | SWD輸入輸出信號 |
2 | PA14 | SWDCLK | SWD時鐘信號 |
3 | PC13 | BUTTON | 用戶按鍵配置爲中斷 |
4 | PA5 | LED2 | 指示燈 |
1.3 中斷概述
外部中斷/事件控制器框圖
優先級分組可以設置爲5種方式。分別是1個搶佔優先級/16個子優先級到16個搶佔優先級/1個子優先級。
1.4 實現功能
實現功能:
1、上電初始化後,LED2燈亮。
2、若按鍵被按下,觸發外部中斷,則將LED2燈狀態翻轉。
2 軟件開發
2.1 CUBEMX配置
Button部分原理圖如下,PC13爲低輸入有效。電路中與按鍵並聯的100nF是按鍵消抖用,使用正點原子的開發板沒有此電容,會出現按一次,LED燈亮滅各一次的現象,說明抖動了,執行了兩次中斷。
PC13配置爲中斷模式,下降沿觸發,上拉。
中斷分組設置,採用默認設置,搶佔優先級0,子優先級0。
中斷優先級說明,線10到線15使用同一個中斷優先級,PC13對應的是線13。
位置 | 優先級 | 優先級類型 | 名稱 | 說明 | 地址 |
---|---|---|---|---|---|
40 | 47 | 可設置 | EXTI15_10 | EXTI線[15:10]中斷 | 0x0000_00E0 |
2.2 程序代碼
生成程序代碼,系統自動對LED2和Button進行了初始化,並對Button對應的中斷進行了分組和使能。
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = Button_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
在main函數中增加初始化LED2,讓上電初始化時亮燈。
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);//上電初始化將LED2燈點亮
增加中斷回調函數,當檢測到中斷時執行中斷回調函數,翻轉LED2燈的狀態。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中斷回調函數,當有中斷髮生時,將LED2燈進行翻轉
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}
while(1)函數保留爲空,編程到此完成。
實現過程分析。
1、在stm32f1xx_it.c中定義了EXIT15-10中斷服務函數。
void EXTI15_10_IRQHandler(void)//中斷處理函數,當檢測到中斷,即Button被按下時,檢測到下降沿即爲有效
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
2、在stm32f1xx_hal_gpio.c中定義了HAL_GPIO_EXTI_IRQHandler。
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* 檢測到了中斷 */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中斷狀態
HAL_GPIO_EXTI_Callback(GPIO_Pin);//調用回調函數
}
}
3、在main函數中定義了回調函數HAL_GPIO_EXTI_Callback。
4、當Button被按下時,1到3會依次執行。
3 實現結果
上電後LED燈常亮,當有按鍵按下時,LED翻轉狀態。黑色按鍵是復位鍵Reset,藍色按鍵是用戶按鍵(PC13 Button)。
Tips:在使用中斷時請務必配置好gpio的上下拉,若爲下降沿觸發,則配置爲上拉。若爲上升沿觸發,則配置爲下拉。否則有可能導致中斷不可用。