(十)arm裸机开发---UART串口通信实验

串口是很常用的通信接口,本节我们就介绍串口。虽然板子上的串口是通过CH340转为usb接口了,但是本质是一样的。

文章目录

  • 一、UART的寄存器配置
    • 1.设置UART的时钟
    • 2.UART的重要的寄存器
  • 二、程序编写

一、UART的寄存器配置

1.设置UART的时钟

CSCDR1[6] = 0。选择UART的时钟。
CSCDR1[5:0] = 0 设置一分频。

2.UART的重要的寄存器

UART1_URXD[7:0]:读到的串口数据就放在这个寄存器中。
UART1_UTXD[7:0]:要写的串口数据就放在这个寄存器中。
UART1_UCR1[0]=1:UART设置为使能。
UART1_UCR2[8]=0:关闭奇偶校验。
UART1_UCR2[6]=0:一位停止位。
UART1_UCR2[5]=1:以8bit字长传输。
UART1_UCR2[2]=1:发使能。
UART1_UCR2[1]=1:收使能。
UART1_UCR2[0]=0:软件复位。
UART1_UCR3[2]=1:UART功能必须选择。
UART1_UFCR[9:7]=101:设置分频为1分频。
UART1_UBMR=3124:设置波特率位115200。
UART1_UBIR=71:设置波特率位115200。
UART1_USR2[0]。0的时候不可以接收数据,1的时候可以接收数据。
UART1_USR2[3]。0的时候传输数据未完成,1的时候传输数据已完成。

二、程序编写

#include "bsp_uart.h"

void uart_init()
{
     
    /*1.初始化io口*/
    io_init_uart();
    /*2.uart disable*/
    uart_disable(UART1);
    /*3.uart software reset*/
    uart_reset(UART1);
    UART1->UCR1 = 0;
    UART1->UCR1 &= ~(1<<14);    //关闭自动波特率检测 
    UART1->UCR2 |= (1 << 1) | (1 << 2) | (1 << 5) | (1 << 14);
    UART1->UCR3 |= 1 << 2;
    UART1->UFCR &= ~(7 << 7);   //清零
    UART1->UFCR = 5 << 7;      	//设置为一分频
    UART1->UBIR = 71;           //用于设置比特率115200
    UART1->UBMR = 3124;         //用于设置比特率115200
    /*5.uart enable */
    uart_enable(UART1);
}


/*初始化io口*/
void io_init_uart(void)
{
     
    IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX ,0);
    IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX ,0);

    IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX ,0x10B0);
    IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX ,0x10B0);
}


/*UART disable*/
void uart_disable(UART_Type * UART)
{
     
    UART->UCR1 &= ~(1 << 0);    //UART1 disable
}


/*UART使能*/
void uart_enable(UART_Type * UART)
{
     
    UART->UCR1 |= (1 << 0);       //UART1使能
}


/*UART software reset*/
void uart_reset(UART_Type * UART)
{
     
    UART->UCR2 &= ~(1 << 0);       //软件复位
    while((UART->UCR2 & 0x1) == 0);
}


/*UART 输出字符*/
void put_c(char c){
     
    while(((UART1->USR2 >> 3) & 0x1 ) == 0);    //判断上一次传输是否完成,未完成就等待
    UART1->UTXD = c & 0xff;
}


/*UART 输入字符*/
char get_c(){
     
    while((UART1->USR2 & 0x1) == 0);            //判断上一次接受是否完成,未完成就等待
    return UART1->URXD;
}


/*UART 输出字符*/
void put_s(char *str){
     
    char *p = str;
    while(*p){
     
        put_c(*p++);
    }
}

本来是一件很简单的程序,改bug改了俩个小时。最大的一个bug是我万万没想到的。UART1->UBIR必须在UART1->UBMR之前赋值。反之,你就不知道哪里出问题了。
直到查到了官方文档,写的很清楚:The UBIR register MUST be updated before the UBMR register for the baud rate to be updated correctly。

你可能感兴趣的:(arm裸机开发,单片机,串口通信,嵌入式)