STM32串口驱动

2023-05-16

首先了解串口通信的一些基本原理:

⚫ 串口通信: 串口通信是指数据通过一条数据线(或者两条差分线)一位接着一位的传输出去。串口通信的优点是占用硬件资源少,且传输距离较远,缺点是传输速度慢(这些优缺点都是相对于并口通信而言,其实在平时应用中串口的通信速度完全能够满足绝大部分通信场景的要求)。

⚫ 并口通信 :并口通信是说通过多条数据线一次性的将数据传输出去,类似于多车道,其优点当然就是传输速度快,但是缺点也很明显,第一它占用更多的硬件资源,第二是它的传输距离短,对 PCB 布线有更高的要求,因为每条数据线如果不等长会导致寄生电容也不同,最终会在数据线之间产生传输延时,导致数据传输失败。并口一般应用在 LCD 显示和快速存储设备上面。 

⚫ 单工通信 :单工通信是指无论在何时数据的流向是单向的,接收端只负责接收不具备发送功能,发 送端只负责发送,不具备接收功能。

⚫ 半双工通信 :半双工通信是指数据传输方向是双向的,但是在同一时刻只允许数据单向传输,比如 UART 和 IIC

⚫ 全双工通信 :全双工通信则支持在同一时刻数据可以双向传输,比如 SPI

⚫ 同步通信方式: 同步通信方式是指收发双方之间通过一条时钟信号线来同步数据的传输,在发生传输时 必须在时钟线的同步下将数据一位一位的传输出去,这种方式传输速度较快,但是因为时钟和数据线是单独分开的,因此它的传输距离较近,典型的应用就是 IIC 和 SPI,他们都有一 条时钟线来同步数据线上的位传输。

⚫ 异步通信方式: 异步通信方式是指,收发双方没有数据线同步,要通过特定的起始以及停止标志位来判 断此时数据是否开始传输以及是否传输完成。另外异步通信的收发双发要保证通信速度的统 一,典型的就是 UART,RS485 等。 

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传 输器)属于异步串行通信,UART 是平时使用最多的一个串行通信方式,主要应用场景如 下:

1. 用于打印程序调试信息 (需要重定向)

2. 和上位机配套软件通信,使得我们可以通过上位机来查看或者设置下位机 (人机交互)

3. 用于 ISP 或者 IAP 程序下载(串口收发数据)

STM32F103RCT6 系统控制器有三个 USART 和两个 UART,其中 USART1 和时钟来源于 APB2 总线时钟,其最大频率为 72MHz,其他四个的时钟来源于 APB1 总线时钟,其最大频率为 36MHz。UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。

STM32F103C8T6 单片机有三个 USART,USART 和 UART 的区别在于 USART 支持同步模式,在同步模式下有一个时钟信号线用于同步数据,但是我们平时使用的都是 UART 的异步通信,可以说 UART 是 USART 的一个子集,除此之外 STM32 的 USART 还支持 LIN(局部互连网),智能卡协议和 IrDA SIR ENDEC 规范,但是平时用的最多就是 UART,

那么要想使用 UART,就必须确保收发双方的通信约定要一致,这些约定包括:波特率(通信速度),数据位(8 位或 9 位),停止位个数(1 位,1.5 位,2 位),校验方式(奇校验, 偶校验,无校验)。波特率就是要制定双方通信的速度,我们经常使用的波特率有(1200,2400,4800,9600,115200),波特率越大,传输速度就越快。数据位就是我们想要传输的有效数据的部分,因为一 个字节是 8 位,因此经常使用的也是 8 位数据位,一般 9 位数据位的应用场合有以下几种:

1. 8 位数据的扩展(8 位可以表示 256 种可能,9 位可以表示 512 种可能)

2. 使用第 9 位来表示此时数据传输的模式,第九位为 1 代表此时是读模式,为 0 表示是写模式。

3. 使用第 9 位作为负数,例如第 9 位为 1 表示-,第 9 位为 0 表示+

另外停止位,停止位是双发通信的结束标志,常用的是1位停止位,最后是校验方式,校验可以保证数据传输的正确性、完整性,但是会增加数据帧的长度,通常我们使用无奇偶校验。(只能够知道错误,不能修改错误) 

