mcpField
U
uart-serial-baremetal

uart-serial-baremetal

github.com/mohitmishra786开发269308 次安装18 周前更新
代码仓库

关于 uart-serial-baremetal

uart-serial-baremetal 指导嵌入式开发者实现裸机 UART/USART,涵盖波特率计算、帧格式、轮询、中断和基础 DMA,用于串口启用与故障排查。

主要功能

  1. 01波特率计算
  2. 028N1 帧格式
  3. 03轮询式收发
  4. 04中断驱动的 RX 环形缓冲区
  5. 05溢出处理与 DMA 基础
  6. 06newlib printf 重定向

适用场景

  1. 01在新硬件上添加日志输出
  2. 02通过串口连接传感器或模块
  3. 03替换阻塞式 HAL_UART 驱动
  4. 04排查乱码或字符丢失

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill uart-serial-baremetal

安装后在 Claude Code 中输入/uart-serial-baremetal确认已加载。

详细介绍

UART 串口(裸机)

用途

实现用于调试控制台和设备通信的 UART/USART:波特率计算、8N1 帧格式、轮询和中断驱动 I/O、溢出处理,以及可选的 DMA 基础用法。

适用场景

  • 在新硬件上首次输出 printf/日志
  • 与传感器/模块进行串口协议通信
  • 用精简驱动替代阻塞式 HAL_UART
  • 修复乱码或字符丢失问题

工作流

1. 波特率(STM32)
BRR = pclk / (16 * baud)   /* oversampling by 16 — check RM for USART */
void usart2_init(uint32_t pclk, uint32_t baud) {
    RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
    /* GPIO PA2/PA3 AF — see gpio-baremetal */

    USART2->BRR = pclk / baud;  /* simplified — RM has fractional formula */
    USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}

根据实际时钟树(SystemCoreClock、APB 分频器)确认 pclk。

2. 轮询式 TX/RX
void uart_putc(USART_TypeDef *u, char c) {
    while (!(u->SR & USART_SR_TXE))
        ;
    u->DR = (uint8_t)c;
}

char uart_getc(USART_TypeDef *u) {
    while (!(u->SR & USART_SR_RXNE))
        ;
    return (uint8_t)u->DR;
}
3. 中断驱动的 RX 环形缓冲区
void USART2_IRQHandler(void) {
    if (USART2->SR & USART_SR_RXNE) {
        uint8_t b = USART2->DR;
        rb_push(&rx_rb, b);
    }
    if (USART2->SR & USART_SR_ORE) {
        (void)USART2->DR;  /* clear overrun — required on STM32 */
    }
}
4. 重定向 printf(newlib)
int _write(int fd, char *ptr, int len) {
    (void)fd;
    for (int i = 0; i < len; i++)
        uart_putc(USART2, ptr[i]);
    return len;
}

使用 --specs=nosys.specs 链接,或提供完整的系统调用。

5. Agent 用法
/uart-serial-baremetal Calculate USART BRR for 115200 at 84 MHz PCLK

常见问题

现象原因修复方法
字符乱码波特率/PCLK 错误重新计算 BRR;检查 APB 分频器
字节丢失未清除 OREORE 发生时读取 DR;使用 IRQ + 环形缓冲区
无输出TX 引脚未配置为 AF设置 GPIO 复用功能
printf 卡住缺少 _write实现重定向

相关技能

  • skills/baremetal/gpio-baremetal — TX/RX 引脚复用
  • skills/baremetal/interrupts-and-exceptions-baremetal — USART IRQ
  • skills/baremetal/dma-baremetal — UART RX DMA
  • skills/embedded/openocd-jtag — 半主机替代方案

评论

支持 Markdown