【面包】STM32学习笔记(二) --- USART 串口通信学习总结

2023-05-16

tip:如有错误,希望指出,非常感谢!


目录

  • 简介
  • 一、USART是什么?
  • 二、问答
    • 通信方式
    • 1.USART和UART区别
    • 2.单工、半双工、全双工区别
  • 三、代码实验
    • 1、说明
    • 2、代码初始化配置及修改
    • 3、注意点
      • 1、STM32CubeMX 中断处理流程
      • 2、关于HAL_Delay和NVIC中断冲突问题
    • 4、验证
  • 总结
  • 附录|参考


简介

本文主要是对USART知识点的回顾总结,采用刚学习的STM32CubeMX 进行测试学习,对整个学习过程的一个记录总结,方便以后查阅。


一、USART是什么?

       USART全称:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器,是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。一般情况下,我们32单片机的串口通信采用的是UART异步通信,传输时只需配置协议层:波特率、起始位、数据位、奇偶效验位、停止位,只有保持双方数据包的格式要一致,才能正常的接受发数据!(注意:在使用蓝牙模块、WiFi模块等模块时,需要连接一条共地线)


二、问答

通信方式

在这里插入图片描述

1、串行通信

  • 定义:数据按位顺序传输
  • 优点:占用引脚资源少
  • 缺点:传输速率相对较慢

2、并行通信

  • 定义:数据各位同时传输
  • 优点:传输速率相对较快
  • 缺点:占用引脚资源多

1.USART和UART区别

       UART全称:universal asynchronous receiver and transmitter通用异步收/发器,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。
       在异步通讯的情况下,USART是和UART 是没什么区别的;但是在同步通信的情况下,就有一些区别的,因为同步通信是需要依靠时钟来控制实现数据传输的,UART 是不需要时钟信号来同步的异步,全双工串口总线。

2.单工、半双工、全双工区别

  • 单工:数据传输只支持数据在一个方向上传输,一方只能接收信号,另一方只能发送信号。例如:电视机,小米盒子等。
  • 半双工:允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,相当于是可切换的单工。例如:RS-485、I2C、对讲机等。
  • 全双工:允许数据同时在两个方向上传输。例如:USART、SPI、RS232、SPI、手机通话等。

三、代码实验

1、说明

本次实验是通过STM32CubeMX 直接生成初始化代码,不写出整个具体的流程,只说明核心部分。
详细可参考:GPIO为例的STM32CubeMX使用流程  https://blog.csdn.net/weixin_45684469/article/details/122341014)

本次测试实验主要编写一个程序实现开发板与上位机通信,在开发板上电后通过USART发送一串字符串给上位机,然后开发板进入中断接收等待状态,如果上位机有数据发送过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。

思路:
1、使能时钟、初始化USART1、NVIC等生成代码

2、在main函数前,串口初始化后,调用HAL_UART_Receive_IT函数(串口中断模式接收)

3、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据。

2、代码初始化配置及修改

  1. 完成基本的时钟配置 —> 配置USART1 (Asynchronous 异步通信 、 Baud Rate 波特率为 115200 Bits/s、World Length传输数据长度为 8 Bit、Parity 奇偶检验 None,Stop Bits 停止位 1 ,Data Direction接收和发送都使能、Over Sampling 过采样 16倍(增强抗干扰))。
    在这里插入图片描述
    2、调用串口中断模式接收

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数:

  • UART_HandleTypeDef *huart : USART结构体
  • *pData : 接收到的数据存放地址
  • Size : 接收的字节数
    在这里插入图片描述

3、重定义HAL_UART_RxCpltCallback中断回调函数(内容:判断是否为USART1,然后将接收到的数据通过HAL_UART_Transmit函数发回个上位机,然后重新开启串口中断模式接收)
在这里插入图片描述

