0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式开发爱好者 来源:嵌入式开发爱好者 作者:嵌入式开发爱好者 2022-12-12 09:32 次阅读

大家好,我是ST。

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

第一:串口的基本简介

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

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

263e8604-7944-11ed-8abf-dac502259ad0.png

各个为含义如下:

空闲位:数据线在空闲状态的时候为逻辑“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),用来设置参考

2667332e-7944-11ed-8abf-dac502259ad0.png

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

267ab930-7944-11ed-8abf-dac502259ad0.png   

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,根据上面的

公式可以得到:

26b19a54-7944-11ed-8abf-dac502259ad0.png

第三: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);
voiduart_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;

#if0
uart_setbaudrate(UART1,115200,80000000);/*设置波特率*/
#endif
uart_enable(UART1);/*使能串口*/
}

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

审核编辑:汤梓红

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

    关注

    87

    文章

    10990

    浏览量

    206738
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99973
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54866

原文标题:Linux中裸机串口通信的基本方法

文章出处:【微信号:嵌入式开发爱好者,微信公众号:嵌入式开发爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于Linux环境下串口通信的应用设计

    本文介绍了Linux环境下串口通信的设计方法和步骤,并介绍了ARM9微处理器s3c2440在Linux下和C8051Fxxx系列单片机进行串
    发表于 05-24 10:50 2660次阅读

    Linux裸机点灯

    Linux裸机
    怎么啦
    发布于 :2023年10月27日 08:47:24

    嵌入式系统串口通信帧的同步方法

    制下面介绍一下简化的串口通信数据帧结构,以便分析说明嵌入式系统串口通信过程的帧同步方法。 假定
    发表于 10-09 19:17

    请问串口裸机程序只能在nand运行吗?

    串口裸机程序只能在nand运行吗?在UBOOT里用GO命令总是卡死在“Application Starting”那。这是为什么?还有,在LINUX想用USB向板子传输BIN文件怎么传
    发表于 07-05 00:40

    linux裸机程序下载的两种方法

    的UBOOT命令 nand 烧写程序到开发板。 1,通过SD_Writer.exe将mmc.bin烧写到SD 卡 ,将开发板设置到SD卡启动。(具体方法参见飞凌开发板linux3.0.1用户手册.pdf) 2
    发表于 07-18 10:09

    Linux下ARM和单片机的串口通信设计

    文件路径是“/dev/ttySAC1”。2.2Linux串口通信程序设计串口通信需要设置一些参数,如波特率、数据位、停止位,输入输出方式等
    发表于 11-04 06:30

    Linux下ARM和单片机的串口通信设计资料分享

    /KaqA4mMbmq9AXnxgHWTAXQLinux下ARM和单片机的串口通信设计原创 wonhere华和技术2016-04-15 本文介绍Linux 环境下串口
    发表于 12-13 06:32

    LinuxTCP的通信过程以及实现方法

    【嵌入式】Web1.操作内容2.操作步骤1.操作内容理解LinuxTCP的通信过程以及实现方法。掌握Linux下socket()函数在TC
    发表于 12-16 08:01

    串口通信基本接线方法

    串口通信基本接线方法 目前较为常用的串口有9针串口(DB9)和25针串口(DB25),
    发表于 04-07 08:30 9378次阅读

    基于VC++的多串口通信方法

    介绍了实现 多串口通信 的基本方法,采用 VC++ 6.0并结合定时器和多线程技术编写,提出了实现多串口通信的三种
    发表于 08-03 10:42 165次下载
    基于VC++的多<b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>方法</b>

    基于Linux的ARM/单片机串口通信设计

    介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进
    发表于 05-24 09:45 2731次阅读
    基于<b class='flag-5'>Linux</b>的ARM/单片机<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计

    Linux下ARM 和单片机的串口通信设计

     介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机
    发表于 05-24 10:16 3373次阅读
    <b class='flag-5'>Linux</b>下ARM 和单片机的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计

    Linux下ARM和单片机的串口通信设计

    介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进
    发表于 09-29 10:06 1794次阅读
    <b class='flag-5'>Linux</b>下ARM和单片机的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计

    Linux单片机串口通信总结

    这是一个目录Linux与单片机串口通信运行ROS串口发送节点后异常中断栈溢出问题catkin_make报错:函数未定义的引用ERROR L107: ADDRESS SPACE OVER
    发表于 11-23 18:06 9次下载
    <b class='flag-5'>Linux</b>单片机<b class='flag-5'>串口</b><b class='flag-5'>通信</b>总结

    基于Linux的ARM和单片机的串口通信设计

    电子发烧友网站提供《基于Linux的ARM和单片机的串口通信设计.pdf》资料免费下载
    发表于 10-11 10:35 0次下载
    基于<b class='flag-5'>Linux</b>的ARM和单片机的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计