USART——串口通讯

发布者:快乐飞翔最新更新时间:2022-05-28 来源: eefocus关键字:USART  串口通讯 手机看文章 扫描二维码
随时随地手机看文章

开发平台

野火F429开发板

标准库

通讯基本概念

同步通讯和异步通讯

同步通讯和异步通讯的区别在于有没有时钟信号线

全双工、半双工、单工通讯

全双工可以收发同时进行

半双工可以收发但不可同时进行

单工只能收或发

USART

三大时序:USART、I2C、SPI,USART是其中之一了

USART时序:起始位为低电平、然后发送数据8位数据是没有校验位的,9位数据是有校验位的、停止位为高电平。时序如下图:(字长为8)

在这里插入图片描述

现在我使用串口一般都是打印调试信息或者蓝牙通讯 ,只会用到TX和RX,不需要用到时钟信号线,所以是异步半双工

如果想要操作寄存器,那就要看功能框图了

在这里插入图片描述

1.TX发送数据引脚、RX接受数据引脚,所以要把引脚配置为串口复用引脚(每个串口对应的引脚都不一样,这样查看手册)

2.发送数据寄存器和接收数据寄存器,还有发送移位寄存器和接受移位寄存器

发送数据时,发送寄存器将数据一位位的移向移位寄存器发送出去

接收数据时,将数据接收到移位寄存器然后再移向接收寄存器

3.控制寄存器CR1:要使能USART、设置数据位(字长)、是否开启校验位、奇校验还是偶校验、作为发送器还是作为接收器(使能)

在这里插入图片描述

4.波特率设置,直接操作寄存器的时候要自己算出数值,然后写入寄存器,如果用标准库就不需要计算了,已经算好了。公式如下:

OVER8:过采样模式,根据选择的模式去更改权位(计算小数的时候)

在这里插入图片描述

使用标准库的话上面的了解一下就好了


串口的四个参数:波特率、数据位、校验位、停止位。

波特率:每秒中传输了多少个码元

数据位:八位或者九位,八位是没有校验位九位是有校验位

使能了校验位之后每个字符的数据帧格式:启动位+数据位+校验位+停止位

没有使能校验位每个字符的数据帧格式:启动位+数据位+停止位

停止位:表示数据已经发送完成了,停止位长传输准确率高,效率低 停止位分为0.5位、1位、1.5位、2位

0.5位和1.5位用在智能卡模式,一般情况下用1位停止位,2位停止位一般用于USART模式、单线模式、调制解调器模式。


一般情况:波特率:115200、数据位:8位、无校验位、停止位:1位

要想实现通讯,发送设备和接受设备波特率、数据位、校验位、停止位必须相同才可实现通讯


1.初始化串口的引脚

2.配置串口的参数

3.编写发送字符串函数

4.重定向printf函数和scanf函数

什么是重定向?简单来说,你喝水要喝进肚子里,可是你喝的时候是喝进脑子里的,你必须重定向才能让水喝进肚子里。

代码如下:


#ifndef __USART__H

#define __USART__H


#include "main.h"


#define USART_TX_CLOCK                  RCC_AHB1Periph_GPIOA

#define USART_RX_CLOCK                  RCC_AHB1Periph_GPIOA

#define USART_TX_PORT                   GPIOA

#define USART_RX_PORT                   GPIOA

#define USART_TX_PINSOURCE              GPIO_PinSource9            

#define USART_RX_PINSOURCE              GPIO_PinSource10           

#define USART_AF                         GPIO_AF_USART1

#define USART_TX_PIN                    GPIO_Pin_9

#define USART_RX_PIN                    GPIO_Pin_10


#define USART_CLOCK_Cmd()               RCC_APB2PeriphClockCmd(USART_CLOCK,ENABLE)

#define USART_CLOCK                     RCC_APB2Periph_USART1

#define USART                           USART1  

#define BAUDRATE                        115200                 


void USART_GPIO_Config(void);

void USART_Config(void);

void USATR_Sendbyte(uint16_t data);

void USART_Sendstring(char *string);

int fputc(int ch, FILE *f);


#endif


#include "usart.h"


void USART_GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    /*开USART引脚复用时钟*/

    RCC_AHB1PeriphClockCmd(USART_TX_CLOCK|

                           USART_RX_CLOCK,ENABLE);

    /*

    **复用模式

    **不上拉不下拉

    **TX->PB6    RX->PB7

    */

    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;

    GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed;


    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_Pin=USART_TX_PIN;

    GPIO_Init(USART_TX_PORT,&GPIO_InitStruct);


    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_Pin=USART_RX_PIN;

    GPIO_Init(USART_RX_PORT,&GPIO_InitStruct);

    /*设置复用功能*/

    GPIO_PinAFConfig(USART_TX_PORT,USART_TX_PINSOURCE,USART_AF);

    GPIO_PinAFConfig(USART_RX_PORT,USART_RX_PINSOURCE,USART_AF);

}


