首页/外设速查/UART
🔗

UART 通用异步收发

通信外设
最常用的串行通信:异步全双工,两根线即可点对点通信,调试口标配。
🧩 核心原理
📈 时序 / 工作过程图
UART 串口帧时序(8-N-1)起始位(低) → 8位数据(LSB在前) → 可选校验 → 停止位(高)TX起始位D0D1D2D3D4D5D6D7校验位停止位波特率 = 每秒传输位数(如 115200 = 1 位约 8.68µs)· 异步:双方各自按时钟对齐采样,无需时钟线
⚙️ 配置 / 使用要点
  1. 使能 USART + GPIO 时钟,引脚复用 AF
  2. 配置波特率/字长/停止位/校验/收发模式
  3. 使能接收中断 + NVIC
  4. 发送:阻塞轮询 或 DMA;接收:中断+DMA
🛠️ 项目示例
串口中断接收 + 环形缓冲(处理不定长帧)
// 中断接收:每收1字节进环形缓冲
#define RB_SIZE 256
uint8_t rb[RB_SIZE]; uint16_t rd=0, wr=0;

void USART1_IRQHandler(void){
  if(USART1->SR & USART_SR_RXNE){
    uint8_t b = USART1->DR;
    uint16_t nw = (wr+1) % RB_SIZE;
    if(nw != rd){ rb[wr]=b; wr=nw; }   // 满则丢
  }
}
// 主循环解析:
while(rd != wr){
  uint8_t c = rb[rd]; rd = (rd+1) % RB_SIZE;
  /* 按帧头0xAA 0x55 ... 解析 */
}
❓ 面试高频
UART为什么叫异步?
没有时钟线,接收方用自己的时钟在数据位中间采样,靠起始位同步、波特率对齐
怎么判断接收一帧完整数据?
固定长度+帧头帧尾 / 空闲中断(DLE)/ 超时判断 / DMA空闲中断
波特率误差容忍多少?
一般 ±3% 以内可可靠通信,晶振误差+分频误差需核算
TTL电平的UART能传多远?
几十厘米到1-2米;远距离要转RS232(15m)/RS485(1200m)
✅ 自查清单 (点击勾选,本地保存)
0/0
会画UART帧格式
知道波特率含义与误差
会写环形缓冲区收发
知道中断+DMA两种方式
知道TTL/RS232/RS485区别