STM32開發,使用HAL庫函數外部中斷功能實現按鍵控制LED燈

1 概述

1.1 資源概述

開發板:ST官方NUCLEO-F103RB開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
NUCLEO開發板

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燈亮滅各一次的現象,說明抖動了,執行了兩次中斷。
Button部分原理圖
PC13配置爲中斷模式,下降沿觸發,上拉。
Button設置
中斷分組設置,採用默認設置,搶佔優先級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的上下拉,若爲下降沿觸發,則配置爲上拉。若爲上升沿觸發,則配置爲下拉。否則有可能導致中斷不可用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章