关于 uart-serial-baremetal
uart-serial-baremetal 指导嵌入式开发者实现裸机 UART/USART,涵盖波特率计算、帧格式、轮询、中断和基础 DMA,用于串口启用与故障排查。
主要功能
- 01波特率计算
- 028N1 帧格式
- 03轮询式收发
- 04中断驱动的 RX 环形缓冲区
- 05溢出处理与 DMA 基础
- 06newlib printf 重定向
适用场景
- 01在新硬件上添加日志输出
- 02通过串口连接传感器或模块
- 03替换阻塞式 HAL_UART 驱动
- 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 分频器 |
| 字节丢失 | 未清除 ORE | ORE 发生时读取 DR;使用 IRQ + 环形缓冲区 |
| 无输出 | TX 引脚未配置为 AF | 设置 GPIO 复用功能 |
printf 卡住 | 缺少 _write | 实现重定向 |
相关技能
skills/baremetal/gpio-baremetal— TX/RX 引脚复用skills/baremetal/interrupts-and-exceptions-baremetal— USART IRQskills/baremetal/dma-baremetal— UART RX DMAskills/embedded/openocd-jtag— 半主机替代方案
评论
支持 Markdown