使用串口通信控制RGB灯

一、实验目的

本实验旨在综合训练 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点亮红色 LED
    • R0熄灭红色 LED
    • G1点亮绿色 LED
    • G0熄灭绿色 LED
    • B1点亮蓝色 LED
    • B0熄灭蓝色 LED
    • 其他指令 → 返回“Erro!”错误信息

四、实验总结

  • 通过本实验,掌握了 GPIO 控制 LEDUSART 串口通信中断模式DMA 传输
  • 中断模式 适用于 小数据量、低速通信DMA 模式 适用于 大数据流、高速传输
  • 实验验证了 基于串口控制 LED 的方法
上一篇
下一篇