STM32-USART串口配置教程和printf函数实现(寄存器版)

本章概述思维导图


通信介绍

通信介绍概况

通信,至少是需要两个对象,一个收一个发数据。

根据数据通信的传输时序协调方式,可分为:同步通信和异步通信;

根据数据通信的传输线路可分为:串行通信和并行通信;

根据数据通信的传输方向性及双向交互能力可分为:单工通信和双工通信(半双工通信和全双工通信)

同步通信和异步通信定义

同步通信:发送方与接收方通过共享时钟线的时钟信号,确保数据按固定时间间隔传输,接收方能准确预测数据到达时间;

异步通信:发送方与接收方无共享时钟线,通过数据包或数据帧格式(如起始信号/停止位)协调传输数据;

同步和异步的区别:同步通讯需要有时钟信号控制,通过时钟线的高低电平控制数据的收发;异步通信没有时钟信号控制,通过数据帧格式控制数据的收发(大家约定好通信速度(波特率));

小心得:就是一个有时钟线提供时钟时序,一个没有时钟线;

串行通信和并行通信定义

串行通信:数据按位顺序传输,使用单条线路进行数据得传输。例如,发送字节 10110010 时,先传 1,再传 0,以此类推。

并行通信:数据的多个位(通常8位、16位等)同时通过多条线独立线路并行传输。如传输字节 10110010,会使用8根数据线,每根线同时传1位。

串行和并行的区别;

串行通信指同一时刻,只能收或发一个bit位信息,因此只用一根数据信号线即可;并行通信指同一时刻,可以收或发多个bit位信息,因此需要多根数据信号线才行;

单工和半双工、全双工定义

单工通信:数据仅能沿固定方向单向传输,发送端与接收端角色不可互换。

应用场景:广播系统(电台→听众、卫星数据下行)、传感器网络(如温湿度传感器→数据中心)等;

半双工通信:同一信道分时复用,双方交替发送和接收;

应用场景:对讲机、传统Wi-Fi;

全双工通信:双方可同时发送和接收数据;

应用场景:电话通话、以太网交换机等;

单工和半双工、全双工的区别:

单工通信:单工要么收要么发,只能做接收设备或者发送设备。接收器不能发送数据给  发送器。例如:收音机; 

半双工通信:双发都可以发送数据,双方不能同时发送数据或接收数据;只有一根发送/接收数据信号线。(特点:可以收可以发,但是不能同时收发)例如:对讲机; 

全双工通信:双方可以同时发送或者接收数据;有两根发送/接收数据信号线;(特点:可以同时即发送又接收数据)例如:手机

USART串口通信

串口(USART)通讯:异步通讯、全双工、串行通讯、总线协议;

USART通用同步异步收发器,是一种通用的串行、异步/同步通信总线。该总线有两条数据信号线,可以实现全双工的发送和接收;

波特率:用于描述USART串口通信时的通信速度,其单位(bps)即每秒钟传送的位(bit) 的数量

上位机:就是连接串口的电脑或者手机上的APP软件;是在自动化控制系统中,用于监控 和控制下位机(如单片机、PLC等)的计算机。它可以直接发送操作指令给下位机, 并接收下位机的反馈数据,通过用户操作交互界面向用户展示数据。

USART采用帧格式从低位开始发送数据——>高位

串口通信是不允许连续发送,避免累积误差。所以发送完一字节数据后就得停止重新发送;

USART1串口1电路原理图

1. 分析原理图,查看对应引脚

分析原理图这是串口USART1实现下载程序功能

我们不能随意配置USART1的引脚,要根据STM32F103X引脚定义手册来查看USART1配置的引脚;

TXD发送数据脚--->PA10(数据接收脚)

RXD接收数据脚--->PA9 (数据发送脚)

串口属于自行控制数据的收发,所以我们应设置GPIO引脚模式为复用模式;

发送对接收;PA10设置为复用输入模式,PA9设置为复用输出模式;

2. 配置串口1(USART1)模块初始化函数

配置USART1串口初始化函数步骤:

1. 开时钟

2. 对串口1模块开启复位时钟,在取消复位;

3. 配置GPIO模式

4. 通过在USART_CR1寄存器上置位UE位来激活USART

5. 编程USART_CR1的M位来定义字长。

6. 在USART_CR2中编程停止位的位数。

