SuperAPI AI 工具集

uart-serial-baremetal

编程与开发

查看项目

更新于 10-15 16:12

技能介绍

用途

本技能面向裸机环境下 UART/USART 的实现,主要服务于两类场景:作为调试控制台输出,以及作为与外部设备(传感器、模块等)通信的串口通道。其目标包括波特率计算、8N1 帧格式、轮询与中断驱动的收发、溢出处理,以及可选的 DMA 基础集成。

适用时机

  • 在新硬件上实现首次 printf/日志输出
  • 与传感器或模块建立串口协议通信
  • 用最小驱动替换阻塞式 HAL_UART
  • 修复乱码或丢字符问题

工作流程

1. 波特率计算(以 STM32 为例)

文档给出的简化公式为:BRR = pclk / (16 * baud),对应 16 倍过采样,并提示需查阅参考手册(RM)确认 USART 的具体配置。示例初始化代码开启 USART2 时钟、配置 GPIO 复用(PA2/PA3,另见 gpio-baremetal 技能)、设置 BRR 并开启发送(TE)、接收(RE)与使能(UE)。文中强调简化版本的 BRR 计算,实际手册中有小数分频公式;同时要求依据实际时钟树(SystemCoreClock、APB 预分频)校验 pclk。

2. 轮询收发

提供 uart_putc 与 uart_getc 两个函数:前者等待 TXE 标志后写入 DR,后者等待 RXNE 标志后读取 DR。

3. 中断驱动的 RX 环形缓冲区

在 USART2_IRQHandler 中,若 RXNE 置位则读取 DR 并推入环形缓冲区;若 ORE(溢出)置位则读取 DR 以清除该标志(文档注明在 STM32 上为必需操作)。

4. 重定向 printf(newlib)

通过实现 _write(int fd, char *ptr, int len) 将输出逐字节经 uart_putc 发出并返回 len。文档提示需使用 --specs=nosys.specs 链接,或提供完整的系统调用(syscalls)。

5. 调用方式

文档给出的调用示例为:/uart-serial-baremetal Calculate USART BRR for 115200 at 84 MHz PCLK,即通过该技能计算特定 PCLK 与波特率下的 BRR 值。

常见问题

  • 乱码字符:原因为波特率或 PCLK 错误,修复方式是重新计算 BRR 并检查 APB 分频。
  • 丢失字节:原因为未清除 ORE,修复方式是在 ORE 时读取 DR,并使用中断加环形缓冲区。
  • 无输出:原因为 TX 引脚未配置复用功能,修复方式是设置 GPIO 复用。
  • printf 挂起:原因为缺少 _write 实现,修复方式是实现重定向。

相关技能

  • gpio-baremetal:TX/RX 引脚复用
  • interrupts-and-exceptions-baremetal:USART 中断
  • dma-baremetal:UART RX DMA
  • openocd-jtag:半主机(semihosting)替代方案

限制

文档未提供具体支持的芯片型号清单、完整寄存器定义、性能数据或与其他 UART 实现的对比。BRR 示例被明确标注为简化版本,实际使用时需查阅对应参考手册。