天天看點

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

采用德飛萊STM32闆,主要晶片STM32F103ZET6。

任務内容:利用按鍵B1控制訓示燈LD2的閃爍頻率,閃爍頻率設定為3檔:初始狀态時,LD2按照2Hz的頻率閃爍;第一次按鍵後,LD2按照10 Hz的頻率閃爍;第二次按鍵後,LD2按照20Hz的頻率閃爍。再次按鍵後讓LD2恢複以2Hz的頻率閃爍,并重複上述過程。按鍵的檢測采用中斷方式。

硬體原理:按鍵B1由引腳PC13控制:按鍵按下時為下降沿觸發方式,釋放時為上升沿觸發方式。訓示燈LD2由引腳PA5控制;PA5輸出高電平,開啟訓示燈;PA5輸出低電平,關閉訓示燈。

任務實作

1. 設計思路

采用前背景程式設計模式:定義一個全局變量BlinkSpeed,初始化為0。在外部中斷服務程式(前台程式)中修改BlinkSpeed的值;在主程式(背景程式)的while(1)循環中不斷檢測BlinkSpeed的值,根據取值的不同修改訓示燈的閃爍頻率。

2. 引腳配置設定和外設配置

本任務所使用的引腳和外設與基礎任務中所使用的相同,是以省去引腳配置設定和外設配置的過程。

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率
【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

1.

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率
【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

輕按兩下進入

2.

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

3.

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

4.配置LED燈引腳(PB5)

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

5. 配置KEY鍵引腳(PE2)

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

配置上拉、上升沿和下降沿

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

使能中斷

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

6.配置時鐘樹

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

7.改名、儲存、打開

【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率
【學習記錄】STM32中斷進階任務:按鍵控制訓示燈閃爍頻率

3. 程式編寫

生成MDK工程後,進行應用程式的編寫。具體代碼如程式代碼段1和2所示。

代碼段1:

/* USER CODE BEGIN PV */
volatile uint8_t BlinkSpeed = 0;// 訓示燈閃爍頻率:0->2Hz 1->10Hz  2->20Hz
/* USER CODE END PV */
/* ………………………… */ // 省去中間部分代碼 
/* Infinite loop */
/* USER CODE BEGIN WHILE */ 
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if( BlinkSpeed == 0) // 2Hz 閃爍頻率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(500);
		}
		else if( BlinkSpeed == 1 ) // 10Hz 閃爍頻率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(100);
		}
		else							 // 20Hz 閃爍頻率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(50);
		}
		
  }
  /* USER CODE END 3 */
           

程式解釋:

① 第2行定義了一個變量 BlinkSpeed,用來存放訓示燈的閃爍頻率:BlinkSpeed為0表示2 Hz的閃爍頻率;BlinkSpeed為1表示10Hz的閃爍頻率;BlinkSpeed為2表示20 Hz的閃爍頻率。由于變量BlinkSpeed在中斷服務程式中修改,在主程式中判斷。為了避免變量被編譯器優化,在變量定義時,添加了關鍵字 volatile 來修飾。

② 第11~25行是while(1)循環中報執行的代碼。采用if-else if-else的多分支語句,通過判斷BlinkSpeed的取值來改變訓示燈的閃爍頻率:當BlinkSpeed為0時,設定閃爍頻率為 2 Hz,即延時時間為500ms;當BlinkSpeed為1時,設定閃爍頻率為10Hz,即延時時間為100ms;當BlinkSpeed為2時,設定閃爍頻率為20Hz,即延時時間為50ms。

代碼段2:

/* USER CODE BEGIN 4 */
/*
 * @brief ExTI line detection callbacks.
 * @param GPIO_Pin: Specifes the pins connected EXTI line
 * @retval None
*/

void HAL_GPIO_EXTI_Callback(uint16_t GPI0_Pin)
{
	
	if(GPIO_PIN_2 == GPI0_Pin) // 判斷發生外部中斷的 GPIO 引腳
	{
		BlinkSpeed++; // 修改 BlinkSpeed 變量的值 
		if( BlinkSpeed == 3) // 判斷是否完成一次循環
		{
			BlinkSpeed = 0;
		}
	}
}
/* USER CODE END 4 */
           

程式解釋:

在外部中斷回調函數中對變量Blink ASpeed加1,并判斷BlinkSpeed的值是否等于3。如果等于3,則對BlinkSpeed清零,重新開始下一輪的循環。

運作結果:

将程式編譯連結,生成可執行代碼,通過ST-Link仿真器下載下傳到開發闆上可以觀察到:上電後,訓示燈LED2按照2Hz頻率閃爍。按下按鍵B2後,訓示燈LED2閃爍頻率加快,照10Hz頻率閃爍。再下按鍵B1後,示燈LED2閃爍頻率更快,按照20 Hz頻率閃爍。第三次按下按鍵後,訓示燈恢複到2 Hz的閃爍頻率,并重複上述過程。