STM32笔记 (九)串口通讯USART(串口发送接收编程)

发布者:紫色小猫最新更新时间:2021-10-31 来源: eefocus关键字:STM32  串口通讯  USART  串口发送 手机看文章 扫描二维码
随时随地手机看文章

简介

串口USART(Universal Synchronous Asynchronous Receiver and Transmitter)也叫通用同步异步收发器,是单片机与外部进行信息交互的重要通信接口,属于单片机的一种外设,几乎所有单片机都支持使用串口通讯,同时也是单片机程序调试的一种重要手段,对于STM32,串口资源非常丰富,功能也比较齐全,以STM32F103ZET6为例,就提供了5路的串口,我们一般用把串口用来在电脑的串口调试工具上打印调试信息,从而了解程序运行是否正确、如果出错的话也能知道是哪里出了错误。


通讯的有关概念

并行通讯

并行就是采用多条数据线进行通讯

优点是传输速度快,缺点是占用的引脚资源多

在这里插入图片描述

串行通讯

数据按位顺序传输,需要的信号线相比于并行通信来说少了很多,最简单的只需要三根线:RXD,TXD,GND,显然这种通讯方式的优点是占用的引脚资源少,缺点是传输速率不高

在这里插入图片描述

单工

数据传输只支持数据在【一个方向上】传输

在这里插入图片描述

半双工

允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是【一种切换方向】的【单工通信

在这里插入图片描述

全双工

允许数据【同时在两个方向上传输】,因此,全双工通信是【两个单工通信方式的结合】,它要求发送设备和接收设备都有独立的接收和发送能力

在这里插入图片描述

同步通讯

带【时钟同步信号】传输

如IIC通讯需要两根线,一根是SDA数据线,一根是SCL时钟线


异步通讯

【不带】【时钟同步】信号

也就是发出的信号可以不受时钟线的约束


USART的寄存器

状态寄存器(USART_SR)

数据寄存器(USART_DR)

波特比率寄存器(USART_BRR)

控制寄存器 1(USART_CR1)

控制寄存器 2(USART_CR2)

控制寄存器 3(USART_CR3)

保护时间和预分频寄存器(USART_GTPR)

USART的功能框图

在这里插入图片描述

初始化结构体中的各种参数

typedef struct {

uint32_t USART_BaudRate; // 波特率

uint16_t USART_WordLength; //数据字长

uint16_t USART_StopBits; // 停止位

uint16_t USART_Parity; // 奇偶校验位选择

uint16_t USART_Mode; // USART 模式

uint16_t USART_HardwareFlowControl; // 硬件流控制

} USART_InitTypeDef;


波特率

波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,

单位为波特,指的是一个设备在一秒钟内发送(或接收)了多少码元的数据(码元:又叫码率,单位为波特,一个脉冲信号就是一个码元),这里简单理解为传输数据的速率,波特率的计算有一个固定的公式

在这里插入图片描述

这里的fck是USART的时钟频率,一般是72MHz,USARTDIV是一个与波特率寄存器(USART_BRR)有关的数,波特率寄存器有16个位,前4个位用于配置USARTDIV的小数部分,后12个位用于配置整数部分,我们可以根据所需要配置的波特率从而算出USARTDIV的值,进而配置波特率寄存器的值


数据字长

可以选择8 位或 9 位,具体选择多少位要看后面检验位,如果开启了奇偶校验,那么就选9位,如果没有的话就选8位,也就是一个bit


停止位

串口在传输完数据的时候会有停止信号,这里设置的就是停止信号的长度,可选 0.5 个、 1 个、 1.5 个和 2 个停止位,一般选择1位


奇偶校验位选择

假设传输的数据位:1 1 1 0

那么偶校验位会根据数据位中的 1 的个数是否为偶数来补位(补成偶数个1),如果前面1是三个 那么此时偶校验位为 1 加起来一共有四个 1 是偶数,这时候偶校验位的值就为1

奇校验位的原理则与之相反


USART 模式

模式分为:接收模式,发送模式,如果不设置默认不能接收和发送,一般在设置的时候设置成两种模式都开,也就是收发模式


硬件流控制

很少用到,一般设置成无硬件数据流控制


初始化USART的流程

