【STM32】串口(异步通信部分)

经典的串口接口硬件说实话在现在的电脑上已经很难见到了,而是被USB这种通用的串行接口替代了,哪怕外部设备要以串口连接到电脑,都需要进行各种硬件转换。但不得不说,在工业领域,串口还是一个非常常用的数据传输方式。

大部分图片来源:正点原子HAL库课程

 专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

1    通信的基本知识

1.1    同步/异步通信

1.2    比特率和波特率

2    串口电平与连接

2.1    RS232电平

2.2    CMOS电平(STM32)

2.3    TTL电平(51)

2.4    连接方式

3    U(S)ART

3.1    简介

3.2    查看芯片U(S)ART数量

3.3    查看U(S)ART对应引脚

3.4    波特率计算公式

3.5    使用寄存器设置波特率的示例

3.6    HAL库异步通信配置

3.7    详细的解析

3.8    相关的HAL库文件(可以去这里找用到的函数和宏定义)


1    通信的基本知识

1.1    同步/异步通信

  • 同步通信:共用同一时钟信号;

     
  • 异步通信:没有时钟信号,通过在数据信号中 加入起始位和停止位等同步信号。

1.2    比特率和波特率

比特率:每秒钟传送的比特数,单位bit/s

波特率:每秒钟传送的码元数,单位Baud

比特率 = 波特率 * log2 M,M表示每个码元承载的信息量(这里M可以直接理解为信息调制后的的进制数)

二进制系统中,波特率数值上等于比特率(我的理解是要是一次性可以发送的数据不是1位,那么波特率就不等于比特率了)。


2    串口电平与连接

2.1    RS232电平

逻辑1:-15 ~ -3V

逻辑0:+3 ~ +15V

2.2    CMOS电平(STM32)

逻辑1:3.3V

逻辑0:0V

2.3    TTL电平(51)

逻辑1:5V

逻辑0:0V

2.4    连接方式

  • 232串口两设备连接:
  • STM32与电脑通信原理:

3    U(S)ART

3.1    简介

  • 都能全双工异步通信;
  • USART多了同步通信功能,但平时用它也比较少用它的同步功能;

3.2    查看芯片U(S)ART数量

《ST MCU选型手册》

3.3    查看U(S)ART对应引脚

芯片数据手册,如《STM32F103ZET6(中文版)》- 引脚定义

3.4    波特率计算公式

baud=\frac{f_{ck}}{16*USARTDIV}

其中f_{ck}是串口的时钟,如:USART1的时钟是PCLK2,其他串口都是PCLK1。

注意⚠️:
        这个式子其实不是为了计算波特率,而是为了计算USARTDIV的数值,其包括整数部分和小数部分,存储于USART_BRR寄存器中,是为了配置USART发送器时钟的。

3.5    使用寄存器设置波特率的示例

其中,+0.5是为了让其四舍五入,否则因为强制类型转换,小数部分直接会被忽略。


简化计算过程后,通用过程为:

3.6    HAL库异步通信配置

其中根据四步法的逻辑,可以分为:

1.    初始化

        (1)    串口参数设置:HAL_UART_Init();

        (2)    时钟设置:重写HAL_UART_MspInit(),在其中开启GPIO及UART的时钟;

        (3)    IO设置:重写HAL_UART_MspInit()中设置GPIO的配置;

        (4)    中断设置:重写HAL_UART_MspInit()中使能中断,并设置中断优先级,使用HAL_UART_Receive_IT()函数开启中断,可以理解为开启串口阻塞(实际上并不阻塞);

2.    定义读函数:

3.    定义写函数:

4.    编写中断服务函数:

        (1)    重写UARTx_IRQHandler()函数,调用UART的串口公用数据处理函数;

        (2)    重写接收完毕的回调函数HAL_UART_RxCpltCallback(),实现自定义的接收完成后动作,并在最后重新调用HAL_UART_Receive_IT()开启串口中断,因为接收完毕后串口中断就用完了(对,一次性的)。

3.7    详细的解析

其中根据四步法的逻辑:

1.    初始化

        (1)    串口参数设置: 

        (2)    时钟设置: 

        (3)    IO设置:其中串口的上下拉状态由芯片串口通信的电平时序图来决定,如下: 

        由于图中空闲时为高电平,因此就是要设置上拉。

        (4)    中断设置:注意注意⚠️!HAL_UART_Receive_IT()启用串口不可以写在HAL_UART_MspInit()函数内,因为其执行的条件是串口的状态是Ready,而只有HAL_UART_Init()执行完毕后,串口状态才会从Reset改为Ready。也就是说在HAL_UART_Init函数内部,在执行完HAL_UART_MspInit后,还有一些内容要执行,因此写在HAL_UART_MspInit函数内的HAL_UART_Receive_IT事实上是无法得到执行的。

2.    定义读函数:

3.    定义写函数:

4.    编写中断服务函数:

        (1)    中断服务函数中调用的HAL库公共数据处理函数可以将中断的标志位清空,因此在执行完毕后才需要重新调用HAL_UART_Receive_IT()开启阻塞

        小思考:在GPIO中断中无需手动开启可能是因为在GPIO配置中就配置了

        (2)    在接收完毕回调函数、串口中断服务函数等场合,应首先通过串口外设的句柄对接收的信号进行来源判断,因为有可能多个串口都开启了,但其各自的反应需要定义成不同的逻辑。

  • 注意事项⚠️

        在正点原子的相关教程中,在使用HAL_UART_Transmit函数发送串口数据后,会利用__HAL_UART_GET_FLAG函数读取SR寄存器的TX位配合while循环进行阻塞以保证信息的发送完毕,但事实上在HAL_UART_Transmit函数中已有类似的机制,因此是不需要进行手动阻塞的。

