STM32 通用同步/异步通信

news2024/12/23 3:58:49

一、串行通信简介

        CPU与外围设备之间的信息交换称为通信。基本的通信方式有并行通信串行通信两种。STM32单片机提供了功能强大的串行通信模块,即通用同步/异步收发器USART)。

1.串行通信

        串行通信是数据字节一位一位地依次传送的通信方式。串行通信的速度慢,但占用的传输线条数少,适用于远距离的数据传送。

        从硬件上看,串行通信有单工半双工全双工通信

  • 单工通信就是数据只允许向一个方向进行传送。
  • 半双工通信就是数据允许向两个方向进行传送,但一个设备的传送和接收过程不能同时进行。
  • 全双工通信就是数据允许向两个方向进行传送,且一个设备的传送和接收过程可以同时进行。

2.串行异步通信和串行同步通信

         串行通信按照串行数据的时钟控制方式分为异步通信和同步通信。

        串行异步通信是一种常用的串行通信方式,一次通信传送一个字符帧。在发送字符时,发送的字符之间的时间间隔可以是任意的,接收端时刻做好接受的准备。串行异步通信的优点是通信设备简单价格低廉,但因为具有起始位和停止位,所以传输效率较低。串行异步通信只适用于点对点

        串行同步通信要求在进行通信前先建立同步,发送频率和接收方的接收频率要同步。串行同步通信的传输速度较快,可用于点对多,多用于同一PCB上芯片级之间的通信。缺点是需要使用专用的时钟控制线来实现同步。

3.串行异步通信的数据传输形式

        串行异步通信需要制定一些共同遵守的约定,其中最重要的是字长波特率

        字长可以是8位或者9位,起始位为低电平,停止位为高电平,空闲帧全为1。发送和接收由一个共用的波特率发生器驱动。

        波特率即数据的传送速率。在串行异步通信中,每秒钟传送的二进制数的位数称为波特率,单位是比特/秒(bit/s),或波特(baud)。波特率的倒数就是每一位的传送时间,称为位传送时间,单位为秒(s)。

        

二、STM32的USART

1.USART的特点

  • 同步/异步全双工通信,低位先行。
  • 可配置数据位长度(8位/9位)。
  • 可配置停止位长度(0.5/1/1.5/2)。
  • 可选的校验位(无校验/奇校验/偶校验)。
  • 可配置波特率。
  • 支持硬件流控制。 

2.USART的结构

        STM32有3~5个全双工的串行异步通信接口USART,简称串口。USART主要有发送引脚(RX)、接收引脚(TX)、清除发送(nCTS)、发送请求(nRTS)和发送器时钟输出(CK)等引脚来与外部设备相连,同时,其内部还包含了各种寄存器和功能模块等。

        常用的引脚有RX发送引脚TX接收引脚,使用这两个引脚,一般就可以实现双向通信。

 3.USART的使用方式

        

 三、USART的使用流程

        STM32的USART一般使用异步通信方式,使用流程如下:

  1. 配置GPIO
  2. 配置USART
  3. 配置NVIC
  4. 编写中断服务函数(用于接收数据和进行其他操作)
  5. 发送数据
  6. 配置printf重定向(按需要选择配置或者不配置)
#include "stm32f10x.h"                  // Device header


/**********************************初始化USART1***********************************/
void Serial1_Init(void)
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA |RCC_APB2Periph_USART1,ENABLE );
    //开启GPIO和USART1时钟
	


	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;         //复用推挽输出
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                //配置发送引脚PA9
	GPIO_Init(GPIOA,&GPIO_InitStructure);                 
	
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;           //上拉输入
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;               //配置接收引脚PA10
	GPIO_Init(GPIOA,&GPIO_InitStructure);                      
	


	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=9600;                     //波特率,选择9600
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
                                                                 //硬件流控制,不使用
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx ; //配置为发送和接收模式
	USART_InitStructure.USART_Parity=USART_Parity_No;            //校验位,不适用
	USART_InitStructure.USART_StopBits=USART_StopBits_1;         //停止位,设1位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;    //数据位,设8位
	USART_Init(USART1 ,&USART_InitStructure);           
	

	USART_ITConfig (USART1 ,USART_IT_RXNE ,ENABLE);               //开启USART1的接收中断
	

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);               //选择优先级分组
	

	NVIC_InitTypeDef NVIC_InitStructure;                          //配置NVIC,使用到中断都要配置
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);                         
	
	USART_Cmd (USART1,ENABLE );                                   //使能USART1                            
}