7. 利用USART_BRR寄存器选择要求的波特率。

8. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。

9. 设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。

代码示例:

#include "USART1.h"
/*USART1串口初始化函数形参bps——>保持通信的波特率PA10设置为输入模式,PA9设置为复用输出模式;
*/
void USART1_Init(u32 bps)
{
//  1. 开时钟RCC->APB2ENR|=1<<2;//开启PA时钟;RCC->APB2ENR|=1<<14;//开启USART1时钟
//  2. 对串口1模块开启复位时钟,在取消复位;RCC->APB2RSTR|=1<<14;//开启USART1复位时钟,复位这一步可以省略配置USART1步骤RCC->APB2RSTR&=~(1<<14);//取消复位时钟,关闭复位
//  3. 配置GPIO模式GPIOA->CRH&=0xfffff00f;//清空PA10、PA9引脚模式GPIOA->CRH|=0x000008b0;//PA10输入PA9输出
//  4.通过在USART_CR1寄存器上置位UE位来激活USARTUSART1->CR1|=1<<13;
//  5.编程USART_CR1的M位来定义字长。USART1->CR1&=~(1<<12);
//  6.在USART_CR2中编程停止位的位数。USART1->CR2&=~(0x3<<12);
//  7.利用USART_BRR寄存器选择要求的波特率。USART1->BRR=72000000/bps;
//  8.设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。USART1->CR1|=1<<3;
//  9.设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。USART1->CR1|=1<<2;
}

3. USART1串口底层发送数据函数

USART1串口数据发送函数(以数据帧格式发送):

配置步骤:

1.把发送的数据放入到USART_DR数据寄存器

2.判断USART_SR状态寄存器的TXE(发送数据寄存器空)位数据是否发送完成

代码示例:

/*USART1串口底层数据发送函数形参:temp——>发送的数据
*/
void USART1_TX(u8 *temp)
{while(*temp){USART1->DR=*temp++;while(&(USART1->SR&1<<7)){}}
}

测试USART1串口初始化函数和USART1串口底层发送函数

代码示例:

#include "LED.h"
#include "Delay.h"
#include "SYSTICK.h"
#include "BEEP.h"
#include "KEY.h"
#include "USART1.h"
int main()
{LED_Init();//LED灯初始化函数BEEP_Init();//蜂鸣器初始化函数KEY_Init();//按键初始化函数USART1_Init(115200);//USART1串口1初始化函数USART1_TX((u8 *)"串口1初始化完成\n");//发送"串口1初始化完成"这句话while(1){}
}

测试结果:

4. 串口读取/接收数据操作

操作步骤:

1. 首先判断USART1_SR寄存器中RXNE(读数据寄存器非空),置1表示收到数据,可以读出。置0表示数据没有收到;

2. 将收到数据返回给上位机终端显示

代码示例:

#include "LED.h"
#include "Delay.h"
#include "SYSTICK.h"
#include "BEEP.h"
#include "KEY.h"
#include "USART1.h"
int main()
{LED_Init();//LED灯初始化函数BEEP_Init();//蜂鸣器初始化函数KEY_Init();//按键初始化函数USART1_Init(115200);//USART1串口1初始化函数USART1_TX((u8 *)"串口1初始化完成\n");u8 dat=0;while(1){if(USART1->SR&1<<5){dat=USART1->DR;//读取数据USART1->DR=dat;//将读取的数据在上位机软件显示}}
}

上位机软件发送数据给USART1串口判断是否接收:

发送结果显示:

5. printf( )打印函数使用USART1底层实现 

在我们以后项目开发过程中会遇到各种各样的开发问题,使用printf( )函数可以让我们快速方便的查找问题!解决问题!下面是利用串口1实现printf( )函数的底层实现;

配置步骤:

1.在<stdio.h>文件中查找函数fputc

2.创建printf( )打印函数

3.实现printf函数还需在keil v5中的魔法棒中第二个选项卡Target中勾选右上角的Use Micro LIB;

代码示例:

/*printf函数底层接口实现形参:tx——发送的内容注意:不需要声明哟!
*/
int fputc(int tx, FILE *stream)
{USART1->DR=tx;while(!(USART1->SR&1<<7)){}return tx;
}

第三步操作:

测试printf( )函数实现代码示例:


#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函数printf("大河向东流哇\n天上的星星参北斗哇\n嘿嘿 参北斗哇\n生死之交一碗酒哇\n说走咱就走哇\n你有我有全都有哇\n嘿嘿 全都有哇\n");while(1){}
}

测试结果

6. 显示USART1接收到的数据

代码示例:

#include "stm32f10x.h"
#include "Delay.h"
#include "USART.h"
#include <stdio.h>int main()
{USART1_Init(115200);//串口1初始化函数USART1_TX((u8 *)"串口1初始化成功\n");u8 dat;	//读取数据	u8 buffer[100];//接收数据的数组 	u8 cnt=0;//下标while(1){if(USART1->SR&1<<5){dat=USART1->DR;//读取数据buffer[cnt]=dat;//将读取的数据放入到数组中if(dat == '\n'){buffer[cnt-1]='\0';//上位机软件设置时以\r\n结尾。手动把\r改成数组结束标准符printf("buf=%s;\tcnt=%d\n",buffer,cnt);cnt=0;}else cnt++;}}
}

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴可以点关注!有不懂的地方和需要的资源随时问我哟!

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

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

相关文章

4种灵活的方法从POCO手机中删除联系人

许多POCO用户经常需要清理联系人列表&#xff0c;删除重复或过时的条目&#xff0c;或者在出售或赠送手机之前删除个人或敏感联系人。无论是为了隐私、组织管理&#xff0c;还是仅仅是为了管理存储空间&#xff0c;高效地删除POCO手机中的联系人是至关重要的。本文将介绍4种智能…

航段导航计算机 (Segment_Navigator) 设计与实现

航段导航计算机 (Segment_Navigator) 设计与实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 引言 航段导航计算机是现代航空电子系统中的关键组件&a…

input.1是onnx输入的名称,但是依然警告不是

导出动态轴的时候发现&#xff0c;明明input.1就是onnx的名字&#xff0c;但是依然有警告说不是&#xff1b;/miniconda3/envs/py38/lib/python3.8/site-packages/torch/onnx/utils.py:2078: UserWarning: Provided key input.1 for dynamic axes is not a valid input/output …

生成式人工智能展望报告-欧盟-02-技术方面

原文地址 摘要 本章的重点是GenAI的技术层面&#xff0c;首先是对其能力和局限性的评估。它强调了部署GenAI系统所带来的网络安全挑战。会议讨论了新出现的技术趋势&#xff0c;为决策者和利益攸关方提供了前瞻性的视角。关键问题包括确保GenAI应用程序的安全性和可靠性所需的…

人工智能与云计算双轮驱动:元宇宙如何重构全球产业生态

一、人工智能在元宇宙中的核心应用1. 内容生成与虚拟世界构建生成式AI&#xff08;AIGC&#xff09;&#xff1a;通过AI算法自动生成3D模型、虚拟场景和角色&#xff0c;显著降低内容制作成本和时间。例如&#xff1a;联想晨星元宇宙平台&#xff1a;利用AIGC技术实现低成本、高…

企业信息管理系统开发实战:基于 Spring Boot+MyBatis+Thymeleaf

引言&#xff1a;企业信息管理系统的核心价值在企业日常运营中&#xff0c;高效的信息管理是提升效率的关键。本文将手把手教你开发一套企业信息管理系统&#xff0c;涵盖用户登录、信息增删改查、权限控制等核心功能。系统采用 Spring Boot 作为后端框架&#xff0c;MyBatis 处…

NLP自然语言处理的一些疑点整理

PyTorch评估模式&#xff08;torch.no_grad和model.eval&#xff09;差异在PyTorch中&#xff0c;model.eval()和torch.no_grad()是模型评估和推理阶段的两个关键工具&#xff0c;它们各自扮演着不同的角色&#xff0c;但常常被一起使用以确保模型行为的正确性和计算效率。理解…

物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践

一、项目背景在我们物流厂的日常运营中&#xff0c;分拣效率和仓储精准度一直是瓶颈。传统人工分拣不仅速度慢&#xff0c;还容易因疲劳出错&#xff1b;仓储区域的货物定位全靠人工记录&#xff0c;时常出现找货难、盘点耗时的问题。生产线的核心控制依赖施耐德PLC&#xff0c…

产品动态 | 同创永益IStorM Chaos 混沌工程平台V4.0震撼发布:智能驱动,筑牢系统稳定性防线