4、重定向printf、getchar(注意:需要包含#include <stdio.h>)
在这里插入图片描述

3、注意点

1、STM32CubeMX 中断处理流程

在我们使用中断的时候,hal库通过一级级的调用,最终调用到HAL_UART_RxCpltCallback中断回调函数,根据NOTE提示以及在库中该函数带__weak 弱化标识,也就是说我们只需要重新定义该函数,在该函数中重新写中断服务函数就可以了。

/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
这个函数不应该被改变,如果需要使用回调函数,请重新在用户文件中实现该函数。

HAL_UART_Receive_IT(中断接收函数)    --->  USART1_IRQHandler(void)(中断服务函数)   --->    HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数)   --->    UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数)   --->    HAL_UART_RxCpltCallback(huart);(中断回调函数)

2、关于HAL_Delay和NVIC中断冲突问题

问题:调用HAL_Delay卡死,无法进入中断。

分析:由于在使用STM32CubeMX软件配置的时候Time base:Systime tick time的抢占优先级和响应优先级都是0,于我们配置NVIC的两个优先级是一样的,所以会出现HAL_Delay卡死的情况。

解决方案:将NVIC的优先级降低。

4、验证

在这里插入图片描述


总结

本次实验主要是是对USART知识的回顾学习以及测试总结,并通过最近刚学的软件STM32CubeMX进行开发,养成边学习边开发记录的一个习惯。

如有不当之处,欢迎指正。


附录|参考

  • STM32CubeMX项目搭建流程:https://blog.csdn.net/weixin_45684469/article/details/122341014
  • STM32–USART(串口通信):https://blog.csdn.net/zxh1592000/article/details/78656609
  • HAL库USART函数 :https://blog.csdn.net/as480133937/article/details/99073783
  • HAL_Delay与NVIC问题: https://blog.csdn.net/weixin_43892323/article/details/104383560
  • STM32CubeMX实战教程——串口通信 :https://blog.csdn.net/weixin_43892323/article/details/105339949
  • STM32CubeMX学习笔记 :https://blog.csdn.net/weixin_43892323/article/details/105339949
  • 单工、半双工和双工通信:https://blog.csdn.net/iningwei/article/details/100134783
  • 各种通信协议: https://blog.csdn.net/qq_21104377/article/details/107058919
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【面包】STM32学习笔记(二) --- USART 串口通信学习总结 的相关文章

  • STM32学习(7)PWM 输出实验

    脉冲宽度调制 PWM xff0c 是英文 Pulse Width Modulation 的缩写 xff0c 简称脉宽调制 xff0c 是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 简单一点 xff0c 就是对脉冲宽度的
  • STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32软件复位有两种方式 xff08 1 xff09 方式一 xff1a NVIC SystemReset 函数用来复位STM32 注意1 xff1a 从SYSRESETREQ 被置为有效 xff0c 到复位发生器执行复位命令 xff0
  • 一秒钟打印一个100S内的随机数

    1 2 gt Des 一秒钟打印一个100S内的随机数 5 gt Created Time 2021年04月19日 星期一 09时35分27秒 6 7 8 include lt stdio h gt 9 include lt stdlib
  • STM32启动文件学习

    2021 08 09 STM32启动文件学习 启动文件作用 xff1a 初始化堆栈指针SP初始化PC指针初始化中断向量表配置系统时钟调用C库 main函数进入到主程序 启动文件使用的ARM汇编指令 xff1a EQU xff1a 等于 AR
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • python基础知识之开发规范(一)

    1 脚本结构 1 1 头注释 对代码没有用 xff0c 是提供给系统或者解释器使用的 usr bin env 定义 指定路径下的Python解释器 xff0c 已经很少使用 1 2 导入 导入Python的一些功能函数到脚本中 Python
  • vivo真机调试的坑 & adb无线调试

    坑1 xff1a 安装失败 解决方案 xff1a 在工程的gradle properties中加上 android injected testOnly 61 false 坑2 xff1a 总是要输入密码才能安装 解决方案 xff1a 1 开
  • JavaScript --Node,js

    引用系统模块 const http 61 require http 创建 web 服务器 const serve 61 http createServer 当客户端 发送请求的时候 server on require req res 61
  • Cmake 2 静态链接

    代码地址cmake examples 01 basic C static library at master ttroy50 cmake examples GitHub 文件路径这样 cmake文件这样 1 生成静态链接库 2 填充包括目录
  • Cmake 3 动态链接库

    代码地址 cmake examples 01 basic D shared library at master ttroy50 cmake examples GitHub 文件结构 1 添加动态链接库 和静态链接一样 这个add libra
  • PelcoD_协议指令分析

    通过协议收发控制第三方云台转动 一般的云台指令协议格式例如 xff1a span class token comment 发送带正负号的垂直角度 span span class token keyword float span vert a
  • 【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

    Esp32 Arduino 串口中断函数 缓冲区修改 一 前景描述1 遇到的问题2 开发环境 二 解决问题1 示例代码2 代码缺陷2 解决办法 三 最后的话 一 前景描述 最近需要用Esp32上传数据 xff0c 有一块数据采集板 xff0
  • C++程序编译过程

    C 43 43 程序编译的四个步骤 xff1a 编译预处理 xff0c 编译优化 xff0c 汇编 xff0c 链接 编译预处理 xff1a 处理以 开头的指令 xff0c 将源码 cpp 文件处理成 i 文件 编译优化 xff1a 将 i
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • vscode、idea、vim 开发工具快捷键

    vscode vscode快捷键文字版 配置启用 禁用 VSCodeVim 插件的快捷键 xff1a Vim Toggle Vim Mode 项 配置启用 vimrc 文件 idea 配置启用 禁用 Idea Vim 插件的快捷键 xff1
  • TDK一体化 IMU 评估板SmartBug2.0 像七星瓢虫一样可爱

    继 2019 年最初的 SmartBug 取得成功后 xff0c 2023 年 1 月初 xff0c TDK 公司宣布宣布推出 InvenSense SmartBug 2 0 评估板 SmartBug2 0 外观与 SmartBug 相似
  • C++ 指针(二)char与指针

    一 char字符串数组和char指针 上一小节对指针的操作进行简单的介绍 xff0c 本小节主要介绍的是char类型和指针之间的一些联系 xff08 虽然使用std string很方便 xff0c 但是我觉得了解这个还是有必要的 xff09
  • stm32f103单线半双工uart通信程序

    文章目录 前言 一 使用步骤 1 打开STMcubemx 2 添加代码 总结 前言 在使用数字舵机时 所用到的通信方式为uart通信 但舵机只有三根接线 出去vcc和gnd 只有一条通信线 也就是说要实现双向通信 只能使用单线半双工模式 本
  • BlueROV加舵机控制以及走过的弯路

    BlueROV加舵机控制以及走过的弯路 因实验需求 xff0c 需要在BlueROV上加上一个一自由度的机械臂 xff0c 由一个水下舵机控制 xff0c 水下舵机需要通过PWM控制 xff0c PWM输出由手柄控制 思路也很简单 xff1
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s

