ARM———UART

一、基础时序单位

UART 通信中,1 个 bit 的电平持续时间由通信波特率(通信速率)决定,单帧数据内的起始位、数据位、停止位,均遵循统一的单 bit 时长,以此保证收发双方的时序同步。

二、总线空闲状态

UART 总线无数据传输时,数据线默认保持高电平状态。

三、起始信号(起始位)

  1. 起始信号的识别标志:数据线由高电平跳转为低电平,该下降沿是接收端识别数据传输启动的核心信号。
  2. 起始位固定占用 1 个 bit 的时长,持续 1 个 bit 位宽的低电平。(UART 标准协议中,起始位固定为低电平,以此和空闲高电平状态做明确区分)

四、数据位传输规则

  1. 传输顺序:采用小端序传输,先传低位,后传高位
  2. 图中示例传输的二进制数据为 0b10011101,传输时从最低位(最右侧的 bit 0)开始,依次向高位(bit 7)逐位传输。
  3. 每个数据位的电平持续时间,与起始位、停止位的单 bit 时长完全一致,由设定的波特率统一管控。

五、停止信号与停止位

  1. 停止信号的电平特征:数据线由低电平跳转为高电平;若数据位的最后一位本身就是高电平,则数据线直接保持高电平不变。
  2. 停止信号的核心目的:让数据线在数据传输结束后,恢复并保持空闲时的高电平状态,为下一次数据传输的起始位下降沿做好准备。
  3. 停止位定义:停止信号后,会持续1~2 个 bit 位宽的高电平,作为本次数据帧传输的结束标志。

六、波特率

指单位时间(1 秒)内通信链路可以传输的码元数量,是衡量通信符号传输速率的核心指标。在 UART 串行通信中,单个码元仅能承载 1 个 bit 的二进制数据,因此 UART 的波特率在数值上等同于单位时间内传输的 bit 数。

七、校验位

校验类型 计算规则 适用场景
奇校验(Odd Parity) 数据位 + 校验位中,1 的总数为奇数 简单场景,能检测出奇数个 bit 错误
偶校验(Even Parity) 数据位 + 校验位中,1 的总数为偶数 与奇校验类似,同样只能检测奇数个 bit 错误
无校验(No Parity) 不添加校验位,传输效率更高 工业 / 嵌入式最常用,依赖上层协议做错误处理

寄存器配置:

URXD:读取收到的数据

UCR1:使能

UCR2: 忽略RTS

校验使能

停止位

数据长度

发送器/接收器 使能

软件复位

UCR3:接收复用选择(置1)

UFCR:时钟分频

USR2:TXDC/RDR 发送完成状态位,用于判断发送链路是否完全空闲 接收数据就绪状态位,用于判断是否有新数据可读

UBIR/UBMR:设置波特率

模块时钟要*16

uart的初始化

cpp 复制代码
void uart_init(UART_Type * base)
{
    if (base == UART1)
    {
        IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);
        IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
        IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10b0);
        IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10b0);
    }
    else if(base == UART2)
    {
        IOMUXC_SetPinMux(IOMUXC_UART2_RX_DATA_UART2_RX, 0);
        IOMUXC_SetPinMux(IOMUXC_UART2_TX_DATA_UART2_TX, 0);
        IOMUXC_SetPinConfig(IOMUXC_UART2_RX_DATA_UART2_RX, 0x10b0);
        IOMUXC_SetPinConfig(IOMUXC_UART2_TX_DATA_UART2_TX, 0x10b0);
    }

    base->UCR2 &= ~(1 << 0);
    delay_us(1);
    unsigned int tmp = base->UCR2;
    tmp |= (1 << 14);
    tmp &= ~(1 << 8);
    tmp &= ~(1 << 6);
    tmp |= (1 << 5);
    tmp |= (1 << 2);
    tmp |= (1 << 1);
    base->UCR2 = tmp;

    base->UCR3 |= (1 << 2);

    tmp = base->UFCR;
    tmp &= ~(0x7 << 7);
    tmp |= (0x5 << 7);
    base->UFCR = tmp;

    base->UBIR = 999;
    base->UBMR = 43404;

    base->UCR1 |= (1 << 0);
}

发送

cpp 复制代码
void uart_send_byte(UART_Type * base, unsigned char data)
{
    while(!(base->USR2 & (1 << 3)));
    base->UTXD = data;
}

接收

cpp 复制代码
unsigned char uart_recv_byte(UART_Type * base)
{
    unsigned char data = 0;
    while(!(base->USR2 & (1 << 0)));
    data = base->URXD & 0xff;
    return data;
}

发送字符串

cpp 复制代码
void uart_send_str(UART_Type *base,const char * str)
{
    while(*str != '\0')
    {
        uart_send_byte(base, *str);
        str++;
    }
}

接收字符串

cpp 复制代码
void uart_recv_str(UART_Type * base,char *str,int max_len)
{
    char ch;
    int i = 0;
    while(1)
    {
        ch = uart_recv_byte(base);
        if(ch == '\n' || ch == '\r')
        {
            str[i] = '\0';
            break;
        }   
        else if (i < max_len)
        {
            str[i++] = ch;
        }
        else
        {
            str[i] = '\0';
            break;
        }
    }

}
相关推荐
智购科技自动售货机工厂10 分钟前
2026自动售货机语音支付模块集成:从声纹识别到支付闭环的工程实践~YH
大数据·服务器·网络·数据库·人工智能
zcmodeltech1 小时前
煤化工沙盘模型控制系统设计与实现:多工段协同联动方案
网络·人工智能·stm32·嵌入式硬件·制造·多分类
qq_401700412 小时前
TCP 粘包问题深度解析:嵌入式网络开发的常见坑与解决方案
服务器·网络·qt·网络协议·tcp/ip
zhao3266857512 小时前
长效静态IP与短效动态IP怎么选?两种适用场景有何区别
大数据·网络·tcp/ip
2601_949499943 小时前
芯瑞科技 DT‑1414完全兼容HFBR‑1414TZ光模块国产化优选方案深度解析(工程师视角)
运维·网络·人工智能·科技·光模块
XUEYUAN52124 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
Fcy6484 小时前
Linux下 Socket编程 —— UDP网络编程
linux·网络·udp
酒神dnspup4 小时前
服务器端口检测怎么做?用 DNSPup 核对开放端口、监听服务与暴露风险
网络·网络协议·http·ssl证书·http状态码·服务器端口
2301_800895104 小时前
计算机组成原理保研面试题目整理---h
网络
酒神dnspup5 小时前
HTTP状态码检测怎么做?用 DNSPup 排查 4xx、5xx、重定向与网站可用性
网络·网络协议·http·http状态码