3.8    相关的HAL库文件(可以去这里找用到的函数和宏定义)

stm32f1xx_hal_uart.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 语法糖<script setup>

在 Vue 3 中&#xff0c;<script setup>是一种新的语法糖&#xff0c;它极大地简化了组件的编写方式。 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。 基本概念 简洁的语法&#xf…

国产GD32单片机开发入门(二)GD32单片机详解

文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…

解决前端访问IIS服务器发生跨域请求报错的方法

现在WEB开发都是前后端分离的模式了&#xff0c;当前端代码访问后端WEB服务器时&#xff0c;经常会发生跨域请求报错的问题。   如果是IIS服务器&#xff0c;可以通过下面的方式轻松解决。   由于出现跨域问题是因为服务器返回的页面在返回头中没有设置“Access-Control-Al…

SQL Server数据库 创建表,和表的增删改查

打开SQL Server工具,连接服务器 右击数据库&#xff0c;创建新的数据库 新建表 填写列&#xff0c;我添加了Id,Name,Sex,Age,和class列 右键表刷新一下就有了 我又同时创建了一个Class表 点击新建查询&#xff0c;现在写代码添加数据&#xff0c;也可以操作表来对数据进行添加 …

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - DataSet篇

[CLIP-VIT-L Qwen] 多模态大模型源码阅读 - DataSet篇 前情提要源码解读完整代码逐行解读导包readjson函数data_collate函数ImageCaptionDataset类&#xff08;init函数&#xff09;ImageCaptionDataset类&#xff08;readImage函数&#xff09; 参考repo:WatchTower-Liu/VLM-…

趋动科技 OrionX on VMware 打造 AI 就绪平台

着科技进步和产业变革的加速演进&#xff0c;人工智能&#xff08;AI&#xff09;已经成为兵家必争之地。今年以来伴随着ChatGPT带来的鲶鱼效应&#xff0c;人工智能成为科技产业创新的焦点&#xff0c;其应用范围越来越广泛&#xff0c;并将持续发展。科技产业龙头正加大在人工…

Redis入门指南

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对存储系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis因其快速的读写能力、丰富的数据类型和灵活的操作而广泛应用于缓存、消息队列、实时分析等…

链接 -- 动静态链接 --特点、区别、静态库安装下载

1.链接是什么&#xff1f; 我们的程序&#xff0c;和 库&#xff08;语言一定会有自己的标准库&#xff09; 结合的过程就叫做链接。 2.为什么有链接&#xff1f; 让开发站在巨人的肩膀&#xff0c;提高开发效率。 c语言库&#xff1a; ls /user/include/ 动静态库的特点与区别…

力扣面试经典算法150题:O(1) 时间插入、删除和获取随机元素

O(1) 时间插入、删除和获取随机元素 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a; O(1) 时间插入、删除和获取随机元素。 题目链接&#xff1a;https://leetcode.cn/problems/insert-delete-getrandom-o1/description/?envTypestudy-plan-v2&envIdtop…

Oracle问题笔记

ORA-28040 没有匹配的验证协议 问题出现场景oracle数据库为12c,应用使用的jdbc或客户端工具是11g版本一下&#xff0c;连接12c数据库时会报ora-28040错误。解决办法在Oracle服务端的$ORACLE_HOME/network/admin/sqlnet.ora文件中添加&#xff1a; SQLNET.ALLOWED_LOGON_VERSI…

第4章 汇编语言和汇编软件

第4章 汇编语言和汇编软件 该章主要介绍了汇编语言和汇编语言编译器的安装和使用。 汇编语言程序 该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。 书中有提到CPU有不同的架构&#xff0c;汇编语言有不同的风格&#xff0c;那么不同的CPU架构和不同的汇…

日常维护交换机,看看这些老网工怎么说

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友。 交换机作为连接各个节点的核心设备&#xff0c;其稳定性和可靠性直接关系到整个网络系统的健康运行。 路由器…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境&#xff0c;以及预发布环境 在根目录创建 .env[mode] 文件&#xff0c;在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置&#xff0c;执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

【硬件操作入门】2--GPIO与门电路、二极管三极管、LED电路与操作

【硬件操作入门】2–GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作 文章目录 【硬件操作入门】2--GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作一、GPIO与门电路1.1、GPIO的应用1.2、GPIO引脚操作1.2.1 设置引脚为GPIO功能…

加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言: squ…

[数据集][目标检测]建筑工地楼层空洞检测数据集VOC+YOLO格式2588张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2588 标注数量(xml文件个数)&#xff1a;2588 标注数量(txt文件个数)&#xff1a;2588 标注…

springboot项目读取 resources 目录下的文件的9种方式

1. 使用 ClassLoader.getResourceAsStream() 方法 InputStream inputStream getClass().getClassLoader().getResourceAsStream("file.txt"); 2. 使用 Class.getResourceAsStream() 方法 InputStream inputStream getClass().getResourceAsStream("/file.txt&…

JAVA-封装

目录 一、封装的概念 二、封装扩展之包 1. 包的概念 2.导入包中的类 3.自定义包 4.常见的包 三、访问限定符 在同一包中&#xff1a; 在不同包中&#xff1a;​编辑 一、封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主…

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用Web应用程序中对用户输入的数据的不正确处理&#xff0c;攻击者可以在SQL查询中注入恶意代码&#xff0c;从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…