8.6 串口接收项目1:轮询方式控制LED灯
# 8.6 串口接收项目1:轮询方式控制LED灯
需通过STM32F103的USART1接收PC端指令(R/G/B/O),轮询解析字符后控制RGB LED对应亮灭,初始化115200波特率串口及GPIO,循环接收时添加消抖并清除缓存,实现基础串口指令控制功能。
# 下载源码 点击查看PDF文档
# 8.6.1 STM32CubeMX配置
# 1. 建立新工程
① 建立一个新的STM32工程;
② 选择芯片“STM32F103C8T6”;
③ 设置工程的名称为“08 USART_2”;
④ 选择SWD调试方式;
⑤ 开启外部高速时钟源并修改主频为72MHz。

# 2. 配置LED引脚
在芯片引脚图中分别右击PA7、PB0和PB1,均选择“GPIO_Output”,并设置用户标签分别为“LED_BLUE”、“LED_RED”和“LED_GREEN”。

# 3. 生成代码
勾选生成单独外设文件,保存生成工程代码。
# 8.6.2 串口接收项目1软件设计
# 轮询接收逻辑
使用轮询方式实现串口数据接收功能的软件编程分析如下:在main( )函数的while(1)循环中,通过HAL_UART_Receive函数轮询接收串口数据。接收到指令后,根据字符内容控制对应GPIO引脚的电平状态。由于LED阳极通过限流电阻连接至GPIO引脚,输出高电平点亮LED,输出低电平关闭LED。
while (1) {
uint8_t rx_buffer[1]; // 接收缓冲区(单字节)
// 接收1字节,超时10ms
if (HAL_UART_Receive(&huart1, rx_buffer, 1, 10) == HAL_OK) {
switch (rx_buffer[0]) {
case 'R': // 红色LED亮
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
case 'G': // 绿色LED亮
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
case 'B': // 蓝色LED亮
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
break;
case 'O': // 关闭所有LED
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
default: break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 8.6.3 串口接收项目1下载验证
# 1.下载步骤
ST-LINK下载器连接嵌入式学习板的烧录接口和电脑端,点击STM32CubeIDE软件开发界面中的“Run”按钮,一键完成代码程序的编译下载。
# 2.验证步骤
打开串口调试助手,选择正确的COM口与波特率(115200)。
在串口调试助手的数据发送区依次发送控制指令。开发板上LED灯的实验现象如下所示:
- 发送字符“R”,红色LED灯点亮,其他LED熄灭。
- 发送字符“G”,绿色LED灯点亮,其他LED熄灭。
- 发送字符“B”,蓝色LED灯点亮,其他LED熄灭。
- 发送字符“O”,所有LED灯均熄灭。
