【裸机开发】UART 串口通信(二)—— 使用 UART 收发数据

这节其实就是在对上一篇文章涉及到的一些操作进行整理和归纳(不一定完全按照上一篇的顺序来)。


目录

一、UART IO 初始化

二、UART 初始化

1、打开 / 关闭串口

2、软件复位

3、总结:UART 初始化

三、接收数据

四、发送数据


一、UART IO 初始化

IO 初始化其实就是在设置某个引脚复用为 UART,并设置该引脚的电气属性。

扫描二维码关注公众号,回复: 15904936 查看本文章
void uart1_io_init()
{
    // 设置引脚复用为 uart1
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA &= ~(0xF);
    IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA &= ~(0xF);

    // 配置电气属性
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA = 0x10B0;
    IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA = 0x10B0;
}

二、UART 初始化

1、打开 / 关闭串口

/* 关闭uart1串口 */
void close_uart1()
{
    UART1_UCR1 &= ~(1 << 0);
}
/* 打开uart1串口 */
void open_uart1()
{
    UART1_UCR1 |= (1 << 0);
}

2、软件复位

/* 软件复位 */
void uart1_software_reset()
{
    UART1_UCR2 &= ~(1 << 0);
    while((UART1_UCR2 & 0x01) == 0);    // 等待软复位结束
}

3、总结:UART 初始化

void uart1_init()
{
    // UART IO 初始化
    uart1_io_init();

    // 关闭uart1串口
    close_uart1();

    // uart1 软复位
    uart1_software_reset();

    UART1_UCR1 = 0;
    /*
     * bit 14: 0 禁止自动检测波特率
     */ 
    UART1_UCR1 &= ~(1 << 14);

    /*
     * bit 1: 1 接收使能
     * bit 2: 1 发送使能
     * bit 5: 1 数据位为 8 bit
     * bit 6: 0 停止位占 1 bit
     * bit 8: 0 关闭奇偶校验
     */
    UART1_UCR2 |= ((1 << 1) | (1 << 2) | (1 << 5) | (1 << 14));
    UART1_UCR2 &= ~((1 << 6) | (1 << 8));

    // 复位选择
    UART1_UCR3 |= (1 << 2);

    // 波特率配置
    /*
     * bit 9-7: 101 分频数为1 
     */
    UART1_UFCR &= ~(7 << 7);
    UART1_UFCR |= (5 << 7);
    UART1_UBIR = 71;
    UART1_UBMR = 3124;

    // 打开uart1串口
    open_uart1();
}

三、接收数据

UART1_USR2 的bit 0 可以用于判断数据是否就绪,如果一直没有数据就绪的话,会一直置 0;当数据就绪时,会自动置 1。

/* 接收数据 */
unsigned char readData()
{
    while ((UART1_USR2 & 0x01) == 0);      // 尚未有数据就绪

    return UART1_URXD & 0xFF;
}

四、发送数据

UART1_USR2 的bit 3 可以用于判断上一次的数据是否发送成功,如果没有发送成功会一直置0,先保证之前的数据发送出去;数据发送成功以后,会自动置1。

/* 发送字符 */
void sendCharacter(unsigned char data)
{
    while (((UART1_USR2 >> 3) & 0x01) == 0);        // 上一次的发送还没有完成
    
    UART1_UTXD &= ~0xFF;        // 低 8 位清零
    UART1_UTXD |= (data & 0xFF);
}

/* 发送字符串 */
void sendString(unsigned char* data)
{
    unsigned char* cur = data;
    while (*cur != '\0')            // 字符串以 \0 结尾
    {
        sendCharacter(*(cur++));
    }
}

猜你喜欢

转载自blog.csdn.net/challenglistic/article/details/131444806