采用德飛萊STM32板,主控芯片STM32F103ZET6。
任務(wù)內(nèi)容:利用按鍵B1控制指示燈LD2的閃爍頻率,閃爍頻率設(shè)置為3檔:初始狀態(tài)時,LD2按照2Hz的頻率閃爍;第一次按鍵后,LD2按照10 Hz的頻率閃爍;第二次按鍵后,LD2按照20Hz的頻率閃爍。再次按鍵后讓LD2恢復(fù)以2Hz的頻率閃爍,并重復(fù)上述過程。按鍵的檢測采用中斷方式。
硬件原理:按鍵B1由引腳PC13控制:按鍵按下時為下降沿觸發(fā)方式,釋放時為上升沿觸發(fā)方式。指示燈LD2由引腳PA5控制;PA5輸出高電平,開啟指示燈;PA5輸出低電平,關(guān)閉指示燈。
任務(wù)實(shí)現(xiàn)
1. 設(shè)計(jì)思路
采用前后臺編程模式:定義一個全局變量BlinkSpeed,初始化為0。在外部中斷服務(wù)程序(前臺程序)中修改BlinkSpeed的值;在主程序(后臺程序)的while(1)循環(huán)中不斷檢測BlinkSpeed的值,根據(jù)取值的不同修改指示燈的閃爍頻率。
2. 引腳分配和外設(shè)配置
本任務(wù)所使用的引腳和外設(shè)與基礎(chǔ)任務(wù)中所使用的相同,因此省去引腳分配和外設(shè)配置的過程。
1.
雙擊進(jìn)入
2.
3.
4.配置LED燈引腳(PB5)
5. 配置KEY鍵引腳(PE2)
配置上拉、上升沿和下降沿
使能中斷
6.配置時鐘樹
7.改名、保存、打開
3. 程序編寫
生成MDK工程后,進(jìn)行應(yīng)用程序的編寫。具體代碼如程序代碼段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在中斷服務(wù)程序中修改,在主程序中判斷。為了避免變量被編譯器優(yōu)化,在變量定義時,添加了關(guān)鍵字 volatile 來修飾。
② 第11~25行是while(1)循環(huán)中報(bào)執(zhí)行的代碼。采用if-else if-else的多分支語句,通過判斷BlinkSpeed的取值來改變指示燈的閃爍頻率:當(dāng)BlinkSpeed為0時,設(shè)置閃爍頻率為 2 Hz,即延時時間為500ms;當(dāng)BlinkSpeed為1時,設(shè)置閃爍頻率為10Hz,即延時時間為100ms;當(dāng)BlinkSpeed為2時,設(shè)置閃爍頻率為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) // 判斷發(fā)生外部中斷的 GPIO 引腳
{
BlinkSpeed++; // 修改 BlinkSpeed 變量的值
if( BlinkSpeed == 3) // 判斷是否完成一次循環(huán)
{
BlinkSpeed = 0;
}
}
}
/* USER CODE END 4 */
程序解釋:
在外部中斷回調(diào)函數(shù)中對變量Blink ASpeed加1,并判斷BlinkSpeed的值是否等于3。如果等于3,則對BlinkSpeed清零,重新開始下一輪的循環(huán)。
運(yùn)行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-725333.html
將程序編譯鏈接,生成可執(zhí)行代碼,通過ST-Link仿真器下載到開發(fā)板上可以觀察到:上電后,指示燈LED2按照2Hz頻率閃爍。按下按鍵B2后,指示燈LED2閃爍頻率加快,照10Hz頻率閃爍。再下按鍵B1后,示燈LED2閃爍頻率更快,按照20 Hz頻率閃爍。第三次按下按鍵后,指示燈恢復(fù)到2 Hz的閃爍頻率,并重復(fù)上述過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-725333.html
到了這里,關(guān)于【學(xué)習(xí)記錄】STM32中斷進(jìn)階任務(wù):按鍵控制指示燈閃爍頻率的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!