随机推荐

  • UART、RS232 、RS485 区别

    UART RS232 RS485 区别 UART RS232 RS485这些物理层的串口通信 xff0c 它们都是在同一时间发送一位 RS232 RS485只是串口通讯的变种 xff0c 理解了UART串口通讯 xff0c 那么RS232和
  • 在STM32中使用printf()的方法(可直接复制粘贴)

    1 使用printf的方法 1 1 重定向 在使用printf之前添加重定向代码 xff1a span class token macro property span class token directive hash span span
  • 【字符串】字符串长度与字节长度

    字符串长度 xff1a 字符串在遇到 0 之前一共有几个字符 字节长度 字符串里出现的所有元素 例如 xff1a char str 61 123abc 0123 字符串长度 xff1a 6 字节长度 xff1a 11 PS xff1a 如果
  • C语言-字符串拼接(不用strcat函数)

    include lt stdio h gt int main char str1 100 char str2 100 int i 61 0 j 61 0 printf 34 请输入字符串1 xff1a n 34 gets str1 prin
  • Qt(十四)——实现机器人完整导航功能

    Qt xff08 十四 xff09 实现机器人完整导航功能 目录 1 ui 设计2 核心代码 1 ui 设计 2 核心代码
  • vector容器存放自定义数据类型及指针

    include lt iostream gt using namespace std include lt vector gt class person public person string a int b name a age b s
  • unreal 启动报错:运行引擎需要D3D11兼容GPU(功能级别11.0,着色器模型5.0)处理

    问题 AMD核显电脑 xff0c 突然有一天开机后显示器显示效果发白 xff0c 刚开始没在意 xff0c 后来某天想使用Unreal时发现启动不了了 xff0c 弹窗报错 xff1a 运行引擎需要D3D11兼容GPU xff08 功能级别
  • Win10 RealSense L515 ORBSLAM2 配置全攻略

    目录 背景简介Step 1 准备 SDKStep 2 连接设备Step 3 测试例程Step 4 配置环境Step 5 相机标定Step 6 编写入口Step 7 实地运行附录A xff1a 获取内参代码附录B xff1a yaml 参数文
  • rviz仿真底盘移动与云台击打

    rviz仿真底盘移动与云台击打 底盘与云台通过坐标轴来模拟 xff0c 目标方块与子弹可视化通过marker仿真 其中底盘与云台固连 xff0c 底盘xy方向移动云台会同步移动 xff0c 云台可进行pitch和yaw轴旋转 xff0c 通
  • 机器视觉中坐标系转换

    机器视觉 立体视觉等等方向常常涉及到四个坐标系 xff1a 世界坐标系 相机坐标系 图像坐标系 像素坐标系 整体预览如下 1 世界坐标系和相机坐标系 世界坐标系 xff0c 也称为测量坐标系 xff0c 它是一个三维直角坐标系 Xw Yw
  • 机械臂DH参数总结

    DH参数 DH参数 xff08 Denavit Hartenberg parameters xff09 是一个用四个参数表达两对关节连杆之间位置角度关系的机械臂数学模型和坐标系确定系统 DH选的四个参数都的含义如下 xff1a link l
  • 机器人正解和逆解

    正解FK 给定机器人各关节的角度 xff0c 计算出机器人末端的空间位置 逆解IK 已知机器人末端的位置和姿态 xff0c 计算机器人各关节的角度值 挖个坑待完善
  • LeetCode—232 用栈实现队列 Cpp&Python

    LeetCode 225 用队列实现栈 Cpp amp Python 一 方法与思路二 C 43 43 代码三 Python代码 一 方法与思路 使用栈实现队列的下列操作 xff1a push x 将一个元素放入队列的尾部 pop 从队列首
  • E: Unable to locate package解决办法

    问题 xff1a E Unable to locate package 解决 xff1a sudo apt span class token operator span get updade
  • Yolo框架简介

    YOLO xff08 You Only Look Once xff09 是一种基于深度神经网络的对象识别和定位算法 xff0c 其最大的特点是运行速度很快 xff0c 可以用于实时系统 现在YOLO已经发展到v4版本 论文地址 xff1a
  • Ubuntu下编辑权限只读文件的方法

    首先要注意的是只读文件一般都是系统文件 xff0c 或者软件配置文件 xff0c 修改时要尤其谨慎 本文提供两种方法 xff1a 方法一 首先安装一个插件 span class token function sudo span apt sp
  • Ros下Aruco模块的使用

    生成ARUCO ROS MARKER 链接 http chev me arucogen 首先启动ros roscore 打开相机节点 xff0c 在此提供usb相机与Realsense D435i的启动方法 xff1a roslaunch
  • 脚气、灰指甲治疗实验方案

    脚气 xff08 已临床实验 xff09 脚气 xff0c 又叫足廯 香港脚 糜烂性脚气 症状 xff1a 80 都是这种类型 常见于多汗人群 角质层被汗水浸软 xff0c 发白了以后 xff0c 走动不断摩擦表皮脱落 xff0c 露出鲜红
  • VS2015显示“正在从以下位置加载符号“的解决办法

    解决方法 xff1a VS 工具 选项 调试 符号 看到 MicroSoft符号服务器 xff0c 去掉方框中的 xff0c 确定即可 xff0c 之后就不会再调试时加载
  • 【面包】STM32学习笔记(二) --- USART 串口通信学习总结

    tip xff1a 如有错误 xff0c 希望指出 xff0c 非常感谢 xff01 目录 简介一 USART是什么 xff1f 二 问答通信方式1 USART和UART区别2 单工 半双工 全双工区别 三 代码实验1 说明2 代码初始化配