Linux中裸机串口通信的基本方法

描述

     大家好,我是ST。

     今天主要和大家聊一聊,如何使用串口进行通信的方法。

 

第一:串口的基本简介

      串口又叫做串行接口,通常叫做COM接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。

       UART作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和 GND(地线)。

Linux

各个为含义如下:

       空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。

       起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。 

       数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。

        奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。 

         波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、115200 等。

第二:UART的特点

       ①、兼容 TIA/EIA-232F 标准,速度最高可到 5Mbit/S。 

       ②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。 

       ③、支持 9 位或者多节点模式(RS-485)。

       ④、1 或 2 位停止位。

       ⑤、可编程的奇偶校验(奇校验和偶校验)。

       ⑥、自动波特率检测(最高支持 115.2Kbit/S)。

       接下来看一下UART几个重要的寄存器,第一个就是 UART 的控制寄存器 1,即UARTx_UCR1(x=1~8)。

       第二个寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中要用的是位RFDIV(bit9:7),用来设置参考

Linux

    通过这三个寄存器可以设置UART的波特率,波特率的计算公式为:

Linux   

Ref Freq:经过分频以后进入 UART 的最终时钟频率。

UBMR:寄存器 UARTx_UBMR 中的值。

UBIR:寄存器 UARTx_UBIR 中的值。

通过 UARTx_UFCR 的 RFDIV 位、UARTx_UBMR 和 UARTx_UBIR 这三者的配合即可得

到我们想要的波特率。比如现在要设置 UART 波特率为 115200,那么可以设置 RFDIV 为

5(0b101),也就是 1 分频,因此 Ref Freq=80MHz。设置 UBIR=71,UBMR=3124,根据上面的

公式可以得到:

Linux

第三:UART的配置步骤   

1、设置 UART1 的时钟源

设置 UART 的时钟源为 pll3_80m,设置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位为 0

即可。

2、初始化 UART1

初始化 UART1 所使用 IO,设置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,设置内

容包括波特率,奇偶校验、停止位、数据位等等。

4、使能 UART1

UART1 初始化完成以后就可以使能 UART1 了,设置寄存器 UART1_UCR1 的位 UARTEN

为 1。

5、编写 UART1 数据收发函数

编写两个函数用于 UART1 的数据收发操作。

第四:代码基本实现

    先实现串口的头文件的基写法:

 

#ifndef _BSP_UART_H
#define _BSP_UART_H


//函数声明
void uart_init(void);
void uart_to_init(void);
void uart_disable(UART_Type *base);
void uart_enable((UART_Type *base);
#endif

 

      函数声明中,继续编写对应的源文件内容:

 

#include "uart.h"


//初始化串口1,波特率为115200
void uart_init(void)
{
    //初始化串口IO
    uart_io_init();
 
 /* 2、初始化 UART1 */
 uart_disable(UART1); /* 先关闭 UART1 */
 uart_softreset(UART1); /* 软件复位 UART1 */
 
 UART1->UCR1 = 0; /* 先清除 UCR1 寄存器 */
 UART1->UCR1 &= ~(1<<14); /* 关闭自动波特率检测 */
/*
 * 设置 UART 的 UCR2 寄存器,设置字长,停止位,校验模式,关闭硬件流控
 * bit14: 1 忽略 RTS 引脚
 * bit8: 0 关闭奇偶校验
 * bit6: 0 1 位停止位
 * bit5: 1 8 位数据位
 * bit2: 1 打开发送
 * bit1: 1 打开接收
 */
 UART1->UCR2 |= (1<<14) | (1<<5) | (1<<2) | (1<<1);
 UART1->UCR3 |= 1<<2; /* UCR3 的 bit2 必须为 1 */
 
 /*
 * 设置波特率
 * 波特率计算公式:Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1)) 
 * 如果要设置波特率为 115200,那么可以使用如下参数:
 * Ref Freq = 80M 也就是寄存器 UFCR 的 bit9:7=101, 表示 1 分频
 * UBMR = 3124
 * UBIR = 71
 * 因此波特率= 80000000/(16 * (3124+1)/(71+1))
 * = 80000000/(16 * 3125/72) 
 * = (80000000*72) / (16*3125) 
 * = 115200
 */
 UART1->UFCR = 5<<7; /* ref freq 等于 ipg_clk/1=80Mhz */
 UART1->UBIR = 71;
 UART1->UBMR = 3124;
 
 #if 0
 uart_setbaudrate(UART1, 115200, 80000000); /* 设置波特率 */
 #endif
 uart_enable(UART1); /* 使能串口 */
}

 

总结:实现串口的基本功能,对后面利用串口来调试程序,具有重要的实践意义。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分