当混沌工程从试点走向企业级大规模推广&#xff0c;标准化缺失、专家依赖高、实施效率低等痛点成为阻碍系统稳定性升级的 “拦路虎”。此刻&#xff0c;同创永益重磅推出IStorM Chaos 混沌工程平台 V4.0&#xff0c;以智能技术为核心驱动力&#xff0c;为企业构建更高效、更灵活…

C++中的反向迭代器

C中的反向迭代器 为啥反向迭代器的讲解要单独拎出来讲&#xff0c;没有在讲各个容器的时候顺手讲了呢&#xff1f; 主要是因为c中的反向迭代器和正向迭代器的实现不太一样。 它思想不复杂&#xff0c;主要是巧。来&#xff0c;我们按照我们刚刚的想法把代码写出来 #pragma once…

【一步步ai】数据增强与预处理

提升NL2SQL系统性能是一个复杂的多维度优化问题&#xff0c;涉及数据工程、模型架构、训练策略和评估方法等多个层面。以下是一些有效的提升方向和具体方法&#xff1a; 一、数据增强与预处理 多样化数据生成 模板扩展&#xff1a;基于SQL语法模板自动生成多样化的NL-SQL对&am…

站在哪个肩膀上开始学习卡尔曼滤波

站在哪个肩膀上开始学习卡尔曼滤波前言从自适应滤波的角度正交性原理到维纳解kalman滤波的提出innovation process新息过程kalman滤波算法Kalman 自适应滤波器算法初始条件输入观测向量过程已知参数计算&#xff1a;n1&#xff0c;2&#xff0c;3&#xff0c;..参考前言 不知道…

什么是FCR,如何提升FCR?

‌ FCR&#xff08;First Call Resolution&#xff0c;首次呼叫解决率&#xff09;&#xff0c;意思是指客户首次联系客服时&#xff0c;问题在单次交互中被完全解决的比率。‌ ‌FCR &#xff08;首次解决的通话量 / 总首次通话量&#xff09; 100%一、关键要点&…

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心写在最前面报错GPT的全部回复&#xff0c;可以参考&#x1f50d; 具体错误解释&#xff1a;1. **CORS错误**2. **XHR 请求失败**3. **ReaderArticleFinder / Readability**&#x1f6e0;️ 为什么页面没有内容显示&#x…

从零开发Java坦克大战:架构设计与难点突破 (下)

6. 游戏引擎类:6.1 完整源码展示: import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set;public class Gam…

Git下载与安装全攻略

引言 Git是当今最流行的分布式版本控制系统&#xff0c;由Linus Torvalds于2005年创建。它帮助开发者高效管理代码变更&#xff0c;支持多人协作开发&#xff0c;是现代软件开发不可或缺的工具。无论是个人项目还是团队协作&#xff0c;Git都能提供强大的版本控制功能。 本文…

【Elasticsearch】快照生命周期管理 SLM(理论篇)

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜&#xff1a;性能与成本平衡原理公式解析3️⃣ ILM&#xff08;Index Lifecycle Management&#xff09;策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…

深入理解 UDP 协议:从原理到实战的技术解析

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为 TCP 的 "轻量型伙伴"&#xff0c;在实时通信、流媒体传输等场景中发挥着不可替代的作用。与 TCP 的可靠传输不同&#xff0c;UDP 以 "简单、快速、无连接" 为设计理念&a…

c语言-数据结构-沿顺相同树解决对称二叉树问题的两种思路

二叉树OJ前言对称二叉树前言 本篇继续讲解二叉树OJ题目之对称二叉树 对称二叉树 题目链接&#xff1a;https://leetcode.cn/problems/symmetric-tree/description/ 该题要求比较这棵树是否对称&#xff0c;对称&#xff0c;指的是结构对称并且值也要对称&#xff0c;即对应…

云原生可观测-日志观测(Loki)最佳实践

一、Loki 简介 云原生可观测三大支柱 支柱工具用途MetricsPrometheus性能趋势、系统负载LogsLoki原始事件记录、错误诊断TracesTempo / Jaeger分布式链路追踪 一、Loki 简介 1.1 Loki 是什么 Loki 是由 Grafana Labs 开发的 日志聚合系统&#xff0c;与 Prometheus 架构一…