/*********************************USART1中断服务函数*********************************/
void USART1_IRQHandler(void)                                      
{
	 
	if(USART_GetITStatus (USART1,USART_IT_RXNE )==SET)  
	{
        uint8_t value = 0;
		value=USART_ReceiveData (USART1);                         //接收数据       
		 
		 
        //其他操作


		USART_ClearITPendingBit (USART1,USART_IT_RXNE );
	}
}


/*************************************发送数据***************************************/
    USART_SendData(USART1, Byte);	                          	   //发送数据的操作
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完成


/*************************************printf重定向***********************************/
int fputc(int ch,FILE *f)          
{
	USART_SendData(USART1, ch);	                          	       //发送数据的操作
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完成
	return ch;
}
//printf重定向到串口,需要在该文件#include <stdio.h>,作用是printf操作会将数据打印到串口

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

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

相关文章

HarmonyOS第一课 05 从简单的页面开始-习题

【习题】从简单的页面开始 通过/及格分80/ 满分100 判断题 1.Button作为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮&#xff0c;其类型包括胶囊按钮、圆形按钮、普通按钮。T 正确(True) 错误(False) 大部分前端框架的按钮都具有这几个类型,鸿蒙也不例外…

Ubuntu+VsCode++搭建C++开发环境

Ubuntu下使用VsCode搭建C开发环境 1、基本工具的安装 首先Ubuntu下安装好C开发的一个些基本工具g、gdb、make、cmake等&#xff0c;安装方式点这里 检查一下安装环境 $ g --version g (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation,…

位图的应用

目录 问题引入 位图概念 位图的实现 应用2&#xff1a;找到只出现一次的整数 应用三&#xff1a;找交集 STL中的位图 问题引入 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 解决…

幂,你去哪儿了-《分析模式》漫谈37

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第3章的图3.5&#xff0c;原文的图是&#xff1a; 2004&#xff08;机械工业出版社&#xff09;中译本的图是&#xff1a; direct翻译成分子&#xff0c;inv…

master节点k8s部署]33.ceph分布式存储(四)

总结ceph分布式存储&#xff08;三&#xff09;中提到的三种方法&#xff1a; 1.创建rbda&#xff0c;并且在创建pv的时候配置该rbda,以下代码仅展示关键信息。 [rootxianchaomaster1 ~]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: ceph-pv ...…

MySQL多表查询:行子查询

先看我的表数据 dept表 emp表 行子查询 子查询返回的结果是一行&#xff08;可以是多列&#xff09;, 这种子查询称为行子查询 常用的操作符: , <>, IN, NOT IN 例子1. 查询与“张无忌” 的薪资及直属领导相同的员工信息 拆解成两个问题 a. 查询"张无忌"…

基于SpringBoot+Vue+MySQL的汽车租赁系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着城市化和交通需求的不断增加&#xff0c;汽车租赁业务成为了现代社会的一个重要组成部分。汽车租赁服务为人们提供了一种灵活便捷的交通解决方案&#xff0c;让用户在无需购买车辆的情况下&#xff0c;根据实际需要租赁车辆…

端口冲突的解决方案以及SpringBoot自动检测可用端口demo

