USART串口通信(stm32)

news2025/3/16 2:29:14

一、串口通信

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

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

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).
*/

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

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

相关文章

基于Android studio 使用SQLite数据库完成登录注册功能——保姆级教程

🍅文章末尾有获取完整项目源码方式🍅 点击快捷传送地址: 保姆级教学——制作登陆注册功能页面 目录 一、准备工作 二、创建相关文件 三、页面布局 四、DabaHelper帮助类的编写 五、RegisterActivity注册页面 六、LoginActivity登录页面…

【Kafka】消息的顺序性、可靠性、幂等性

目录 消息顺序性消息可靠性生产者丢失消息消费者丢失消息Kafka丢失消息 消息幂等性 消息顺序性 消息追加到partition尾部,单个partition是有序的,但多个partition如何进行有序的获取一些消息? 解决方案 一个topic只设置一个partition&…

深入了解Socket套接字

目录 一、引入🙌 1、概念 🎉 2、分类🎉 Socket 套接字主要针对传输层协议分为流套接字、数据报套接字、原始套接字(了解即可)三类。 1)流套接字:使用传输层TCP协议 2)数据报套…

基于Matlab使用BP神经网络进行电力系统短期负荷预测

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 电力系统的短期负荷预测对于电力调度和能源管理具有至关重要的作用。通过准确地预测电力负荷&…

代码随想录算法训练营第三十七天|435. 无重叠区间、763.划分字母区间、56. 合并区间、738.单调递增的数字、968.监控二叉树

435. 无重叠区间 文档讲解:代码随想录 题目链接:. - 力扣(LeetCode) 本道题与上个题目相似,都是求重叠区间 统计重叠区间的个数,减去重叠区间的个数就是无重叠区间了 主要就是为了让区间尽可能的重叠。&a…

HTML5新特性、JS【初识JS 、JS核心语法】--学习JavaEE的day47

day47 HTML5新特性 定义文档类型 在文件的开头总是会有一个标签 语言文档类型声明方式html4<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">html5<!DOCTYPE html> 新增语义化标签 理解&…

SpringBoot + MybatisPlus

SpringBoot MybatisPlus 整合记录 1. 硬件软件基本信息2. 相关链接3. 通过idea快速生成一个Springboot项目4. 启动报错问题解决问题一&#xff1a;Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”问题二&#xff1a;启动的时候提示需要一个Bean&#xff0…

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins&#xff0c;主要记录jenkins的安装和端口的修改。 前提条件&#xff1a;安装了jdk&#xff0c;我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包&#xff0c;可以通过下面的链接进行下载&a…

深入理解内联函数(C语言)

目录 1.什么是内联函数2.内联函数与宏3.编译器对内联函数的处理4.参考文献 1.什么是内联函数 很多人都会知道&#xff0c;可以将比较小的函数写成内联函数的形式&#xff0c;这样会节省函数调用的开销&#xff0c;具体是什么样的开销呢&#xff1f; 一个函数在执行过程中&…

低利率之后如何选择?以日本养老金为例

天风证券认为&#xff0c;日本养老金资产配置行为具备的关键特征包括&#xff1a;海外资产占比上升、日元境内资产占比下降&#xff1b;权益类&#xff08;包括境内和境外&#xff09;占比上升&#xff0c;等等。 日本从1990年代开始陷入低增长、低通胀的局面&#xff0c;我们以…

解决win系统msvcp140.dll丢失的多种常用方法,亲测有效!

msvcp140.dll 是一个重要的Windows系统文件&#xff0c;属于Microsoft Visual C Redistributable runtime components的一部分&#xff0c;特别与Visual Studio 2015及之后版本编译的C应用程序相关联。这个动态链接库&#xff08;DLL&#xff09;文件包含了一系列C标准库的功能…

好用的window粘贴板

可以设置指定的快捷键&#xff0c;在需要使用最近复制的记录时快速的复用 -> Ditto。 选择Download即可 地址&#xff1a;Ditto clipboard manager (sourceforge.io)https://ditto-cp.sourceforge.io/

VUE3+Vite+vant4从零开始构建前端项目

VUE3Vitevant4从零开始构建前端项目 1. 环境准备Node.js 安装 2. Vite 构建项目3. 集成Vant41. 安装Vant 组件2. 引入组件3. 使用vant按钮组件 1. 环境准备 Node.js 安装 Node.js官网地址&#xff1a;https://nodejs.p2hp.com/ 下载最新的版本&#xff0c;下载文件为msi结尾的…

用本地大模型(llama3)进行数据分类标记|LLM 用例

001&#xff5c;背景 这是我最新发布的导航站点 https://aiwith.me 这个站点由于第一版数据来源于第三方&#xff0c;只有站点基础数据&#xff0c;没有对数据进行分类&#xff0c;最近站点上线了&#xff0c;主体框架都搭建完成了&#xff0c;这才有空去对数据做分类. 目前的…

Android kotlin协程

说明 可代替线程整异步可控制&#xff0c;灵活 &#xff08;控制优先级&#xff0c;内存占用等&#xff09;速度快 效率高有数量上限 使用 runBlocking 一般用于测试 不建议使用GlobalScope.launch 全局的 生命周期跟随application 不建议使用CoroutineScope(job) 用 基本使…

C结构详解

目录 1、结构模板 1. 建立结构声明 2. 定义结构变量 3. 访问结构成员 4. 初始化结构 声明结构数组 声明和初始化结构指针 1、结构模板 1. 建立结构声明 struct book{char title[MAXTITL];char author[MAXAUTL];float value; }&#xff1b; 该声明描述了一个又两个字符…

指北者智能音乐学习机隆重亮相广州国际乐器展

2024年5月23-26日广州国际乐器展览会在广交会展馆B区隆重开幕&#xff0c;本届展会开设5大展厅、50000平方米的主题展区&#xff0c;吸引了700多家国内外参展商参展&#xff0c;打造集展示、商贸、文化交流、文娱于一体的广阔平台。深圳市指北科技有限公司也携旗下品牌指北者智…

plt多子图设置

import matplotlib.pyplot as plt# 使用 subplots 函数创建一个 2x3 的子图网格 fig, axs plt.subplots(nrows2, ncols3, figsize(16, 10)) # 调整 figsize 来改变图像大小# 遍历每个子图&#xff0c;并绘制一些内容&#xff08;这里只是简单的示例&#xff09; for ax in ax…

leetcode230 二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 输入&#xff1a;root [5,3,6,2,4,null,null,1], k 3 输出&#xff1a;3 解析 这道题应该是能做出…