串口通信+实例编写

2023-05-16

一、通信接口背景知识

1、处理器与外部设备通信的两种方式

  并行通信:

传输原理:数据各个位同时传输

优点:速度快

缺点:占用引脚资源多

(例如:A向B进行传输时一次性可以用8个引脚进行传输,效率高速度快,但是占用引脚多)

  串行通信:

传输原理:数据按位顺序传输

优点:占用引脚资源少

缺点:速度相对较慢

(例如:A向B进行传输时要用8个引脚,但每次只用一个引脚,8个引脚逐个使用,占用引脚少)

2、串行通信

按照数据传送方向,分为:

单工:数据传输只支持数据在一个方向上传输

半双工:允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信

全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接受设备都有独立的接受和发送能力

串行通信的通信方式:

同步通信:带时钟同步信号传输。SPI,IIC通信接口

异步通信:不带时钟同步信号。UART(通用异步收发器),单总线

二、STM32串口通信基础

USART:通用同步异步收发器(同步有时钟信号)

UART:通用异步收发器(异步无时钟信号)

UART异步通信方式引脚连接方法

-RXD:数据输入引脚。数据接收

-TXD:数据发送引脚。数据发送

图片总结:通信方式:同步通信一定有同步时钟,异步通信无同步时钟。通信方向:全双工的发送和接收都有独立的引脚。半双工只占用一个通信引脚(可以发送和接收)。

    UART异步通信方式特点:

·全双工异步通信

·支持小数波特率发生器系统,提供精确的波特率。(通信双方事先约定好一种速度即波特率)

·可配置的16倍过采样或8倍过采样,为速度容差与时钟容差的灵活配置提供了可能。(F1与F4UART唯一区别,一般采用16倍过采样)

·可配置的停止位(支持1或者2位停止位)

·可编程的数据字长度(8位或者9位)

·可配置的使用DMA多缓冲器通信

·单独的发送器和接收器使能位

·检测标志:接收缓冲器;发送缓冲器空;传输结束标志;(STM32与外部设备进行通信的时候接收到一个数据后会有相应的标志)

·多个带标志的中断源,触发中断(串行通信可以发送接收数据,接收到一个数据可以触发一个中断)

·其他:校验控制、四个错误检测标志

   STM32串口通信过程

   STM32串口异步通信需要定义的参数

1、起始位

2、数据位(8位或9位)

3、奇偶校验位(第9位)

4、停止位(1、15、2位)

5、波特率设置

 

理解:

1:(事先约定)A与B通信,空前状态是1,而起始位是0(低电位)证明通信已经开始了

2:数据位(八位到九位)

3:例如前八位中有五个1,三个0,而第九位是奇偶校验位(假设偶),则第九位为1,同前八位组成六个1

4:(事先约定)约定1或0,然后停止,进行下一个数据帧

5:通信双方事先约定好波特率

三、实例编写

1、常用的串口相关寄存器:

·USART_SR状态寄存器(用0~9位,每一位是一个状态标志位)

·USART_DR数据寄存器(用0~8位,发送接收数据时使用)

·USART_BRR波特率寄存器(用0~3位:USARTDIV的小数部分、4~15位:USARTDIV的整数部分)

库函数调用:

状态寄存器调用函数:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);

数据寄存器调用函数:

void USART_SendData(USART_TypeDef*USARTx,uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDef*USARTx);

波特率寄存器调用函数:

void USART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);

【波特率的计算方法:fPCLKx(x=1,2)/(USARTDIV*16)  OVER8=0】

fPCLKx是给串口时钟(PCLK1用于USART2~5,PCLK2用于USART1和USART6)

一般注重求USARTDIV的值,易知波特率、PCLKx时钟。

常见USARTDIV的结果是小数,将USARTDIV转化位波特率寄存器时,整数部分写入4~15位,小数*16写入0~3位

2、串口配置一般步骤

串口时钟使能:RCC_APBxPeriphClockCmd();

GPIO时钟使能:RCC_AHB1PeriphClockCmd();

引脚复用映射:GPIO_PinAFConfig();

GPIO端口模式设置:GPIO_Init();模式设置为GPIO_Mode_AF

串口参数初始化:USART_Init();

开启中断并且初始化NVIC:NVIC_Init();USART_ITConfig();

使能串口:USART_Cmd();

编写中断处理函数:USARTx_IRQHandler();

串口数据收发:void USART_SendData();//发送数据到串口,DR