void USART_Config(void)

{

    USART_InitTypeDef USART_InitStruct;

    /*引脚配置*/

    USART_GPIO_Config();

    /*开串口时钟*/

    USART_CLOCK_Cmd();

    /*

    **波特率115200

    **发送和接收模式

    **无校验位

    **停止位为1

    **8位数据位

    **不使用硬件流

    */

    USART_InitStruct.USART_BaudRate=BAUDRATE;

    USART_InitStruct.USART_Parity=USART_Parity_No;

    USART_InitStruct.USART_StopBits=USART_StopBits_1;

    USART_InitStruct.USART_WordLength=USART_WordLength_8b;

    USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

    USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;

    USART_Init(USART,&USART_InitStruct);

    /*使能串口*/

    USART_Cmd(USART,ENABLE);

}


void USATR_Sendbyte(uint16_t data)

{

    USART_SendData(USART,data);

    while(USART_GetFlagStatus(USART,USART_FLAG_TXE)==RESET);

}


void USART_Sendstring(char *string)

{

    unsigned int i=0;

    do

    {

        USATR_Sendbyte(*(string+i));

        i++;

    } while (*(string+i)!='');


    while(USART_GetFlagStatus(USART,USART_FLAG_TC)==RESET);

}



///重定向c库函数printf到串口,重定向后可使用printf函数


int fputc(int data, FILE *f)

{

/* 发送一个字节数据到串口 */

USART_SendData(USART,(uint8_t) data);

/* 等待发送完毕 */

while (USART_GetFlagStatus(USART, USART_FLAG_TXE) == RESET);

return (data);

}


int fgetc(FILE *f)

{

    /*等待接受完毕*/

    while(USART_GetFlagStatus(USART,USART_FLAG_RXNE)==RESET);


    return (USART_ReceiveData(USART));

}

关键字:USART  串口通讯 引用地址:USART——串口通讯

上一篇:RCC 使用HSE/HSI配置系统时钟
下一篇:STM32笔记(六)---GPIO中断EXTI

推荐阅读最新更新时间:2024-11-16 23:15

STM32_ USART输入输出的讲解
今天总结STM32F103串口,以工程实例来讲述。 工程现象: 1.间断发送字符 2.接收中断(接收字符,并发送该字符) 软件工程下载地址(360云盘): https://yunpan.cn/cPEI3zyQ7UqJv访问密码 ee52 讲述分如下几点: 一、串口时钟 这里的“时钟配置”函数在bsp.c文件下面; 使能串口1(RCC_APB2Periph_USART1)时钟。 二、USART1引脚配置 这里的“USART1引脚配置”函数在usart.c文件下面; 初始化串口使用引脚, 包含端口引脚、频率、输出类型。 三、串口配置 这里的“串口配置”函数在usart.c文件下面; 详见每一句后面都有注释。
[单片机]
STM32_ <font color='red'>USART</font>输入输出的讲解
STM32入门学习之USART中断(STM32F030F4P6基于CooCox IDE)
#include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_usart.h #include stm32_lib/inc/stm32f0xx_misc.h #include delay.h int main(void) { //1、使能时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2
[单片机]
stm32f103 USART串口简单实现
(基于奋斗stm32_v5开发板) 1、创建工程并编写C程序 #include stm32f10x.h #include stdarg.h void USART1_Config() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 使能USART1的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE); /*配置USART1 TX,并设置为复用推挽输出模式*/ GPIO_In
[单片机]
stm32f103 <font color='red'>USART</font>串口简单实现
STM32之关于USART以及波特率的一些思考
一、UART与USART?   UART:通用异步收发器    USART:通用同步和异步收发器   同步:发送端发送数据后,接收端回应后才发下一个数据包,是为阻塞模式   异步:发送端发送收据后,不需要等待接收端回应,接着发送下一个数据包,是为非阻塞模式   半双工:允许数据在两个方向上传输,但是某一时间,只允许数据在一个方向上传输   全双工:允许数据同时在两个方向上传输   SPI为同步全双工通信、IIC为同步半双工通信,UART为异步全双工通信、USART为同步或异步通信   UART数据格式:          数据帧格式:开始位、数据位、奇偶校验位、停止位       起始位:开始发送一个字节数据,数据线为逻辑0状态
[单片机]
STM32之关于<font color='red'>USART</font>以及波特率的一些思考
STM32的USART DMA传输(转)
问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目(这些都是理所当然的),但是在开始调试的时候,遇到了一些问题,问题如下:当第一次DMA传输完毕,关闭DMA以设置内存地址等,再开启DMA,发现不启动了。 开始是参考了《STM32中文参考手册REV10》,里面的发送步骤如下: 1. 在DMA控制寄存器上将USART_DR寄存器地址配置成DMA传输的目的地址。在每个TXE事件后,数据将被传送到这个地址。 2. 在DMA控制寄存器上将存储器地址配置成DMA传输的源地址。在每个TXE事件后,将从此存储器区读出数据并
[单片机]
STM32F4之USART
STM32F407xx内嵌四个通用同步/异步接收器(USART1,USART2,USART3 和USART6)和两个通用异步收发器(UART4和UART5)。这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能。 USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s。USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO7816兼容)和类似的SPI通信能力。所有接口都可以通过DMA控制器。 这里只使用了两根线的最简单串口设置。 硬件环境:STM32
[单片机]
【STM32学习笔记】USART波特率 vs SPI速率
上一篇学习笔记介绍了USART硬件流控,相信大家理解了为什么要做流控,硬件流控与软件流控的区别,以及硬件流控如何处理。 本篇文章将与大家探讨USART波特率 vs SPI速率。这里提出一个问题,为什么USART的波特率是内核时钟的1/8或者1/16,而SPI最快的频率可以是内核时钟的1/2。 请大家带着这个问题来阅读本文。 串口和SPI内部时钟 在回答上面问题之前,需要先了解STM32内部时钟的概念,尤其是串口和SPI的内部时钟。 STM32里包含有系统时钟、AHB时钟和APB时钟。APB时钟来源于AHB,AHB时钟来源于系统时钟。 从上图中可以看出,时钟就像流水一样,从时钟源汇聚到系统时钟上,再从系统时
[单片机]
秉火429笔记之十四 USART--串口通信
1. 串口通讯协议简介 串口通讯(Serial Communication)是一种设备间常用的串行通讯方式,因为简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 1.1 物理层 串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准 ,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。 两个通讯设备的“DB9接口”之间通过串口信号线建立
[单片机]
秉火429笔记之十四 <font color='red'>USART</font>--串口通信

