ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-25 23:57:46  阅读:313  来源: 互联网

标签:--- UCR2 UART 裸机 uart UART1 串口 IOMUXC


串口是很常用的通信接口,本节我们就介绍串口。虽然板子上的串口是通过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之前赋值。反之,你就不知道哪里出问题了。

标签:---,UCR2,UART,裸机,uart,UART1,串口,IOMUXC
来源: https://blog.csdn.net/qq_23844501/article/details/115216644

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有