uin16_t USART_ReceiveData();//接收数据,从DR读取接收到的数据

串口传输状态获取:FlagStatus USART_GetFlagStatus();  void USART_ClearITPendingBit();

3、代码

void My_Usart1_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//GPIOA使能时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//PA9、PA10映射到串口1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//最重要的是将模式设为复用
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//串口初始化
	USART_InitStructure.USART_BaudRate=115200;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
	//使能中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	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);
}
//中断服务函数
void USART1_IRQHandler(void)
{
	u8 res;
	//判断中断发生
	if(USART_GetITStatus(USART1,USART_IT_RXNE)){
	
		res=USART_ReceiveData(USART1);
		
		USART_SendData(USART1,res);
	}
}
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	My_Usart1_Init();
	while(1);
}

串口通信

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口通信+实例编写 的相关文章

  • 如何计算电机极数和无刷电机的Kv值?

    介绍 如果您正在制造无人机 遥控车或任何使用无刷直流 BLDC 电机的机器 xff0c 您可能会遇到电机极数和电机Kv值的概念 这两个参数对于表征您的电机和估计其性能都很有帮助 在本文中 xff0c 我们将介绍这些指标的含义 如何计算和衡量
  • 无人机拉力测试台:15kg级-Flight Stand 15

    产品简介 Flight Stand 15测试台是多年无人机动力系统开发经验和经历数千个用户使用反馈不断优化的成果 该测试台对无人机电机和螺旋桨的拉力 xff0c 扭矩 xff0c 转速 xff0c 电流 xff0c 电压 xff0c 温度
  • 教你编写Python抢购代码

    想买mate40 xff0c 但总是抢不到 xff0c 所以想试着能不能写个脚本代码 第一步 xff1a 把想要抢购的商品加进购物车 xff0c 注意 xff1a 脚本是对购物车内全部商品进行下单操作 xff0c 所以不够买的商品最好先从购
  • Linux C/C++UDP通信实现

    文章目录 一 UDP通信流程二 代码实现1 服务器2 客户端 一 UDP通信流程 二 代码实现 1 服务器 代码如下 xff08 示例 xff09 xff1a span class token macro property span cla
  • 无人机拉力测试台:75kg级-1780系列

    产品简介 1780系列测试台是专为无人机设计师的简化测试需求而设计 xff0c 同时配有易于使用的支持手动控制功能的操作软件 xff0c 并支持设计师使用定制的预编写脚本实现自动化测试 测量结果完成后可以实时保存并导出到 CSV格式文件 试
  • 无人机拉力测试台:5kg级-1580测试台

    产品简介 1580测试台对无人机动力系统的无刷电机和螺旋桨进行测试 xff0c 测量高达5kgf的拉力和2Nm的扭矩 xff0c 以及电压 xff0c 电流 xff0c 功率 xff0c 电机转速 xff0c 振动和效率 该测试台大大减少了
  • 共轴双旋翼无人机动力测试解决方案

    前言 与传统的多旋翼无人机架构相比 xff0c 共轴式多旋翼无人机具有结构紧凑 上下旋翼反转扭矩相消和良好的操控性等优势 xff0c 同时可以为整机提供更大的动力 xff0c 尤其在直升机领域 xff0c 共轴双旋翼的设计受到了越来越多军工
  • 航空数据链协议解析与仿真测试

    航空数据链概述 航空数据链通信是指飞机和地面站系统之间一种数字通信技术 该技术通过使用互连路由器和终端系统的航空电信网络 ATN xff0c 以及作为空中 地面数据链技术的VHF数字链路模式2 VDL mode 2 VDL2 来实现管制员与
  • 无人机拉力测试台研制&测试过程中的9个关键技术点

    随着近年来无人机行业的飞速迭代发展 xff0c 越来越多的相关从业人员选择使用拉力测试台来测试并优化无人机的动力系统 xff0c 本文尝试从无人机拉力测试台的研制和使用角度来阐述无人机拉力测试中的9个关键技术点 1 电磁干扰方面的考虑 测试
  • 无人机动力系统优化测试平台-15kg级-Flight Stand 15

    产品简介 通过Flight Stand 15测试台对电机和螺旋桨的拉力 xff0c 扭矩 xff0c 转速 xff0c 电流 xff0c 电压 xff0c 温度 xff0c 空速 xff0c 螺旋桨效率和电机效率的测量帮助您精准地描述和评估
  • 无人机飞行控制实验平台

    无人机在研制过程中需要不断地进行飞行测试 xff0c 而测试的过程不是万无一失的 xff0c 飞行过程中发生任何错误都有可能会导致无人机的损毁或破坏 xff0c 更严重地甚至会造成外界伤害 基于此我们推出了无人机的三旋转自由度 3 DOF
  • ADS-B教学实验方案

    ADS B教学系统是为了让学生学习ADS B原理 ADS B系统组成 ADS B信号处理技术 可以通过ADS B教学系统进一步研究分析ADS B位置的精度 准确性 稳定性 实时性 xff0c 设计基于ADS B的空中碰撞告警系统 xff0c
  • ROS系列:工作空间及功能包创建

    前言 分享一下ROS开发的基础教程 xff0c 全部自己手敲 xff0c 希望能帮到正在学习的你 ROS在WIKI上也有教程 xff0c 个人觉得太过臃肿 xff0c 可以简化点 xff0c 毕竟大家都赶着投胎 xff0c 哈哈哈哈哈 一
  • java UDP DatagramSocket接收不到数据

    今天联系这个通信 xff0c 接收端总是接收不到数据 xff01 排除代码本身有可能出现的错误 xff0c 比如地址 xff0c 数据宝包 我称它为数据宝宝 xff09 等等自己粗心的错误后还是不行 xff0c 我查看各种方法 xff0c
  • Python与爬虫有什么关系?

    爬虫一般是指网络资源的获取 xff0c 因为python的脚本特征 xff0c Python易于配置 xff0c 对字符的处理也非常灵活 xff0c 加上python有丰富的网络抓取模块 xff0c 所以两者经常联系在一起 接下来我们可以详
  • C++中struct和class的区别

    1 C 43 43 中struct和class的区别 C 43 43 中的struct其实是为了与C的兼容性而留下来的 C 43 43 的struct和class其实大部分都是相同的用法 xff0c 基本上可以用class做的事都可以用st
  • L298N驱动步进电机,有stm32代码亲测可用

    1 1 步进电机相关概念 相数 xff1a 产生不同对极N S磁场的激磁线圈对数 xff0c 常用 m 表示 例如 xff1a 二相四线电机 xff0c 就有两对极N S磁场的激磁线圈 xff0c 四个线圈 上图可知 xff0c A 43
  • C++成员初始化

    C 43 43 成员分为 xff1a 一般变量 xff0c const修饰变量 xff0c 引用类型成员 xff0c static成员 xff0c const staic成员 同static const xff0c 自定义类型对象 clas
  • HTTP协议解析

    目录 1 HTTP协议的概念 2 HTTP协议格式 3 HTTPS 1 HTTP协议的概念 在我们之前学习网络的过程中 xff0c 我们知道了目前主流网络分层模型共分为5层 xff0c 分别是物理层 xff0c 数据链路层 xff0c 网络
  • cmake编译opencv开源项目报错问题

    最近使用cmake在编译一个配置了opencv环境的c 43 43 开源项目时遇到如下问题 CMake Warning at D opencv4 OpenCVConfig cmake 176 message Found OpenCV Win