在这里插入图片描述

其中串口的接收端模式配置成浮空输入,输出端配置成复用推挽输出,为什么这样配置呢?具体怎么配置可以在参考手册的这里找到

使用串口在串口调试助手上输出HELLO WORLD

#include "stm32f10x.h"


void NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}


void USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

// 打开串口 GPIO USART1 的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//GPIOA_9  USART1 TX 配置为推挽复用模式

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//GPIA_10 USART1_RX 配置为浮空输入模式

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//配置USART1的参数

USART_InitStructure.USART_BaudRate = 115200;// 配置波特率

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置硬件流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 配置工作模式,收发一起

USART_InitStructure.USART_Parity = USART_Parity_No;//配置校验位

USART_InitStructure.USART_StopBits = USART_StopBits_1;//配置停止位

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//配置数据字长

USART_Init(USART1, &USART_InitStructure);// 完成串口的初始化配置

NVIC_Config();//配置NVIC

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断

USART_Cmd(USART1, ENABLE);// 使能串口

}


//发送一个Byte

void Usart_SendByte( USART_TypeDef * USARTx, uint8_t ch)

{

USART_SendData(USARTx,ch); //发送一个字节数据到 USART

while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待发送数据寄存器为空

}


//发送一个字符串

void USART_SendStr(USART_TypeDef *USARTx,uint8_t *str)

{

uint8_t i = 0;

do

{

Usart_SendByte(USART1,*(str+i));

i++;

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

//等待发送完成

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

}


int main(void)

{

USART_Config();

USART_SendStr(USART1,"HELLO WORLD!");

while(1)

{

}

}


void USART1_IRQHandler(void)

{

uint8_t ucTemp;

if (USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) 

{

ucTemp |= USART_ReceiveData( USART1 );

}

USART_SendStr(USART1,"n收到!");

}


在STM32中使用printf,putchar,scanf,getchar等函数

我们知道这几个函数是在C语言头文件stdio.h中的,由于我们使用的是运行于STM32的C语言,所以这几个函数并不能使用,但是现在我们会使用串口,而串口可以在串口调试工具中输出调试信息,出于习惯我们如果想使用这几个函数必须重定向这几个函数,具体步骤如下:


声明头文件

#include “stdio.h”


使用以下函数对这四个函数进行重定向

//发送数据

int fputc(int ch, FILE *f) 

USART_SendData(USART1, (unsigned char)ch);// USART1 可以换成 USART2 等其他串口 

while( !USART_GetFlagStatus(USART1,USART_FLAG_TXE) ); //等待数据被转移到移位寄存器

return (ch); 

}

 

// 接收数据 

int GetKey (void)  

{  

while( !USART_GetFlagStatus(USART1,USART_FLAG_RXNE) ); //等待读数据寄存器接收到数据

return ((int)(USART1->DR & 0x1FF)); //数据寄存器有9位,这里取出9位

 } 


在工程属性的 “Target" > “Code Generation” 选项中勾选 “Use MicroLIB”

在这里插入图片描述

如何在打印出数据后换行

在字符串后面加上rn即可换行,即


printf("字符串rn");

关键字:STM32  串口通讯  USART  串口发送 引用地址:STM32笔记 (九)串口通讯USART(串口发送接收编程)

上一篇:STM32串口实验中重定向c库中的printf()函数和scanf()函数
下一篇:STM32:重定向 prinft 和 getchar 函数,但是使用过程串口出现问题

推荐阅读最新更新时间:2024-11-17 02:10

