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

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

3天内不再提示

USART驱动实验

汽车电子技术 来源:滑小稽笔记 作者:电子技术园地 2023-03-01 16:06 次阅读

6.1 STM32串口简介

在之前的51单片机开发中已经详细地描述过串行通信协议,但是51中的串口有一个缺点,就是为了使用串口的波特率必须将晶振更换为11.0592MHz,如果采用12MHz晶振就会导致波特率误差太大,以致于串口无法正常收发,但是如果使用11.0592MHz晶振又会存在定时器计数误差(即定时器计数不准确),在STM32中很好地解决了这个问题,并且扩展了串口的应用。

   STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。STM32的USART模块结构框图如下图所示。

图片

我们可以从框图发现,STM32的波特率是低4位表示小数部分,高12位表示整数部分,这就是为什么STM32可以在不更换晶振的条件下使用串口通信。

6.2 相关寄存器

6.2.1 控制寄存器USART_CR1

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- UE M WAKE PCE PS PEIE TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK

Bit 13:USART使能

0:USART分频器和输出被禁止

   1:USART模块使能

Bit 12:字长

0:一个起始位,8个数据位,n个停止位

   1:一个起始位,9个数据位,n个停止位

Bit 11:唤醒的方法

0:被空闲总线唤醒

   1:被地址标记唤醒

Bit 10:检验控制使能

0:禁止校验控制

   1:使能校验控制

Bit 9:校验选择

0:偶校验

   1:奇校验

Bit 8:PE中断使能

0:禁止产生中断

   1:当USART_SR中的PE为1时,产生USART中断

Bit 7:发送缓冲区空中断使能

0:禁止产生中断

   1:当USART_SR中的TXE为1时,产生USART中断

Bit 6:发送完成中断使能

0:禁止产生中断

   1:当USART_SR中的TC为1时,产生USART中断

Bit 5:接收缓冲区非空中断使能

0:禁止产生中断

   1:当USART_SR中的ORE或者RXNE为1时,产生USART中断

Bit 4:IDLE中断使能

0:禁止产生中断

   1:当USART_SR中的IDLE为1时,产生USART中断

Bit 3:发送使能

0:禁止发送

   1:使能发送

Bit 2:接收使能

0:禁止接收

   1:使能接收,并开始搜寻RX引脚上的起始位

Bit 1:接收唤醒

0:接收器处于正常工作模式;

   1:接收器处于静默模式

Bit 0:发送断开帧

0:没有发送断开字符

   1:将要发送断开字符

6.2.2 波特率寄存器USART_BRR

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
USARTDIV_Mantissa[11:0] USARTDIV_Fraction[3:0]

Bit 15~Bit 4:波特率整数部分

Bit 3~Bit 0:波特率小数部分

注:波特率的计算公式

图片

6.2.3 数据寄存器USART_DR

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- DATA[8:0]

Bit 8~Bit 0:数据值

包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用TDR,一个给接收用RDR,该寄存器兼具读和写的功能。当USART_CR1PCE位被置位进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。

6.2.4 状态寄存器USART_SR

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CTS LBD TXE TC RXNE IDLE ORE NE FE PE

Bit 9:CTS标志(如果设置了CTSE位,当nCTS输入变化状态时,该位被硬件置高,由软件将其清零)

0:nCTS状态线上没有变化

   1:nCTS状态线上发生变化

Bit 8:LIN断开检测标志(当探测到LIN断开时,该位由硬件置1,由软件将其清零)

0:没有检测到LIN断开

   1:检测到LIN断开

Bit 7:发送数据寄存器空

当TDR寄存器中的数据被硬件转移到移位寄存器时,该位被硬件置位,对USART_DR的写操作,将该位清零。

   0:数据还没有被转移到移位寄存器

   1:数据已经被转移到移位寄存器

Bit 6:发送完成

当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。然后写入USART_DR清除该位。

   0:发送还未完成

   1:发送完成

Bit 5:读数据寄存器非空