随机推荐

  • Ubuntu系统换源

    简单介绍一下源 xff0c 源就是一个大仓库 xff08 类似应用商店 xff09 xff0c 系统下载软件需要从这个仓库下载 xff0c 因为Ubuntu默认源是国外的 xff0c 所以在下载东西的时候会出现下载速度很慢的情况 xff0c
  • 字符串的简单介绍和字符串的大小比较

    以前就写过一篇关于String的文章 xff0c 今天再来写一篇 xff0c 更加深入了解一下String类 x1f550 1 String类的定义 x1f551 2 String类的创建 x1f552 3 字符串的大小比较 1 之前在C语
  • 数据结构1

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
  • 洛谷P5740 【深基7.例9】最厉害的学生

    题目描述 现有 N N le 1000 N N 1000 名同学参加了期末考试 xff0c 并且获得了每名同学的信息 xff1a 姓名 xff08 不超过 8 个字符的仅有英文小写字母的字符串 xff09 语文 数学 英语成绩 xff08
  • C语言创建链表并输出

    代码如下 define CRT SECURE NO WARNINGS include lt stdio h gt include lt assert h gt include lt string h gt include lt stdlib
  • 游戏搬砖是什么意思?

    网络游戏搬砖是指在各网络游戏中 xff0c 玩家把花大量时间 精力赚的钱转手为游戏买各种东西 搬砖原本是一个汉语词语 xff0c 意思是原指搬运砖块 xff0c 在网络语中 xff0c 搬砖引申为工作辛苦 重复机械 赚钱不多的工作 在一些方
  • C语言实现扫雷游戏

    话不多说直接淦代码 代码都有详细注释 define CRT SECURE NO WARNINGS include lt stdio h gt include lt time h gt include lt stdlib h gt inclu
  • C语言用栈实现队列(数据结构)

    1 首先需要两个栈来模拟队列的出队和入队 2 假设入队1 2 3 4 如果要出队则不能直接出栈 需要进行数据的搬移 先把s1的数据全部放入s2中 然后再在s2出栈 gt 整个队列出队 3 如果再要入队则将入队元素放入s1 若要出队则出栈s2
  • Linux权限理解(详细详细)

    目录 一 权限的概念 二 Linux权限管理 1 文件访问者的分类 xff08 人 xff09 2 文件类型和访问权限 xff08 事物属性 xff09 3 文件权限值的表示方法 1 字符表示 2 8进制数字表示法 4 文件访问权限的相关设
  • Linux管道

    目录 1 管道概念 2 管道分类 1 匿名管道 1 基本实现与概念 2 站在文件描述符角度 深度理解管道 3 站在内核角度 管道本质 4 管道读写规则 5 管道属性设置与阻塞验证 6 管道特点 匿名 2 命名管道 1 创建一个命名管道 2
  • string类(C++)

    目录 一 简单了解string类 二 string的接口与使用 2 1string类对象的常见构造 2 2 string类对象的容量操作 2 3 string类对象的访问及遍历操作 2 4 string类对象的修改操作 一 简单了解stri
  • 力扣260:只出现一次的数字|||(异或)

    目录 题目 解析 完整代码 题目 我们首先看一下题目 给定一个整数数组 nums xff0c 其中恰好有两个元素只出现一次 xff0c 其余所有元素均出现两次 找出只出现一次的那两个元素 你可以按 任意顺序 返回答案 接口 class So
  • C++(多态)

    目录 一 多态概念 二 多态的定义及实现 2 1多态的构成条件 2 2 虚函数 2 4虚函数重写的两个例外 2 5 C 43 43 11 override 和 final 三 重载 覆盖 重写 隐藏 重定义 的对比 一 多态概念 多态的概念
  • STM32系列——串口收发数据基础

    串行接口相关知识 两种通信方式 xff1a 并行通信与串行通信 xff0c 并行通信传输速度快但是占用的引脚资源多 xff0c 串行通信传输速度慢但是占用的引脚资源少 三种模式 xff1a 单工 半双工 全双工 异步串行通信 通信双方在没有
  • 【ROS小记】树莓派ubuntu mate20.04换源

    根据网上教程更换软件源时发现报错 错误 8 http ppa launchpad net ubuntu desktop ubuntu make ubuntu focal Release 404 Not Found 以及 仓库 34 34 无
  • orb-slam2跑通EuRoC数据集,并用evo对其进行评估(详细)

    evo的安装 xff1a 打开终端 xff0c 运行下面的指令 xff1a sudo apt install python pip pip install evo upgrade no binary evo pip install evo
  • Python爬虫是什么?

    首先要知道python爬虫是一个程序 xff0c 这个程序的目的就是为了抓取万维网信息资源 xff0c 比如你日常使用的谷歌等搜索引擎 xff0c 搜索结果就全都依赖爬虫来定时获取 了解一个python爬虫离不开了解一下爬虫的基本原理 xf
  • 【struct和class的区别】

    在C中struct有以下特征 xff1a 1 C中的struct是一种数据类型 xff0c struct内不能包含函数 2 C中struct不能为空 在C 43 43 中的struct和class的区别 在c 43 43 中将struct的
  • clion的安装、汉化与配置

    这里我们就来详细介绍一下CLion的安装 汉化 激活以及配置吧 xff01 xff01 目录 一 安装1 下载安装包2 开始安装 二 汉化三 配置 xff08 MinGW xff09 1 官网下载MInGW2 开始配置 四 检验 一 安装
  • 串口通信+实例编写

    一 通信接口背景知识 1 处理器与外部设备通信的两种方式 并行通信 xff1a 传输原理 xff1a 数据各个位同时传输 优点 xff1a 速度快 缺点 xff1a 占用引脚资源多 xff08 例如 xff1a A向B进行传输时一次性可以用