USART串口通信(stm32)

一、串口通信

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统

通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

STM32F103C8T6 USART资源: USART1、 USART2、 USART3

自带波特率发生器,最高达4.5Mbits/s

可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2 -->一般都是一个停止位)  

可选校验位(无校验/奇校验/偶校验-->一般不用)

SART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

支持同步模式(多一个输出时钟,之后变成同步通信--->一般不用)、硬件流控制(多一条硬件的线,如果接收方准备好接收则硬件线就置高电平,否则置低电平,这样就不会导致对方发送数据过快,没有处理的数据被覆盖-->一般不用硬件流方式)、DMA、智能卡、IrDA、LIN

二、接线规则

简单双向串口通信有两根通信线(发送端TX和接收端RX) ,TX与RX要交叉连接 ,当只需单向的数据传输时,可以只接一根通信线 当电平标准不一致时,需要加电平转换芯片。

三、串口参数、时序

波特率:串口通信的速率(例如:1Mbps,则1S传输1000位数据)

起始位:标志一个数据帧的开始,固定为低电平(空闲时是高电平)

数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行

校验位:用于数据验证,根据数据位计算得来(例如:奇校验->包括校验位的9个数据中的1要为奇数(1110 1110 1),偶校验->包括校验位的9个数据位中的1要为偶数(1100 1100 0))

停止位:用于数据帧间隔,固定为高电平(0.5/1/1.5/2)

停止位:用于数据帧间隔,固定为高电平(0.5/1/1.5/2)

四、数据发送和接收、寄存器、引脚图

发送数据寄存器(TDR)和接收数据寄存器(RDR)占用同一个地址,在程序中表现出来的只有一个DR寄存器,写的时候从TDR写进去,读的时候从RDR读。

发送移位数据寄存器:把数据一位一位的移出去

                例发送:给TDR写入一个0X55(0101 0101)数据,此时硬件检测到写入数据了(数据在发送数据寄存器),就会检查移位寄存器是否有别的数据在移位,如果没有0x55就会整体全部进入移位数据寄存器,当数据从TDR数据寄存器进入移位寄存器时,会置一个TXE(TX Empty发送数据寄存器空)的标志位,如果标志位是1,则说明发送数据寄存器为空,可以向发送数据寄存器继续写入数据。移位数据寄存器有数据时,在发送控制器的驱动下,将数据发送到TX。移位数据寄存器为空时TC标志位置1;(低位先行)

                例接收:RX有数据时在接收控制器的驱动下将数据一位一位的移动到移位寄存器,当移位寄存器收满一个字节时,就会将数据整体一下子全部转移到数据寄存器(RDR),接收移位寄存器是从高位往低位的方向移动(高位先行)。当RXNE置1是说明接收数据寄存器有数据

五、代码

#include "usart.h"
#include "stm32f10x.h"

void usart_init(void)
{
	
	GPIO_InitTypeDef gpioInit;			//定义配置GPIO的结构体
	USART_InitTypeDef usartInit;		//定义配置串口的结构体
	NVIC_InitTypeDef NVICInit;		    //定义配置中断控制的结构体
//1.配置时钟:  GPIO口的时钟,串口的时钟, 引脚复用的时钟
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART 中断的配置
	
//2.配置GPIO的结构体
	//配置PA9(TX)
	gpioInit.GPIO_Mode  = GPIO_Mode_AF_PP;
	gpioInit.GPIO_Pin   = GPIO_Pin_9;
	gpioInit.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &gpioInit);
	
	//配置PA10(rx)
	gpioInit.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	gpioInit.GPIO_Pin   = GPIO_Pin_10;
	GPIO_Init(GPIOA, &gpioInit);
	 
//3.配置串口的结构体
	usartInit.USART_BaudRate             = 115200;                 		  //配置波特率为9600
	usartInit.USART_HardwareFlowControl  = USART_HardwareFlowControl_None;//是否开启硬件流控模式
	usartInit.USART_Mode				 = USART_Mode_Rx | USART_Mode_Tx; //设置模式为读和写方式
	usartInit.USART_Parity				 = USART_Parity_No;				  //设置奇偶校验位为空
	usartInit.USART_StopBits			 = USART_StopBits_1;			  //设置停止为1
	usartInit.USART_WordLength			 = USART_WordLength_8b;			  //设置发送或者接收的帧数为八字节
	USART_Init(USART1, &usartInit);                                       //初始化串口的结构体
	USART_Cmd(USART1, ENABLE);											  //打开串口

