一、实验目的
本实验旨在综合训练 STM32 串口通信、DMA 传输和串口中断 的使用方法,实现通过串口指令控制 RGB 三色 LED 的亮灭。
二、实验材料
- STM32F103C8T6 开发板
- USB 转 TTL 串口模块
- 三色 LED
- 连接导线
- STM32CubeMX、Keil
三、实验步骤
1. 配置 GPIO 控制 RGB LED
- 配置 PA5、PA4、PA3 为 推挽输出 模式,初始状态为 低电平(LED 关闭)。
- 这些引脚分别连接 蓝色(B)、绿色(G)、红色(R) LED。
2. 配置串口 UART(USART1)
- 采用 PA9(TX)、PA10(RX) 作为 USART1 的 发送(TX)和接收(RX) 端口。
- 通过 USB 转 TTL 模块 连接至 PC,确保 GND 连接到 STM32。
3. 配置串口中断
- 开启 USART1 的接收中断,使其可以接收数据并进入回调处理函数。
4. 配置 DMA 进行串口数据传输
- 配置 DMA 通道 以 接收和发送数据,提高传输效率。
5. 编写主程序控制逻辑
- 在 串口中断回调函数 中处理接收到的数据,并根据不同指令控制 LED。
- 在 DMA 模式 下,只需将中断发送接收函数改成DMA发送/接收就行,例如HAL_UART_Receive_DMA
- 参考代码如下(仅供参考,需根据具体工程调整):
/* 全局变量定义 */
char receiveData[2]; // 存储接收的数据
char message[] = "Erro!"; // 错误信息
/* 串口中断回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
GPIO_PinState state = GPIO_PIN_RESET;
if (receiveData[1] == '1')
state = GPIO_PIN_SET;
switch (receiveData[0])
{
case 'R': HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, state); break;
case 'G': HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, state); break;
case 'B': HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, state); break;
default: HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), 100); break;
}
// 继续使用中断模式接收新数据
HAL_UART_Receive_IT(&huart1, (uint8_t*)receiveData, sizeof(receiveData));
}
/* 在主函数中初始化接收 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 启动串口中断接收
HAL_UART_Receive_IT(&huart1, (uint8_t*)receiveData, sizeof(receiveData));
while (1)
{
// 其他代码处理逻辑
}
}
6. 实验现象
- 当串口接收到数据后,LED 状态发生变化。
- 示例指令(在串口调试工具发送):
R1
→ 点亮红色 LEDR0
→ 熄灭红色 LEDG1
→ 点亮绿色 LEDG0
→ 熄灭绿色 LEDB1
→ 点亮蓝色 LEDB0
→ 熄灭蓝色 LED- 其他指令 → 返回“Erro!”错误信息
四、实验总结
- 通过本实验,掌握了 GPIO 控制 LED、USART 串口通信、中断模式 和 DMA 传输。
- 中断模式 适用于 小数据量、低速通信,DMA 模式 适用于 大数据流、高速传输。
- 实验验证了 基于串口控制 LED 的方法