stm32按鍵控制led燈亮滅
在嵌入式系統(tǒng)中,硬件按鍵常常被用作開(kāi)關(guān)輸入,控制LED燈亮滅。在STM32系列單片機(jī)中,有多種方式實(shí)現(xiàn)按鍵控制LED燈亮滅,我們將介紹其中一種較為簡(jiǎn)單的方法。
一、STM32開(kāi)發(fā)環(huán)境搭建
1. 軟件環(huán)境搭建
首先,需要在計(jì)算機(jī)中下載安裝Keil MDK開(kāi)發(fā)環(huán)境,以實(shí)現(xiàn)對(duì)STM32單片機(jī)的編寫、編譯、燒錄等操作。同時(shí),還需要下載對(duì)應(yīng)的STM32CubeMX軟件,用于生成代碼、初始化硬件等操作。
2. 硬件環(huán)境搭建
將STM32單片機(jī)與相應(yīng)的按鍵和LED燈連接。本實(shí)驗(yàn)使用的STM32是STM32F103C8T6,按鍵使用的是按鈕開(kāi)關(guān),LED燈使用的是紅色和藍(lán)色通用的LED燈。
二、STM32按鍵控制LED燈亮滅實(shí)驗(yàn)步驟
1. 打開(kāi)STM32CubeMX軟件,點(diǎn)擊File -> New Project,選擇STM32F103C8T6作為目標(biāo)設(shè)備,單擊OK。
2. 在生成的新項(xiàng)目中,選擇Pinout標(biāo)簽頁(yè),將按鍵和LED燈連接至對(duì)應(yīng)的引腳上。
3. 選擇Configuration標(biāo)簽頁(yè),配置GPIO引腳的工作模式。按鍵連接的GPIO引腳應(yīng)配置為輸入模式,LED燈連接的GPIO引腳應(yīng)配置為輸出模式。
4. 在Project Manager視圖中,選擇Project Manager -> Code Generator標(biāo)簽頁(yè),選擇Generate peripheral initialisation as a pair of .c/.h files選項(xiàng),并確保選中了Generate under Root選項(xiàng)。
5. 點(diǎn)擊Generate Code,生成HAL庫(kù)文件。
6. 打開(kāi)Keil MDK開(kāi)發(fā)環(huán)境,從文件菜單中選擇New Project,創(chuàng)建新的工程。在選擇設(shè)備的窗口中選擇STM32F103C8T6,確定后添加HAL庫(kù)文件到工程。
7. 編寫C語(yǔ)言程序,實(shí)現(xiàn)按鍵控制LED燈亮滅。程序中需要實(shí)現(xiàn)如下功能:
a. 初始化按鍵和LED燈的GPIO引腳。
b. 判斷按鍵當(dāng)前狀態(tài),如果按鍵處于按下?tīng)顟B(tài),則將LED燈的GPIO引腳置高,使LED燈亮;否則,將LED燈的GPIO引腳置低,使LED燈滅。
下面是具體的C語(yǔ)言程序示例:
```
#include "stm32f1xx_hal.h"
/* 定義按鍵GPIO引腳 */
#define KEY_PORT GPIOB
#define KEY_PIN GPIO_PIN_0
/* 定義LED燈GPIO引腳 */
#define LED_PORT GPIOB
#define LED_PIN GPIO_PIN_1
/* 定義按鍵狀態(tài)標(biāo)志 */
uint8_t key_flag = 0;
/* 定義HAL庫(kù)句柄 */
GPIO_InitTypeDef GPIO_InitStruct;
TIM_HandleTypeDef htim2;
/* 初始化STM32的GPIO引腳 */
void GPIO_Init(void)
{
/* 使能GPIOB時(shí)鐘 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/* 初始化按鍵GPIO引腳 */
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
/* 初始化LED燈GPIO引腳 */
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
}
/* 初始化STM32的定時(shí)器,以便在檢測(cè)按鍵時(shí)切換狀態(tài) */
void TIM2_Init(void)
{
/* 使能TIM2時(shí)鐘 */
__HAL_RCC_TIM2_CLK_ENABLE();
/* 初始化定時(shí)器中斷 */
HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* 初始化定時(shí)器2 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7200-1; /* 分頻系數(shù) */
htim2.Init.Period = 500-1; /* 計(jì)數(shù)周期 */
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start_IT(&htim2);
}
/* 檢測(cè)按鍵狀態(tài) */
void Key_Scan(void)
{
/* 判斷按鍵是否按下 */
if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) {
key_flag = 1;
} else {
key_flag = 0;
}
}
/* 控制LED燈亮滅 */
void LED_Control(void)
{
/* 根據(jù)按鍵狀態(tài)判斷LED燈的亮滅狀態(tài) */
if (key_flag == 1) {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
}
/* 定時(shí)器調(diào)用函數(shù),每500ms檢測(cè)一次按鍵狀態(tài) */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2) {
Key_Scan();
LED_Control();
}
}
int main(void)
{
/* 初始化GPIO引腳 */
HAL_Init();
GPIO_Init();
/* 初始化定時(shí)器 */
TIM2_Init();
/* 等待事件發(fā)生 */
while (1) {
}
return 0;
}
```
三、STM32按鍵控制LED燈亮滅的運(yùn)行效果
編寫完成上述程序之后,將程序燒錄到STM32單片機(jī)中。當(dāng)按下按鍵時(shí),LED燈將亮起,否則LED燈將熄滅
四、總結(jié)
本實(shí)驗(yàn)簡(jiǎn)單介紹了STM32按鍵控制LED燈亮滅的原理和步驟。在實(shí)現(xiàn)過(guò)程中,需要注意初始化硬件的GPIO引腳的工作模式,以及編寫程序中對(duì)按鍵狀態(tài)的判斷和LED燈狀態(tài)的控制??梢酝ㄟ^(guò)添加定時(shí)器中斷等方式,實(shí)現(xiàn)對(duì)按鍵狀態(tài)的周期性檢測(cè)和LED燈的閃爍效果等功能,并根據(jù)具體的應(yīng)用場(chǎng)景來(lái)定制相應(yīng)的程序功能。
-
led燈
+關(guān)注
關(guān)注
22文章
1596瀏覽量
109749 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365038 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141791 -
按鍵控制
+關(guān)注
關(guān)注
1文章
44瀏覽量
8998 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
6948
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論