端口冲突的解决方案 端口冲突通常发生在尝试运行两个或多个应用程序或服务时&#xff0c;它们尝试使用同一个端口号&#xff0c;导致系统无法正确分配资源。 各种端口错误 你是否遇到过下面这些报错信息呢&#xff1f; Windows 系统报错&#xff1a; 系统错误 1004 套接字操作…

图像转3D视差视频:DepthFlow、kling

1、DepthFlow 参看: https://github.com/BrokenSource/DepthFlow 通过深度图实现图像3d效果 安装 https://brokensrc.dev/get/pypi/#installing pip insatll depthflow shaderflow broken-source pianola spectronote turbopipe 使用 1、下载项目 git clone https://gith…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

Python_文件处理

一个完整的程序一般都包括数据的存储和读取&#xff1b;我们在前面写的程序数据都没有进行实际的存储&#xff0c;因此python解释器执行完数据就消失了。实际开发中&#xff0c;我们经常需要从外部存储介质&#xff08;硬盘、光盘、U盘等&#xff09;读取数据&#xff0c;或者将…

微信小程序开发-目录结构介绍

文章目录 一&#xff0c;目录结构介绍1&#xff0c;主体文件2&#xff0c;页面文件3&#xff0c;修改页面渲染模式 二&#xff0c;新增页面1&#xff0c;右键“pages”-新建文件夹2&#xff0c;右键文件夹-新建page3&#xff0c;新建页面的快捷方式 四&#xff0c;基础库设置 一…

①EtherNet/IP转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherNet/IP 转 Modbus TCP GW型号系列 MS-GW25 概述 简介 MS-GW25 是 EtherNet/IP 和 Modbus TCP 协议转换网关&#xff0c;为…

C语言 | 第十一章 | static 日期函数 数学函数

P 100 变量作用域基本规则 2023/1/9 一、基本介绍 概念&#xff1a;所谓变量作用域&#xff08;Scope&#xff09;&#xff0c;就是指变量的有效范围。 函数内部声明/定义的局部变量&#xff0c;作用域仅限于函数内部。 #include<stdio.h> void sayHello() {char nam…

【C++】—— 继承(上)

【C】—— 继承&#xff08;上&#xff09; 1 继承的概念与定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承父类成员访问方式的变化 1.3 继承类模板 2 父类和子类对象赋值兼容转换3 继承中的作用域3.1 隐藏规则3.2 例题 4 子类的默认成员函数4.1 构造函数4.1.1 父类有…

稀缺是否意味着价值

省流版&#xff1a;物以稀为贵。 稀少并不等于需求。 更新为&#xff1a;物以希为贵。 有需求就意味着有价值。 不管是20&#xff1a;80中的20&#xff0c;还是10&#xff1a;90中的10&#xff0c;还是2&#xff1a;98中的2。 所以&#xff0c;这个模型里一定会出现1这类人&a…

MambaAD 实验部分讲解

4 实验 4.1 设置&#xff1a;数据集、指标和细节 数据集&#xff08;6个&#xff09; 1.MVTec-AD&#xff1a; 包含5种类型的纹理和10种类型的对象&#xff0c;总共5,354张高分辨率图像。 实验&#xff1a; 3,629张正常图像被指定为训练。 剩下的 1,725 张图像被保留用于测试…

AWS MySQL 升级(三)—— TAZ - 近0停机的小版本升级方案

与AWS交流了解到的新方案&#xff0c;没有实际试过&#xff0c;所以本篇主要是些原理 一、 TAZ的含义 TAZ实际上就是 3 AZ&#xff0c;扩展一些就是 Multi-AZ DB Cluster&#xff0c;即在3个可用区部署DB&#xff0c;具备两个只读备用实例。 二、 TAZ的主要用途 1. 近0停机的小…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…

单细胞组学大模型(6)--- LangCell,医学/细胞文本知识增强模型效果

–https://arxiv.org/abs/2405.06708 代码开源&#xff1a;https://github.com/PharMolix/OpenBioMed LangCell: Language-Cell Pre-training for Cell Identity Understanding 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和研究单位 聂再清…