串口是很常用的通信接口,本节我们就介绍串口。虽然板子上的串口是通过CH340转为usb接口了,但是本质是一样的。
文章目录
一、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之前赋值。反之,你就不知道哪里出问题了。