来源STM32F10XXX参考手册:

        串口规定每次只发送一个字节,因为我们知道串口是通过bps时间差从而得到的高低电平(0,1)的切换的,每次发送一个字节就可以避免形如11111111情况下的累计误差的出现。并且在空闲的时候都是高电平1的,发送数据的时候都是先发低位,再发高位。

下面看一下 STM32中USART 的结构框图:

        UART 由三大部分组成:第一部分就是用于设置和标记传输模式的控制寄存器和标志寄存器部分(黄色高亮区域),第二部分是引脚通信(绿色高亮),该部分和发送/接收移位 寄存器进行连接,第三部分是数据转换部分(蓝色高亮),该部分将发送数据寄存器内的数据通过移位寄存器传输到 TXD 引脚,接收同理。

要想使用 UART,需要先进行配置:

1. 配置 GPIO,TXD 引脚要设置为复用推挽输出,RXD 要设置为浮空输入

2. 配置 UART,包括波特率、数据位、停止位、奇偶校验位以及是否使用硬件流控,硬 件流控通过 RTS 和 CTS 作为流控引脚,我们一般应用是不需要的。

3. 如果想实现串口的发送或接受中断,那么还要设置 NVIC。

串口驱动程序:

         在初始化函数中,依次初始化了用于通信的 TXD 和 RXD 引脚,然后设置了串口的波特率 为 9600,8 位数据位,1 位停止位,无奇偶校验位,无硬件流控,USART_Init()函数用于将 各个设置写到对应寄存器当中,生效设置, USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)函数用于开启 USART 中的某个中断,USART 的中断非常多,有发送数据寄存器空中断,发送完成中断,接收寄存器非空中断等等,这里选择接收寄存器非空中断,它的意思是说当接收数据寄存器中接收到数据后它会产生中断,跳转到对应串口的中断服务函数中,添加这条语句是为下一个串口实验准备的。

 编写中断服务函数发送接收数据:

发送函数:

接收函数:

         USART_SendData()函数用于将参数 byte 填入到发送数据寄存器当中,byte 是 16 位的 原因是 byte 要支持 9 位数据位的情况。 while 循环用于等待这一字节发送完成才结束该函数。USART_FLAG_TC 就是发送完成的标志,如果把该条语句注释掉,就会导致发送不出数据,因为在本次数据还没发送完成时第二次发送任务就又来了(假设是连续发送的场 合),导致数据不停的被刷新。 

串口接发中断服务程序:

注意:正如前面所讲,可以利用串口打印调试的信息,但是前提要对打印函数重定向,有关printf函数的重定向可以看我另一篇文章。 

更多优质文章博客:STM32之串口相关配置_Swiler的博客-CSDN博客_stm32串口配置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32串口驱动 的相关文章