当数据被转移到USART_DR寄存器中,该位被硬件置位。对USART_DR读操作可以将该位清零。

   0:数据没有收到;

   1:收到数据,可以读出

Bit 4:检测到总线空闲

当检测到总线空闲时,该位被硬件置位,则产生中断。先读USART_SR,然后读USART_DR清除该位。

   0:没有检测到空闲总线

   1:检测到空闲总线

Bit 3:过载错误

当RXNE仍然是1的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬件将该位置位,先读USART_SR,然后读USART_CR清零。

   0:没有过载错误

   1:检测到过载错误

Bit 2:噪声错误标志

在接收到的帧检测到噪音时,由硬件对该位置位。先读USART_SR,再读USART_DR清0。

   0:没有检测到噪声

   1:检测到噪声

Bit 1:帧错误

当检测到同步错位,过多的噪声或者检测到断开符,该位被硬件置位。先读USART_SR,再读USART_DR清零

   0:没有检测到帧错误

   1:检测到帧错误或者break

Bit 0:校验错误

在接收模式下,如果出现奇偶校验错误,硬件对该位置位。依次读USART_SR和USART_DR清零,在清除PE位前,软件必须等待RXNE标志位被置1。

   0:没有奇偶校验错误;

   1:奇偶校验错误

6.3 printf函数重映射

学习C语言的时候会经常用到一个函数,就是格式化输出printf,这个函数的源代码如下所示。

图片

从上图可以看出来,printf函数实际上的核心是putchar函数,在KEIL中,由于我们使用了MicroLIB,所以putchar函数改为了fputc函数,此时,我们只需要修改fputc函数就可以完成printf重定向,重定向代码如下图所示。

图片

6.4 串口例程

使用printf函数将串口接收到的字符串发送出去。

(1)底层寄存器文件stm32f10x.h添加串口寄存器地址。

图片

图片

图片

(2)在SYSTEM目录下新建usart1目录,并在usart1目录下新建usart1.c和usart1.h两个文件。

图片

(3)将usart1.c和usart1.h两个文件加入工程。

图片

图片

(4)在usart1.c文件内写入以下代码。

图片

图片

(5)在usart1.h添加以下代码。

图片

(5)在1.c文件中添加以下代码。

图片

6.5 实验结果

图片

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

    关注

    269

    文章

    5648

    浏览量

    120692
  • 波特率
    +关注

    关注

    2

    文章

    280

    浏览量

    33758
  • 串行通信协议

    关注

    0

    文章

    12

    浏览量

    7594
