STM32 串口通信USART1的配置和使用

这篇具有很好参考价值的文章主要介绍了STM32 串口通信USART1的配置和使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UART:universal asynchronous receiver and transmitter通用异步收发器
USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器
stm32 usart1,stm32,单片机,嵌入式硬件上图是利用寄存器配置的步骤,下面我用官方库函数配置USART1

1、要配置串口usart1,先查看数据手册以及开发板原理图的芯片管脚stm32 usart1,stm32,单片机,嵌入式硬件
根据上图可以看出USART1的发送线USART_TX连在芯片的PA9管脚,接收线USART_RX连在芯片的PA10管脚
stm32 usart1,stm32,单片机,嵌入式硬件
再根据上图可以看出USART的时钟和GPIOA的时钟都挂在APB2总线上,有了这两条信息我们就可以开始配置的第一步了。
一、首先我们开启PA9和PA10两个IO口的时钟
1、查询开启APB2线上外设时钟的库函数,下图为查询到的结果
stm32 usart1,stm32,单片机,嵌入式硬件
由上图可以看出,此函数的作用是开启或关闭APB2指定线上外设的时钟,那么这两个参数必然包括指定外设和让他使能或失能的标志,使能为ENABLE、失能为DISABLE,剩余的一个参数我们在下面找到外设时钟的标志
stm32 usart1,stm32,单片机,嵌入式硬件
由上图我们看到我们要开启的GPIOA的时钟参数为:RCC_APB2Periph_GPIOA

调用函数并将对应的参数填入
stm32 usart1,stm32,单片机,嵌入式硬件
毛病有不了一点儿。
2、接下来初始化管脚PA9和PA10
同样查询库函数
stm32 usart1,stm32,单片机,嵌入式硬件
上图函数是用来初始化管脚的属性的,两个参数分别是GPIOX,和一个结构体,往下翻可以看到结构体里面要配置的属性,下图示stm32 usart1,stm32,单片机,嵌入式硬件
这个结构体中要配置管脚的属性有,GPIOX的管脚号、管脚输出速率、管脚的输入输出模式。stm32 usart1,stm32,单片机,嵌入式硬件
stm32 usart1,stm32,单片机,嵌入式硬件
stm32 usart1,stm32,单片机,嵌入式硬件
看了上图我们思考一下管脚各自对应的属性,先看PA9(USART_TX串口1的发送管脚),(1)我们自然要选择GPIO_Pin_9这个参数了(2)输出速率我们选择最高速率(3)我们站在单片机的角度来看,发送管脚自然是输出模式了,再有我们需要输出高电平1(3.3V)、低电平0(0V),那么开漏输出模式自然无法满足,因为开漏是无法给出高电平的,具体可以搜索一下CMOS管的开漏,那么为什么要复用呢?看下图可知这个管脚USART还要用到所以要复用一下
stm32 usart1,stm32,单片机,嵌入式硬件
到此初始化PA9管脚的三个参数分别为GPIO_Pin_9、GPIO_Speed_50MHz、GPIO_Mode_AF_PP。知道了这些参数后我们定义一个GPIO_InitTypeDef结构体来容纳这些参数stm32 usart1,stm32,单片机,嵌入式硬件
将参数填入,调用GPIO_Init函数初始化IO口得到下图
stm32 usart1,stm32,单片机,嵌入式硬件
同样的思路,PA10作为串口输入管脚,GPIO_Pin参数选择GPIO_Pin_10,因为是输入模式不需要输出速度,输入模式没有硬性要求,选择浮空输入模式GPIO_Mode_IN_FLOATING
同样的步骤初始化PA10管脚,不再赘述
stm32 usart1,stm32,单片机,嵌入式硬件
二、我们开启USART1的时钟并初始化它
(1)由前面的时钟树可以看出,USART1的时钟也挂在APB2总线上,那么开启时钟
stm32 usart1,stm32,单片机,嵌入式硬件
(2)接着我们要初始化USART1,查询库函数得到下图
stm32 usart1,stm32,单片机,嵌入式硬件
我们要初始化的串口是USART1那么第一个参数当然是USART1,第二个参数是它的一些属性,那么我们看看有哪些属性,下图stm32 usart1,stm32,单片机,嵌入式硬件
我们看第一个参数,波特率,波特率描述的是一秒钟发送的位数(bit),可以自己设定,但是最终要选择和串口软件一样的波特率,这里我就选择115200了stm32 usart1,stm32,单片机,嵌入式硬件
数据长度就是你要发送一次数据的位数了,这里我选择8位;停止位类似与两个人打电话最后说我挂了啊,然后结束通信,这里我选择1位;硬件流控制选择不使用;模式我们既要接收还要发送,所以选择USART_Mode_Rx | USART_Mode_Tx;不使用校验位USART_Parity_No;最后同样初始化一个结构体然后填入对应参数初始化。
stm32 usart1,stm32,单片机,嵌入式硬件
到这里只需要查询到对应功能的函数即可,参数根据库函数手册选择你需要的就行。
上面就是初始化工作,接下来我们开启串口使能(打开串口的开关)。