推荐帖子

一文读懂5G调制【图文并茂 通俗易懂】
大家好,今天我们来聊聊调制。说到调制,大家马上会联想到这些关键词:BPSK、QPSK、调幅、调相、QAM、星座图众所周知,调制和解调是通信基本业务流程中的重要组成部分。没有它们,我们的移动通信根本无法实现。那么,究竟什么是调制?为什么要调制?5G又是怎么调制的呢?接下来,我们逐一介绍。调制是做什么用的呢?让我们看一下生活中的一个例子:我们每天都在出行。出行的时候,我们会根据行程选择适合的交通工具。乘坐不同的交通工具,出行的速度也会
btty038 RF/无线
免费开源1-每日更新:TQ2440Linux系统驱动源码
在此宝地发个帖子,开源TQ2440源码,各位需要的可以下载参考。 免费开源1-每日更新:TQ2440Linux系统驱动源码如果有tiny210的驱动源码多好
Wsanter ARM技术
有没有FSMC的中文文档
FSMC最近看的晕里糊涂的?有没有什么中文文档而且讲清楚一点的呢?有的话,哪位说一说在哪里?有没有FSMC的中文文档如果原版的英文的看得都稀里糊涂..那么翻译出来的中文..那更是云里雾里了..我保证...re免得把大家搞到云里雾里,俺也可以省点事。哈哈,正准备尝试翻译,听了2楼的说法,俺觉得还是不要现呵呵,3L找借口...STM32技术参考手册第18章(FSMC)参考译文
cpx0102 stm32/stm8
【IMMC-DIY激光雕刻机】-铅笔画测试-0.7测试版单驱
本帖最后由kejoy于2015-5-2208:34编辑 请无视纸张上的油污,装配时零件上留下的,铅笔画,这个功能专门设计给小朋友的~~~,原来想是加一个电磁铁做个简易Z轴的,但是买回来的力太小了,用不上~,后面的朋友可以考虑加一个大的电磁阀,然后铅笔画就完美了~。目前可以做‘‘一笔画’’【IMMC-DIY激光雕刻机】-铅笔画测试-0.7测试版单驱不错如何参与啊楼主这么快就做好了?迅速啊,期待活动赶快开展起来,我先报个名啊,切记切记chenzhufly发表
kejoy DIY/开源硬件专区
system power 和 device power 有什么区别
在看pb文档,电源管理中的systempower和devicepower有什么区别?systempower和devicepower有什么区别systempower会影响到整个OS和各个驱动,devicepower只对各自的设备驱动有效。systempower有On,UserIdle,BacklightOff,ScreenOff,Unattended,Resuming,Suspended,ColdReboot,Reboot这几种。devicepower有D0,D1,
yuanyzy 嵌入式系统
51单片机C语言应用程序设计实例精讲
51单片机C语言应用程序设计实例精讲51单片机C语言应用程序设计实例精讲谢谢分享 作为一名DIY电子爱好者,好的资料与资源就是最好的良师,感谢。
wgf_bwm 51单片机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved