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;
        }
    }

}
相关推荐
宋浮檀s2 分钟前
春秋云镜——CVE-2020-25540
网络·安全·web安全
天天进步201516 分钟前
Tunnelto 源码解析 #4:Wormhole 控制通道:WebSocket 如何建立一条“隧道控制线”
网络·websocket·网络协议
xiaofeichaichai32 分钟前
网络与跨域
前端·网络
Latticy1 小时前
内网渗透-Windows RDP凭证的抓取和密码破解
网络·安全·网络安全·内网渗透·内网
Forget_85501 小时前
HCIA——计算机网络诞生与发展
服务器·网络·计算机网络
志栋智能2 小时前
超自动化巡检:降低运维总成本(TCO)的有效路径
大数据·运维·网络·人工智能·自动化
Yang96112 小时前
一站式网络检测 鼎讯信通网络综合测试仪科普
运维·服务器·网络·能源
郑洁文3 小时前
基于Python的网络入侵检测系统
网络·python·php
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ4 小时前
nginx部署教程
运维·网络·nginx
安全小白wula4 小时前
RCE远程代码/命令执行基础讲解
网络·网络安全·渗透测试·rce·web渗透