收藏 人收藏

    评论

    相关推荐

    如何使用stm32核心板进行USART串口通信的实验

    如何使用stm32核心板进行USART串口通信的实验
    发表于 12-06 07:23

    如何完成STM32的USART窗口通讯实验

    寄存器与基于固件库编程方式的差异在哪?如何完成STM32的USART窗口通讯实验
    发表于 02-24 07:35

    CH32V103基础教程92-USART-奇偶校实验

    本章教学使用串口1(USART1)进行串口通信过程中的奇偶校试。 1、USART校园实验控制简介通过设置USART控制寄存器1(USARTx_CTLR1)的10位PCE使能开启奇偶校试
    发表于 05-11 16:09

    GD32-Colibri-F207实验板RAM-USART

    GD32-Colibri-F207实验板RAM-USART,很好的GD32资料,快来学习吧。
    发表于 04-21 10:49 7次下载

    实验四 异步收发器(USART

    嵌入式异步收发器(USART
    发表于 12-17 20:48 12次下载

    STM32的USART窗口通讯程序

    !”,上位机接收程序可以使用“串口调试助手“,也可自己编程。3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。实验步骤安装usb转串口的驱动总结参考STM32串口通信USART学习笔记...
    发表于 12-07 11:06 3次下载
    STM32的<b class='flag-5'>USART</b>窗口通讯程序

    基础实验13-USART串口接收实验

    基础实验13-USART串口接收实验实验目的:掌握定时器USART接收字符串的方法。实验现象:打
    发表于 12-14 18:53 1次下载
    基础<b class='flag-5'>实验</b>13-<b class='flag-5'>USART</b>串口接收<b class='flag-5'>实验</b>

    16 . USART 串口通信实验

    USART 串口通信实验我们知道STM32F1 内部含有非常多的通信接口,我们就来学习下USART 串口通信。要实现的功能是:STM32F1 通过USART1 实现与PC 机对话,ST
    发表于 12-20 19:22 20次下载
    16 . <b class='flag-5'>USART</b> 串口通信<b class='flag-5'>实验</b>

    外设资源实验6-USART2的DMA收发实验

    外设资源实验6-USART2的DMA收发实验实验目的:掌握USART2的DMA接收方式。实验现象
    发表于 12-20 19:38 1次下载
    外设资源<b class='flag-5'>实验</b>6-<b class='flag-5'>USART</b>2的DMA收发<b class='flag-5'>实验</b>

    《STM32从零开始学习历程》——USART串口通讯实验篇2——指令控制LED灯实验

    《STM32从零开始学习历程》@EnzoReventonUSART串口通讯实验篇2——指令控制LED灯实验实验是在《USART串口通讯实验
    发表于 12-24 18:58 9次下载
    《STM32从零开始学习历程》——<b class='flag-5'>USART</b>串口通讯<b class='flag-5'>实验</b>篇2——指令控制LED灯<b class='flag-5'>实验</b>

    关于使用stm32核心板进行USART串口通信的实验

    目录一、关于串口通信1.串口通信2.USART二、USART串口通信程序1.准备工作2.实验要求3.实验代码4.代码所实现的功能及原理5.实验
    发表于 12-24 19:00 0次下载
    关于使用stm32核心板进行<b class='flag-5'>USART</b>串口通信的<b class='flag-5'>实验</b>

    USART的使用

    USART1_Init(115200); //串口初始化(参数是波特率)/* 发送方法1 */ USART_SendData(USART1 , 0x55); //发送单个数值 while
    发表于 12-28 19:00 10次下载
    <b class='flag-5'>USART</b>的使用

    STM32F103中断串口通信USART

    本文基于笔者之前的博客STM32F103串口通信USART小试牛刀,在此基础上,加上中断函数,并补充HAL函数实现。文章目录一、实验原理二、实验代码1.库函数2.HAL库函数三、实验
    发表于 01-14 10:39 24次下载
    STM32F103中断串口通信<b class='flag-5'>USART</b>

    STM32入门学习笔记之USART驱动实验(上)

    在之前的51单片机开发中已经详细地描述过串行通信协议,但是51中的串口有一个缺点,就是为了使用串口的波特率必须将晶振更换为11.0592MHz,如果采用12MHz晶振就会导致波特率误差太大,以致于串口无法正常收发,但是如果使用11.0592MHz晶振又会存在定时器计数误差(即定时器计数不准确),在STM32中很好地解决了这个问题,并且扩展了串口的应用。
    的头像 发表于 02-16 10:08 451次阅读
    STM32入门学习笔记之<b class='flag-5'>USART</b><b class='flag-5'>驱动</b><b class='flag-5'>实验</b>(上)

    STM32入门学习笔记之USART驱动实验(下)

    在之前的51单片机开发中已经详细地描述过串行通信协议,但是51中的串口有一个缺点,就是为了使用串口的波特率必须将晶振更换为11.0592MHz,如果采用12MHz晶振就会导致波特率误差太大,以致于串口无法正常收发,但是如果使用11.0592MHz晶振又会存在定时器计数误差(即定时器计数不准确),在STM32中很好地解决了这个问题,并且扩展了串口的应用。
    的头像 发表于 02-16 10:08 510次阅读
    STM32入门学习笔记之<b class='flag-5'>USART</b><b class='flag-5'>驱动</b><b class='flag-5'>实验</b>(下)