首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
ARM-uart
📅 2026/9/29 11:48:25
✍️ 爱科研究院
👁 阅读 3,247
今天学习ARM裸机下UART串口。串口是嵌入式开发最基础的调试工具打印日志、收发指令全都靠它。以前直接用printf没关心底层怎么实现今天搞懂串行通信基础概念手写UART寄存器配置还把stdio库移植到裸机直接能用scanf、printf收获挺大。一、串口通信基础概念嵌入式通信分为并行通信和串行通信。并行通信同一时刻传输多个比特速度快但是占用引脚多串行通信把数据拆成一比特一比特在一根线上依次传输引脚占用少硬件简单UART串口就属于串行里面的异步通信。按照数据传输方向分为三种模式单工只能单向传输一端固定发送、一端固定接收半双工双向可以通信但同一时刻只能一方发、另一方收不能同时收发类似对讲机全双工两根数据线收发独立可以同时发送和接收就像打电话我们常用的TTL‑UART、RS232都是全双工RS485是差分信号属于半双工。同步通信 、异步通信同步通信除数据线之外额外带一根时钟线收发双方跟着同一个时钟节拍采样数据例如I2C、SPI异步通信(UART)没有时钟线收发双方事先约定波特率依靠起始位、停止位来区分字节双方本地时钟误差不能超过6%。UART一帧数据格式TTL电平空闲状态数据线高电平起始位拉低1个bit时间代表一帧开始数据位从最低位LSB开始发送校验位无校验、奇校验、偶校验停止位拉高标记本字节结束。波特率bps每秒传输的比特数常用9600、115200。波特率决定每一位电平持续时间。电气标准区别TTL芯片引脚电平3.3V/5V传输距离很短我们开发板CH340芯片做USB转TTL电脑USB转成TTL电平给到IMX6ULL的UART引脚RS232使用正负电压逻辑1为‑3V‑15V逻辑0为3V15V距离最远二三十米RS485差分信号A/B依靠电压差值识别信号抗干扰强可以传到1200米。二、IMX6ULL UART硬件与寄存器要点我们板子上CH340负责USB转TTL连接到UART1的TX、RX引脚。写裸机UART步骤固定开启UART外设时钟时钟系统前面学过CCGR时钟门控IO引脚复用配置把普通GPIO复用为UART_TX、UART_RX同时配置电气属性UART软件复位配置控制寄存器UCR1、UCR2、UCR3配置分频寄存器UFCR设置波特率相关UBIR、UBMR使能发送、接收打开UART模块总开关重点寄存器UTXD发送寄存器写入数据就启动发送 URXD接收寄存器只读存放收到字节UCR1bit0 UARTENUART模块总开关 UCR2软件复位位、RX接收使能、TX发送使能、数据位长度、停止位、校验位UCR3UART多路复用模式IMX6ULL必须把bit2置1 UFCR参考时钟分频UBIR / UBMR波特率生成波特率计算公式 BaudRate Ref Freq/(16 \times ((UBMR 1) / (UBIR 1))) USR2状态寄存器bit3TXDC发送完成标志bit0RDR接收数据就绪标志。三、UART1底层驱动代码#includeuart.h#includeMCIMX6Y2.h#includefsl_iomuxc.hvoiduart1_init(void){//1.引脚复用配置TX RX为UART功能IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0);//2.配置引脚电气属性IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);//UART软件复位UART1-UCR2~(10);unsignedintr0;rUART1-UCR2;r|(114);//忽略RTS流控r~(18);//关闭奇偶校验r~(16);//1位停止位r|(15);//8位数据位r|(12);//TX发送使能r|(11);//RX接收使能UART1-UCR2r;//IMX6ULL UART必须设置RXDMUXSEL1UART1-UCR3|(12);//设置参考时钟分频UART1-UFCR~(77);UART1-UFCR|(57);//波特率参数配置UART1-UBIR999;UART1-UBMR43402;//打开UART模块总使能UART1-UCR1|(10);}//发送单个字符voidputc(unsignedcharc){//等待发送完成标志TXDCwhile((UART1-USR2(13))0);UART1-UTXDc;}//发送字符串voidputs(constchar*s){while(*s){putc(*s);}putc(\n);}//接收单个字符阻塞等待unsignedchargetc(void){//等待接收数据就绪RDRwhile((UART1-USR2(10))0);returnUART1-URXD0xFF;}//移植stdio库必须提供空的raise函数否则编译报错voidraise(intn){}裸机移植C标准库stdio要注意必须实现空函数void raise(int n)启动汇编文件后缀要用大写start.S大写S会做预处理小写s不会预处理Makefile需要增加stdio头文件路径、源码路径链接时加入libgcc库。底层写好putc、getc之后标准库的printf、scanf内部就会调用这两个底层函数于是裸机就可以直接使用格式化输入输出。四、main主函数测试代码这里复用我们之前写好的时钟、GPT定时器驱动初始化顺序中断控制器 → 时钟初始化 → 外设初始化最后初始化uart1。测试功能串口输入两个整数板子计算加法把结果打印回串口工具。#includeMCIMX6Y2.h#includefsl_iomuxc.h#includeled.h#includebeep.h#includekey.h#includeinterrupt.h#includeclock.h#includeepit.h#includegpt.h#includeuart.h#includestdio.hintmain(void){system_interrupt_init();clock_init();led_init();beep_init();key_init();//epit1_init();gpt1_init();uart1_init();unsignedintnum10,num20;while(1){led_nor();//串口输入两个数字板子做加法运算回显scanf(%d %d,num1,num2);printf(%d %d %d\n,num1,num2,num1num2);}return0;}现象打开串口调试助手波特率和代码配置保持一致输入两个数字按回车开发板计算加法并打印算式结果。也可以把注释打开直接调用getc()接收单字符puts()输出字符串。小结UART是异步串行通信没有时钟线全靠双方约定好波特率依靠起始、停止位识别每一帧数据和I2C/SPI这类同步通信要区分开。TTL、RS232、RS485是不同电气物理标准逻辑电平、传输距离各不相同。IMX6ULL裸机UART开发流程时钟 → IO复用配置 → 寄存器复位配置 → 波特率配置 → 使能收发模块任何一步出错串口都无法正常收发。特别记住UCR3的bit2必须置1这是IMX6ULL的坑点。putc、getc是最底层字符收发实现这两个接口之后就可以移植stdio直接使用printf、scanf格式化输入输出极大方便裸机调试。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/29 11:48:25
程序员必懂的进制解码:二进制、十六进制与大小端实战指南
2026/9/29 11:48:25
操作系统课后题全解析:进程管理、死锁与内存管理考点梳理
2026/9/29 11:43:25
人形机器人进厂前必须算清的可靠性税:五大隐性成本与工程路径
2026/9/29 13:33:36
2026 年 9 月 AI 效率工具生态盘点:哪些在创造真实价值,哪些在裸泳
2026/9/29 13:33:36
ESP32 Flash分区表与数据隔离:防多应用数据串门攻略
2026/9/29 13:33:36
纯Verilog实现PNG解码:从Huffman到LZ77的FPGA硬件方案
2026/9/29 13:33:36
从物理量到CAN报文:Scale/Offset与字节序解析全攻略
2026/9/29 13:33:36
Function Calling、MCP与Skill:AI Agent三层架构解析与Java实战
2026/9/29 13:28:36
SocketCAN 实战:Linux CAN 总线编程从字符设备到网络设备
2026/9/29 0:02:32
开源模型端侧落地实战:量化、推理加速与Agent上下文管理
2026/9/29 0:02:32
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成
2026/9/29 0:02:32
Java采购管理系统实战:从数据库设计到事务一致性
2026/9/29 11:29:08
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
2026/9/29 13:01:36
新手入门看这篇:建设网站加盟避坑指南与SEO实操
2026/9/28 8:17:28
论文AIGC疑似度是什么意思?想查论文AI率有哪些免费工具?