随机推荐

  • 用于评估婴儿认知发展的IMU内嵌式玩具

    0 5岁是神经发育的敏感时期 xff0c 对身心健康至关重要的EF xff08 执行功能 Executive functions xff09 会在这个时期出现 在现代临床和研究实践中 xff0c 编码员通过手动标记视频中婴儿在使用玩具或社交
  • yolo+ocr集装箱字符识别(pytorch版本)

    前言 这个是我们 的大创项目 当我们拿到一份数据集 xff0c 首先就是要对整个项目有个较为清晰的认识 xff0c 整体的思路是什么 xff0c 难点在哪 xff0c 怎么部署和实现 1 整体的思路 xff1a 先通过目标检测网络 xff0
  • ROS话题通信实现发布接收以及vscode编译配置(五)C++版本

    在ROS中每一个功能点都是一个单独的进程 xff0c 每一个进程都是独立运行的 ROS是进程 xff08 也称为Nodes xff09 的分布式框架 因为这些进程甚至还可分布于不同主机 xff0c 不同主机协同工作 xff0c 从而分散计算
  • CMakeList

    目录 1 简介 2 常用命令 2 1 指定 cmake 的最小版本 2 2 设置项目名称 2 3 设置编译类型 2 4 指定编译包含的源文件 2 4 1 明确指定包含哪些源文件 2 4 2 搜索所有的 cpp 文件 2 4 3自定义搜索规则
  • 多旋翼飞行器设计与控制(二)—— 基本组成

    多旋翼飞行器设计与控制 xff08 二 xff09 基本组成 一 机架 1 机身 指标参数 xff1a 重量 xff1a 尽可能轻轴距 xff1a 外圈电机组成圆的直径材料 xff1a 冲碳纤维就完了布局 xff1a 2 起落架 作用 xf
  • 多旋翼飞行器设计与控制(六)—— 动态模型和参数测量

    多旋翼飞行器设计与控制 xff08 六 xff09 动态模型和参数测量 一 多旋翼控制模型 刚体运动学模型 跟质量与受力无关 xff0c 只研究位置 速度 姿态 角速度等参量 xff0c 常以质点为模型 刚体动力学模型 它与一般刚体动力学模
  • 多旋翼飞行器设计与控制(七)—— 传感器标定和测量模型

    多旋翼飞行器设计与控制 xff08 七 xff09 传感器标定和测量模型 一 三轴加速度计 三轴加速度计是一种惯性传感器 xff0c 能够测量物体的比力 xff0c 即去掉重力后的整体加速度或者单位质量上作用的非引力 当加速度计保持静止时
  • 【STM32】stm32通过地址操作寄存器

    stm32通过地址操作寄存器 0x01 stm32数据类型所占字节数0x02 如何查看寄存器地址 xff08 基地址 43 偏移地址 xff09 0x03 操作寄存器地址控制LED闪烁 xff08 代码 xff09 0x04 通过定义结构体
  • ARM裸机开发——启用SDRAM的按键中断控制灯实验

    写在前面 本文承接前文嵌入式系统学习 嵌入式系统 Linux环境搭建和LED灯闪烁实验 以S3C2440A作为开发平台 xff0c 以Linux中ARM Linux gcc交叉编译器作为编译环境进行学习 xff0c 由于本课程为单片机基础的
  • 二维vector

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 13.request-session,验证码

    使用session使得请求变成一个对象 注意登录页面隐藏的参数 爬取古诗文登录页面 span class token keyword import span requests span class token keyword from sp
  • STM32-串口通信(串口的接收和发送)

    文章目录 STM32的串口通信一 STM32里的串口通信二 串口的发送和接收串口发送串口接收 三 串口在STM32中的配置四 串口接收的两种实现方式1 需要更改的地方2 查询RXNE标志位3 使用中断 总结 STM32的串口通信 本文在于记
  • quick sort(c++)以及k选取

    include lt iostream gt include lt vector gt using rank 61 int using namespace std int dash 61 0 int swap vector lt int g
  • STLINK CONNECTION ERROR 问题的解决

    打开STLINK UTILITY 连接芯片也连接不上 在settings里面 选择这个连接模式 xff0c 按下芯片复位键的同时 xff0c 点击连接 st link的灯闪烁红蓝相间的光表示连接成功 松开芯片reset xff0c 既连接成
  • 解决ros2安装出现的问题

    Cannot locate rosdep definition for python3 pytest 解决方法是输入弹幕命令 然后输入安装功能依赖的命令 如果有占用进程问题 xff0c 就重启 http t csdn cn WwqJa
  • conda activate 出错

    问题及解决办法 1 使用conda activate出错 在cmd中使用 conda bat activate 进入环境后在进行操作 2 conda install出错 xff0c 使用pip install 3 在cmd 中使用tenso
  • 树莓派4b 安装ubuntu20.04server和图形化界面遇到的问题

    树莓派安装图形界面参考教程 树莓派4b安装Ubuntu 18 04系统及图形桌面 树莓派4B安装 ubuntu20 04 amp VNC远程桌面 amp 安装ROS noetic 树莓派4b安装Ubuntu和ROS的完整爬坑记录 2021年
  • 【STM32】串口接收任意字符串

    目录 前言cube配置usart h xff1a usart cmain xff1a 效果 前言 之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的 xff0c 他接收到换行符就完蛋了 花了点时间深入研究了一下hal库的串
  • 使用封装的axios发送请求

    使用封装的axios发送请求 1 src api api js 定义请求路由方法 span class token function import span URLS from span class token string 39 conf
  • STM32串口驱动

    首先了解串口通信的一些基本原理 xff1a 串口通信 xff1a 串口通信是指数据通过一条数据线 xff08 或者两条差分线 xff09 一位接着一位的传输出去 串口通信的优点是占用硬件资源少 xff0c 且传输距离较远 xff0c 缺点是