//配置NVIC中断控制器
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVICInit.NVIC_IRQChannel = USART1_IRQn;
	NVICInit.NVIC_IRQChannelCmd = ENABLE;
	NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
	NVICInit.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVICInit);
	
}
//发送字符
void USARTSsendData(USART_TypeDef* USARTx, uint16_t Data)
{
	USART_SendData(USARTx,Data);  
	//等待发送数据寄存器中的数据被取走
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待高电平,数据发送完是高电平
}

//发送字符串,字符串所以数据都发送完之后才跳出中断
void USARTSsendStr(USART_TypeDef* USARTx, char *str)
{
	uint16_t i = 0;
	do
	{
		USARTSsendData(USARTx, *(str+i));
		i++;
		
	}while(*(str+i) != '\0');
	//等待发送移位寄存器(为空)
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);//等待高电平,数据发送完是高电平
	
}
//USART_FLAG_TC就是用来标志,发送移位寄存器中的数据有没有全部发送出去
//其实USART_FLAG_TXE就是用来标志一个事件的,通过它的值可以知道该事件有没有发生(即发送数据寄存器中的数据有没有被取走)。
//重定向输出函数
int fputc(int ch,FILE *F)
{
	USART_SendData(USART1,(uint8_t) ch);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待高电平,数据发送完是高电平
	return ch;//内容是通过串口发送的,而不是这个返回值
	
}

//重定向输入
int fgetc(FILE *F)
{
	while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待高电平,数据发送完是高电平
	return (int)USART_ReceiveData(USART1);						//高电平的时候,收到数据可以读出数据,0是没有数据
	
}


//void USART1_IRQHandler(void)
//{
//	char tmp; 
//	if(USART_GetITStatus(USART1, USART_IT_RXNE) ==SET )
//	{
//		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//		tmp = USART_ReceiveData(USART1);
//		USART_SendData(USART2, tmp);
//		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);//等待发送完成
//	}
//	
//}






/*
	    @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5) CTS标志位
  *     @arg USART_FLAG_LBD:  LIN Break detection flag							//LIN中断检测位
*     @arg USART_FLAG_TXE:  Transmit data register empty flag					//发送数据寄存器空标志位
*     @arg USART_FLAG_TC:   Transmission Complete flag						//发送完成空标志位
  *     @arg USART_FLAG_RXNE: Receive data register not empty flag			//接收数据寄存器非空标志位
  *     @arg USART_FLAG_IDLE: Idle Line detection flag						//空闲总线标志位
  *     @arg USART_FLAG_ORE:  OverRun Error flag							//溢出错误标志位
  *     @arg USART_FLAG_NE:   Noise Error flag								//噪声错误标注位
  *     @arg USART_FLAG_FE:   Framing Error flag							//帧错误标志位
  *     @arg USART_FLAG_PE:   Parity Error flag								//奇偶错误标志位
  * @retval The new state of USART_FLAG (SET or RESET).
*/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:二叉树与树

一 树的基本概念: 1.树的形状: 2.树的定义: 树是一种非线性的数据结构,它是n(n > 0)个结点的有限集。当n 0时,称为空树。在任意一棵非空树中应满足: 2.1 有且仅有一个特定的称为根的结点。 2.2 当n …

【React】Ant Design 5.x版本table scroll滚动条样式自定义

新版里table的滚动条样式由:scrollbar-width、scrollbar-color接管,导致之前的伪类方式失效! 环境 antd: ^5.14.1react: ^18 解决方案: 若想延续伪类方式修改滚动条样式,可以在定义伪类样式文件里加入以下片段: .a…

什么是JDK21虚拟线程

JDK21虚拟线程 1. 来一段小故事2. 什么是虚拟线程3. 虚拟线程的几个关键特点4.细说关键特点1.为什么轻量级的1.传统线程运行时间2.虚拟线程运行时间3.对垃圾回收的影响 2.非绑定OS线程的魅力所在3.和传统相比为何易于使用4.阻塞优化有什么好处1.什么是阻塞优化2.JDK 21虚拟线程…