秉火429笔记之一初识STM32
1. STM32概述 STM32,ST为意法半导体,M是Microelectronics的缩写,32表示32位,简而言之,STM32即为ST公司开发的32位微控制器。 2. STM32分类 STM32包含多个系列,从内核分为Cortex-M0、M3、M4、M7,每个内核有大概分为主流、高性能和低功耗。 3. STM32命名规则
[单片机]
秉火429笔记之一初识<font color='red'>STM32</font>
STM32串口通迅–使用中断方式
在上一节串口通讯中使用了查询方式, 在少量数据传输应用中, 这种方法基本可行, 但如果通迅数据量比较大的话会对系统实时性造成很大的影响, 所以在实际工程运用中, 查询的方法并不多见. 一个较好的方法就是利用空间换时间, 用一个缓存区加中断进行数据发送和接收, 以减少不必要的等待的时间, 提高系统的实时性. 为了提高空间利用率, 最常用的方法是采用一个环形队列做为接收/发送缓存, 配合中断, 可很好的完成数据接收/传送, 在时间和空间中取得一个平衡. 有关环形队列的知识, 这里不多做介绍, 可参考相关资料. 使用环形队列做为缓存. 发送逻辑: 当有一个字符串要发送时, 待发送的字符串送入FIFO缓存, 然后打开串口中断, 在中断
[单片机]
STM32中flash的读写详解
一:对STM32内部FLASH写进行编程操作,需要遵循以下流程:   1.FLASH解锁   2.清除相关标志位   3.擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)   4.写入FLASH   5.锁定FLASH (1)获取状态:FLASH_Status FLASH_GetStatus(void); 返回值是通过枚举类型定义的。 typedef enum { FLASH_BUSY = 1, //忙 FLASH_ERROR_PG, //编程错误 FLASH_ERROR_WRP, //写保护错误 FLASH_COMPLETE, //操作完成 FLASH_TIMEOUT /
[单片机]
STM32 在keil下进行strtol函数的功能测试
STM32 在keil下进行strtol函数的功能测试 源码: void test_str2num_strtol(void) { int a; printf( rnrn0x1234 = %d, ,strtol( 0x1234 ,NULL,0)); printf( rn1234 = %d, ,strtol( 1234 ,NULL,0)); printf( rnHex:1234 = %d, ,strtol( 1234 ,NULL,16)); printf( rn0 = %d, ,strtol( 0 ,NULL,0)); printf( rn01234 = %d, ,strtol( 01234 ,NULL
[单片机]
ST 扩大STM32生态系统加快基于STM32U5 极低功耗微控制器的开发
意法半导体扩大STM32生态系统,加快基于STM32U5 极低功耗微控制器的应用开发 2021 年 10 月 11 日,中国——意法半导体推出新的STM32Cube 软件包和开发工具以及评估板,加快使用最新的 STM32U5微控制器(MCU) 的应用项目开发,新微控制器和评估板现已准备好投放大众市场,授权代理商有现货供应。 STM32U575 和STM32U585整合安全和节能创新技术与最新的 Arm® Cortex®-M33 core内核的更高性能和能效,片上闪存最高容量达到2MB,典型目标应用包括智能联网消费产品,例如,活动跟踪器和智能手表,以及智能家居设备、水电气表、工业传感和信号调理设备、移动销售 (POS)
[单片机]
ST 扩大<font color='red'>STM32</font>生态系统加快基于STM32U5 极低功耗微控制器的开发
基于stm32的异步电机反嵌绕组检测方法
  文章通过程序控制stm32芯片产生PWM方波使电机带动永磁体旋转,其定子绕组上感应出的电压信号通过装置中包括的巴特沃斯二阶低通滤波器,并且再通过带偏置的反相比例放大器。将滤波后的信号输入装置中,通过对所采集信号的采集、判读,检测是否存在反嵌绕组。通过实验研究后表明,该研究成果在电机不通电的情况下以最简单的方法完成对定子是否存在反嵌绕组的检测。   1.引言   电机是在工业生产过程中普遍使用的装置,电机的故障往往会带来严重的后果与损失。定子绕组是三相异步电动机的主要组成部分,也是电动机最容易损坏而造成故障的部件。异步电机在生产过程中,由于生产工人的失误,有可能发生定子绕组反嵌的现象,发生电动机启动困难,三相电流严重失衡且电
[单片机]
基于<font color='red'>stm32</font>的异步电机反嵌绕组检测方法
ATmega32 USART的初始化
ATmega32 在进行通信之前首先要对 USART 进行初始化。初始化过程通常包括波特率的设定,帧结构的设定,以及根据需要使能接收器或发送器。对于中断驱动的 USART 操作,在初始化时首先要清零全局中断标志位 ( 全局中断被屏蔽 )。 重新改变 USART 的设置应该在没有数据传输的情况下进行。TXC 标志位可以用来检验一个数据帧的发送是否已经完成, RXC 标志位可以用来检验接收缓冲器中是否还有数据未读出。在每次发送数据之前 ( 在写发送数据寄存器 UDR 前 )TXC 标志位必须清零。 以下是 USART 初始化程序示例。例程采用了轮询 ( 中断被禁用 )的异步操作,而且帧结构是固定的。波特率作为函数参数给出。在汇编程序里
[单片机]
ATmega32 <font color='red'>USART</font>的初始化
基于STM32的传感器接口模块的设计
摘要:基于STM32实现了电流型、电压型以及数字IO型传感器接口模块;进行了接口模块的软件设计,说明了详细的固件代码设计。除传统串口外,提供以太网接口,嵌入UDP协议,提供后期开发的便利接口。 关键词:信号接口;传感器接口模块;UDP协议 0 引言 物联网将会是未来很长一段时间内IT产业的发展趋势,一个完整的物联网系统的构成或产业链的划分,目前业界比较统一的观点基本都认为应该包括三个层面:末端设备或子系统、通信连接系统、以及管理和应用系统。即Device-设备、Connect-连接和Manage-管理。由于数字整合的需求日益增长,对作为感知层核心组成元素的传感器数据融合提出了更高要求。如何将传感器连入网络成为一个尤其重要的问题
[工业控制]
基于<font color='red'>STM32</font>的传感器接口模块的设计

推荐帖子

【FAQ】TE直播:未来感知 由我先知-传感器在物联网中的最新应用
直播主题:未来感知由我先知-传感器在物联网中的最新应用内容简介:传感器在IIoT,IoMT及个人IoT中应用复合式传感器和无线传感器TEConnectivity简介直播讲师:江荣TEConnectivity传感器事业部亚太区市场经理直播FAQ摘录:1、TE在物联网应用有哪些传感器?A:压力传感器,温度传感器,位置传感器,振动传感器等,具体可以访问以下网址具体了解TE的传感器和解决方案https://www.
EEWORLD社区 传感器
分享一个下几种直流电机驱动电路图及设计思路(转)
以上是直流电机驱动电路图,下面为您详细介绍直流电机驱动设计需要注意的事项,低压驱动电路的简易栅极驱动、边沿延时驱动电路图解及其设计思路。  一、直流电机驱动电路的设计目标  在直流电机驱动电路的设计中,主要考虑一下几点:  1.功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动电机即可,当电机需要双向转动时,可以使用由4个功率元件组成的H桥电路或者使用一个双刀双掷的继电器。如果不需要调速,只要使用继电器即可;但
赵玉田 电机驱动控制(Motor Control)
wince windows mobile 有没有显示图象(png,tiff,...)的开源库?
wincewindowsmobile有没有显示图象(png,tiff,...)的开源库?wincewindowsmobile有没有显示图象(png,tiff,...)的开源库?CE下有,在我eeworld的BLOG可以找到cximage
shufuwu WindowsCE
嵌入式linux应用开发完全手册
嵌入式linux应用开发完全手册好书,不过只有15-20章啊。。。。。求第25章qtopia的移植Re:嵌入式linux应用开发完全手册查找中。。。。。。。Re:嵌入式linux应用开发完全手册支持加感谢,感谢加支持!Re:嵌入式linux应用开发完全手册呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样呵呵看看看怎么样看看怎么样看看怎么样看看怎么样看
daicheng Linux与安卓
低速CAN vs 高速CAN
低速高速的差别,听名字大家都知道,速度肯定有差别。其实物理层上还有很大差别,HS-CAN,和LS-CAN也是独立的,所以选CANtransceiver的朋友要注意了低速CAN高速CANISO11898-211898-3Speed(bps)Domaint(V)H=4VH=3.5L=1VL=1.5单线传送可不推荐低速CANvs高速CAN楼主有没有如今主流汽车
5525 汽车电子
功率放大器经典实验案例——电磁炮!
功率放大器经典实验案例电磁炮!电磁炮模型轻松复刻,威力超大!功率放大器经典实验案例——电磁炮!那是功率放大器么?为电容充电的是个直流电源吧? 您好,是功率放大器标记一下,后面用到了好学习学习,非常感谢分享,好人一生平安! 感谢支持~
aigtekatdz 测试/测量
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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