stm32 usart1,stm32,单片机,嵌入式硬件
要开启的串口是USART1,那么参数选择USART1、ENABLE.

到此基本的串口配置工作完成。接下来我们要进行收发数据操作,那么仅仅配置串口是不行满足这两个操作的。
我们先看一下串口收发数据的操作示意图stm32 usart1,stm32,单片机,嵌入式硬件
可以看出数据收发利用的是同一个数据寄存器(DR)如下图,单片机是从TX口向外发送数据,所以首先可以看出图左为外、图右为内
stm32 usart1,stm32,单片机,嵌入式硬件

1)发送数据流程:
我们需要判断一下发送数据寄存器(TDR)是否为空,如果为空那么我们将数据赋给DR(相当于写入TDR),为什么要判断?这是因为TDR位数有限,满了再写会把数据挤掉导致数据出错。下一步TDR会判断发送移位寄存器是否有数据,如果有数据会等待数据被移走,然后自动将自己的数据写入发送移位寄存器,最后数据通过tx口发送。
2)读取数据流程
外界数据通过RX口进入移位寄存器,移位寄存器将数据进行移位,当寄存器满时移位寄存器自动将数据写入接收数据寄存器(DRD),我们只需要读DR里的内容即可。

明白了这两个流程我们就可以构建自己的读写数据函数了,先写发送数据函数
根据流程,我们需要先判断发送数据寄存器是否为空,怎么判断呢?状态寄存器看下图stm32 usart1,stm32,单片机,嵌入式硬件通过判断状态寄存器的TXE位得出发送寄存器是否为空,也就是TXE=1时可以写入DR
stm32 usart1,stm32,单片机,嵌入式硬件
这里我直接判断寄存器的TXD位是否为0,是0代表还有之前的数据没有移入发送移位寄存器,在此阻塞。其实还可以使用库函数,库函数很方便且可读性较强stm32 usart1,stm32,单片机,嵌入式硬件
stm32 usart1,stm32,单片机,嵌入式硬件
while((USART->SR&(0x1<<6))==0);//寄存器方式
while(USART_ GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//RESET宏定义为0
stm32 usart1,stm32,单片机,嵌入式硬件可以看到下图的两个信号,TXE和TC这里谈一下这两个信号的区别,翻到图248 USART框图看到DR寄存器写入发送数据寄存器,寄存器通过TX口发出数据,那么这两个信号的区别就在TXE是判断发送数据寄存器是否为空,也就是你现在能不能写入DR寄存器,另一个TC是判断发送移位寄存器是否为空(之前的数据发送完毕没有,硬件判断是否能将发送数据寄存器放到发送移位寄存器)
stm32 usart1,stm32,单片机,嵌入式硬件最后调用发送数据库函数USART_ SendData完成自定的发送数据函数stm32 usart1,stm32,单片机,嵌入式硬件
接下来测试一下发送数据函数
stm32 usart1,stm32,单片机,嵌入式硬件
调用函数并打开串口软件连接,注意串口软件右侧的波特率、停止位等信息选择正确。复位后发送一个w,测试结果如下stm32 usart1,stm32,单片机,嵌入式硬件
接下来写接收函数,那么接收函数的条件是什么?就像传球一样,1、对方手里有球才能传给你2、你得知道对方什么时候会传给你。我们先只考虑第一个条件,现在你只需要盯着他手里的球一直等他就行。
那么如何判断第一个条件,翻看USART_SR状态寄存器可知,我们需要判断的位为RXNE,当它为1是我们可以读出数据
stm32 usart1,stm32,单片机,嵌入式硬件
上代码
stm32 usart1,stm32,单片机,嵌入式硬件
当然也可以换成库函数来写
stm32 usart1,stm32,单片机,嵌入式硬件
stm32 usart1,stm32,单片机,嵌入式硬件

		while((USART_GetFlagStatus(USART1,USART_FLAG_RXNE))==RESET);
		data=USART_ReceiveData(USART1);
		USART1_SendData(data);

验证一下stm32 usart1,stm32,单片机,嵌入式硬件
此处有一个问题,如果while(1)里面接收代码下有大量代码的话,会造成数据丢失,因为发送一位数据需要1/波特率秒,这个速度是很快的,但是你接收一位之后还要运行大量代码,这时候后续的数据已经过来了,过来的数据无法接收造成丢失。但是我们一个工程不可能只接受数据,这是不允许的,所以要用到中断来接收。中断在其他文章中再叙述。文章来源地址https://www.toymoban.com/news/detail-755253.html

到了这里,关于STM32 串口通信USART1的配置和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 普中STM32-PZ6806L开发板(HAL库函数实现-USART1 printf+scanf/gets)

    实现printf+scanf/gets通过USART1 的发送接收。 主芯片串口引脚图 我的板子板子自带串口坏掉了, 所以使用USB转TTL线, 连接如下 电路原理图 实物图 scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入,如果你需要读取空格的话可以使用gets或者

    2024年02月04日
    浏览(52)
  • APM32F072单片机进入STOP模式,并通过RTC Wakeup Timer和USART1串口接收事件唤醒

    串口初始化(注意USART1时钟源要选择HSI): 使用power_init函数初始化RTC,然后调用power_enter_stop_mode(n)函数进入STOP模式,n秒后自动唤醒,或由USART1接收唤醒:

    2024年02月13日
    浏览(52)
  • 江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

            使用USART串口通信,通过上位机串口助手发送符串给STM32执行LED灯点亮熄灭操作的流程。         基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。         接下来要进行发送字

    2024年03月21日
    浏览(61)
  • 「STM32入门」USART串口通信

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 本文将介绍USART  概念解释 TX、RX分别是Transmit和Receive的缩写,代表发送、接受数据 全双工的含义是发送线路和接受线路互不影响,可以同时进

    2024年02月06日
    浏览(48)
  • STM32CubeMX实现USART串口通信

    硬件:stm32f103c8t6核心板 软件:STM32CubeMX 6.6.1 keil5 mdk 这里就不再详细介绍了,详细请参考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点

    2023年04月17日
    浏览(57)
  • STM32入门学习之USART串口通信:

    1.串口通信简介:通用异步收发传输器UART(Universal Asynchronous Receiver/Transmitter)是负责处理数据总线和串口之间的串/并通信的设备。UART通信规定了数据帧的格式:起始位、数据位、校验位、停止位等。UART异步通信只需要通信双方设置好数据帧的格式和波特率即可完成通信。因为

    2024年02月16日
    浏览(49)
  • stm32中常见的通信协议之USART(串口)

    USART是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收。 串口的通信速度用波特率来表示,其单位为bps(bit per second)即每秒钟传送bit的数量。 串口规定,数据线在空闲的状态下,必须是置为高电平的状态。 起始信号为低电平,因为串口

    2023年04月08日
    浏览(50)
  • STM32F4 基于USART串口的蓝牙通信

    目录 一、硬件资源 连接方案 其他配置 二、实验原理 基本定义 USART介绍 USART工作原理 数据发送 数据接收 蓝牙HM-10配置 三、代码部分 usart.c usart.h Serial.c Serial.h main.c 结语 STM32F401,OLED,蓝牙hm10 连接方案 设备1的TX与设备2的RX连接,这样设备1发送的数据可以被设备2接收到。

    2024年01月17日
    浏览(49)
  • 【嵌入式学习-STM32F103-USART串口通信】

    4-1 基本流程 4-2 整体代码 4-2-1 main.c 4-2-2 Serial.c 4-2-3 Serial.h 5-1 查询 5-2 中断 5-3 整体代码 5-3-1 main.c 5-3-2 Serial.c 5-3-3 Serial.h 6-1 使用状态机接收数据包的思路 6-2 串口收发HEX数据包 6-2-1 main.c 6-2-2 Serial.c 6-2-3 Serial.h 6-3串口收发文本数据包 6-3-1 main.c 6-3-2 Serial.c 6-3-3 Serial.h 全双工:打

    2024年02月15日
    浏览(61)
  • STM32串口通信中的USART_RecieveData函数分析

    拿这个中断函数为例         很多人可能注意到了接收数据函数的返回类型为无符号短整型,疑惑这里为什么用了一个无符号字符类型变量rec接收。 先看看这个函数的定义         其实,是因为串口设置的字长为8,所以数据寄存器中第八位为0,第0~7位为数据有效位,

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包