配置docker阿里云镜像地址

一、安装docker的步骤: 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …

【LVGL_Linux安装NXP的Gui-Guider】

GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。 虽然他只支持自家芯片,但是应用层我们可以直接拿来用作其他MCU上。 GUI-Guider 下载 NXP官网下载:链接&#xff1…

关于sklearn决策树手动指定节点进行剪枝调整的实现

一、决策树剪枝 决策树的剪枝方式有两种,预剪枝和后剪枝,后剪枝在python的sklearn方法中提供了CCP代价复杂度剪枝法(Cost Complexity Pruning)具体实现代码如下: # -*- coding: utf-8 -*- from sklearn.datasets imp…

AI模型抉择:开源VS闭源,谁主沉浮?

AI模型抉择:开源VS闭源,谁主沉浮? 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 &am…

软件设计师备考 | 案例专题之数据库设计 概念与例题

相关概念 关注上图中的两个部分: 概念结构设计 设计E-R图,也即实体-联系图。 工作步骤:选择局部应用、逐一设计分E-R图、E-R图合并。进行合并时,它们之间存在的冲突主要有以下3类: 属性冲突。同一属性可能会存在于…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会孵化及运营的开源项目,是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统,为系统提供了相机、…

MySQL中视图是什么,有什么作用

目录 一、视图的简介 1.1 什么是视图? 1.2 为什么使用视图? 1.3 视图有哪些规则与限制? 1.4 视图能否更新? 二、视图的创建 三、视图的作用 3.1 用视图简化复杂的联结 3.2 用视图格式化检索出的数据 3.3 用视图过滤数据…

redisson 使用fastJson2序列化

前因:一个项目:有人用redisTemplete存数据(使用了fastjson2),使用redisson取的时候就会报错。要让redisTemplete与redisson序列化一致 一、自定义序列化器 import com.alibaba.fastjson2.JSON; import com.alibaba.fa…

LeetCode //C - 119. Pascal‘s Triangle II

119. Pascal’s Triangle II Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: rowIndex 3 Output: …

集中抄表电表是什么?

1.集中抄表电表:简述 集中抄表电表,又称为远程抄表系统,是一种现代化电力计量技术,为提升电力行业的经营效率和客户服务质量。它通过自动化的形式,取代了传统人工抄水表,完成了数据信息实时、精确、高效率…

C# 深拷贝和浅拷贝

文章目录 1.深拷贝2.浅拷贝3.拷贝类4.浅拷贝的实现5.深拷贝实现5.1 浅拷贝对象,对引用类型重新一个个赋值5.2 反射实现5.3 利用XML序列化和反序列化实现 1.深拷贝 拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。…

Python基于PyQt6制作GUI界面——按钮

示例对应的制作的 ui文件 界面如下所示。 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Form</class><widget class"QWidget" name"Form"><property name"geom…

C#使用开源操作库MiniExcel操作Excel

简介 MiniExcel 简单、高效避免 OOM 的.NET 处理 Excel 查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作&#xff0c;但这会导致内存消耗问题&#xff0c;MiniExcel 尝试以 Stream 角度写底层算法逻辑&#xff0c;能让原本 1000 多 MB 占用降低到几 …

2024年【N1叉车司机】考试题及N1叉车司机找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试题参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N1叉车司机找解析学员顺利通过考试。 1、【多选题】《特种设备使用…

微服务-系统架构

微服务&#xff1a; 系统架构的演变 单一应用架构 早期的互联网应用架构&#xff0c;大量应用服务 功能 集中在一个包里&#xff0c;把大量的应用打包为一个jar包&#xff0c;部署在一台服务器&#xff0c;例如tomcat上部署Javaweb项目 缺点:耦合度高&#xff0c;一台服务器…

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求&#xff0c;用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务&#xff0c;我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…

PyTorch安装与配置

前言 参考文档&#xff1a;https://github.com/TingsongYu/PyTorch-Tutorial-2nd 环境配置之Anaconda 解释器——python.exe&#xff0c;是人类与CPU之间的桥梁&#xff0c;需要配置系统环境变量 Anaconda&#xff1a;集成环境&#xff0c;包管理器 Conda 安装 Anaconda&am…