STM32 通用同步/异步通信

一、串行通信简介

        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;                //配置发送引脚PA9GPIO_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;               //配置接收引脚PA10GPIO_Init(GPIOA,&GPIO_InitStructure);                      USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600;                     //波特率,选择9600USART_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.rhkb.cn/news/440540.html

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

相关文章

mysql单表查询·3

准备好表 create table product(id int primary key,name varchar(32),price double,category varchar(32) ); # 插入数据 INSERT INTO product(id,name,price,category) VALUES(1,联想,5000,c001); INSERT INTO product(id,name,price,category) VALUES(2,海尔,3000,c001); I…

【C++】--类和对象(2)

&#x1f44c;个人主页: 起名字真南 &#x1f446;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;…

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…

黑神话:仙童,数据库自动反射魔法棒

黑神话&#xff1a;仙童&#xff0c;数据库自动反射魔法棒 Golang 通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频&#xff0c;视频请见&#xff1a;https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器&#xff0c;将 …

论文阅读:InternVL v1.5| How Far Are We to GPT-4V? 通过开源模型缩小与商业多模式模型的差距

论文地址&#xff1a;https://arxiv.org/abs/2404.16821 Demo&#xff1a; https://internvl.opengvlab.com Model&#xff1a;https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5 公开时间&#xff1a;2024年4月29日 InternVL1.5&#xff0c;是一个开源的多模态大型语言模…

mac配置python出现DataDirError: Valid PROJ data directory not found错误的解决

最近在利用python下载SWOT数据时出现以下的问题&#xff1a; import xarray as xr import s3fs import cartopy.crs as ccrs from matplotlib import pyplot as plt import earthaccess from earthaccess import Auth, DataCollections, DataGranules, Store import os os.env…

C语言初步介绍(初学者,大学生)【上】

1.C语⾔是什么&#xff1f; ⼈和⼈交流使⽤的是⾃然语⾔&#xff0c;如&#xff1a;汉语、英语、⽇语 那⼈和计算机是怎么交流的呢&#xff1f;使⽤ 计算机语⾔ 。 ⽬前已知已经有上千种计算机语⾔&#xff0c;⼈们是通过计算机语⾔写的程序&#xff0c;给计算机下达指令&am…

Ubuntu 安装RUST

官方给的是这样如下脚本 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 太慢了 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh -x 执行这个脚本后会给出对应的下载链接 如下图 我直接给出来 大多数应该都是这个 https://static.rust-…

【EXCEL数据处理】000013 案例 EXCEL筛选与高级筛选。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000013 案例 EXCEL筛选与高级筛选。使用的软件&#…

【动态规划-最长公共子序列(LCS)】力扣1035. 不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09…

提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享

日常使用Windows电脑时&#xff0c;总会需要下载各种各样的办公软件。部分软件会默认开机自启功能&#xff0c;开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿&#xff0c;开机慢&#xff0c;运行不流畅的情况出现&#xff0c;而…

[C++11] lambda表达式

文章目录 Lambda表达式简介捕获列表的常见写法&#xff1a; Qt中的connect和Lambda常规的 connect() 方式&#xff1a;使用Lambda表达式的 connect()&#xff1a;代码示例&#xff1a; 捕获外部变量在 Qt 信号槽中的应用Lambda在Qt中的使用优势总结参考代码总结&#xff1a; La…

目标检测与图像分类:有什么区别?各自的使用场景是什么?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Android阶段学习思维导图

前言 记录下自己做的一个对Android原生应用层的思维导图&#xff0c;方便个人记忆扩展&#xff1b;这里只露出二级标题。 后语 虽然有些内容只是初步了解&#xff0c;但还是记录了下来&#xff1b;算是对过去一段学习的告别。

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

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

ThreeJS入门(092):THREE.Curve 知识详解,示例代码

作者&#xff1a; 还是大剑师兰特 &#xff0c;曾为美国某知名大学计算机专业研究生&#xff0c;现为国内GIS领域高级前端工程师&#xff0c;CSDN知名博主&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;webgl&#xff0c;ThreeJS&#xff0c;canvas&#xf…

厂商资源分享网站

新华三&#xff08;H3C&#xff09;是一家中国知名的网络设备供应商&#xff0c;提供网络设备、网络解决方案和云计算服务。公司成立于2003年&#xff0c;是华为公司和惠普公司合资的企业&#xff0c;总部位于中国深圳。 华为&#xff08;Huawei&#xff09;是一家全球知名的电…

使用rsync+jenkins实现服务自动部署全流程

项目背景&#xff1a;城市政务云服务器没有上k8s&#xff0c;所有后端服务都是原始方式部署启动 &#xff08;java -jar xxx.jar&#xff09;&#xff0c;那么有没有方式简化部署难度&#xff0c;实现自动部署&#xff1f;当然是有的&#xff0c;下面详细介绍&#xff08;以Cen…

前端工程化 - Vue

环境准备 Vue-cli是Vue官方提供的一个脚手架&#xff0c;用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…

vite学习教程03、vite+vue2打包配置

文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…