热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STM32串口通信:完整指南

众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和

目录

前言

一、通信接口背景知识

1. 并行通信和串行通信

2. 串行通信的分类

 二、STM32的串口通信基础

1. 串口通信接口

2. 串口通信框图

3. 串口通信相关寄存器

4. 波特率计算方法

三、库函数配置

1. 串口配置一般步骤

总结




前言

众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。




一、通信接口背景知识


1. 并行通信和串行通信

所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:


  • 并行通信
  •    -传输原理:数据各个位同时传输。

       -优点:速度快

       -缺点:占用引脚资源多


  • 串行通信
  •    -传输原理:数据按位顺序传输。

       -优点:占用引脚资源少

       -缺点:速度相对较慢


    2. 串行通信的分类

    由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:


  • 单工:数据传输只支持数据在一个方向上传输

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

  • 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
  • 为了清晰的表述这三种传输方向上的区别,我们看下图:
     




    (a)单工通信        (b)半双工通信        (c)全双工通信

    另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。

    同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;

    异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。

    我们以下面的表格来详细对比串行通信接口


     二、STM32的串口通信基础


    1. 串口通信接口

    STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器

    对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:

     这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。

    下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询

     查阅官方手册,UART异步通信方式的特点如下:



    1. 全双工异步通信。

    2. 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s

    3. 可编程的数据字长度(8位或者9位);

    4. 可配置的停止位(支持1或者2位停止位);

    5. 可配置的使用DMA多缓冲器通信。

    6. 单独的发送器和接收器使能位。

    7. 检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志

    8. 多个带标志的中断源。触发中断。

    9. 其他:校验控制,四个错误检测标志。


    2. 串口通信框图

    学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:

     从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。


    3. 串口通信相关寄存器

    STM32串口通信的相关寄存器共有3个,分别是:


  • USART_SR状态寄存器

  • USART_DR数据寄存器

  • USART_BRR波特率寄存器
  • 下面是来自中文参考手册的部分截图介绍:

     

    还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。

    建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。


    4. 波特率计算方法

     这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。



    三、库函数配置


    1. 串口配置一般步骤



    1. 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();

    2. 串口复位:USART_DeInit(); 这一步不是必须的

    3. GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)

    4. 串口参数初始化:USART_Init();

    5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();

    6. 使能串口:USART_Cmd();

    7. 编写中断处理函数:USARTx_IRQHandler();

    8. 串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

    9. 串口传输状态获取:

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

    void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


     




    总结

    这就是关于STM32的串口通信基本知识的介绍,学好这部分知识是日后深入学习STM32的基础,STM32虽然有很多串口,但是具体来说它们的配置过程基本上都是一样的,只不过是引脚不一样而已,希望大家反复学习这部分知识,做到掌握,这是日后深入学习STM32的基础。



    推荐阅读
    • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
    • 深入解析Spring启动过程
      本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
    • Linux环境下进程间通信:深入解析信号机制
      本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
    • 2017-2018年度《网络编程与安全》第五次实验报告
      本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
    • 尾花|花萼_相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)
      尾花|花萼_相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman) ... [详细]
    • QNX 微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。 ... [详细]
    • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
    • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
    • Linux环境下C语言实现定时向文件写入当前时间
      本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
    • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
    • SDN网络拓扑发现机制解析
      本文深入探讨了SDN(软件定义网络)中拓扑发现的原理与实现方法,重点介绍了LLDP协议在OpenFlow环境中的应用,并讨论了非OpenFlow设备存在时的链路发现策略。 ... [详细]
    • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
    • Logback使用小结
      1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
    • 本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html ... [详细]
    • Java项目分层架构设计与实践
      本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
    author-avatar
    用户h7lo5aisfv
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有