采用德飛萊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. 引腳配置設定和外設配置
本任務所使用的引腳和外設與基礎任務中所使用的相同,是以省去引腳配置設定和外設配置的過程。
1.
輕按兩下進入
2.
3.
4.配置LED燈引腳(PB5)
5. 配置KEY鍵引腳(PE2)
配置上拉、上升沿和下降沿
使能中斷
6.配置時鐘樹
7.改名、儲存、打開
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的閃爍頻率,并重複上述過程。