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;                 		  //配置波特率为9600usartInit.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;			  //设置停止为1usartInit.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.mzph.cn/bicheng/15600.shtml

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

相关文章

方正畅享全媒体新闻采编系统 binary.do SQL注入漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…

【华三包过】2024年/华三H3C/云计算GB0-713

H3CNE-cloud-云计算-713 想转行 想继续深入 题库覆盖百分百,题库有新版106道新版113道旧版88道 H3C认证云计算工程师(H3C Certified Network Engineer for Cloud,简称H3CNE-Cloud) 认证定位于全面掌握虚拟化技术原理及相关产品/…

MySQL的数据库和表

查看数据库 命令行的方式: cd /mysql/bin mysql.exe -uroot -p IP(不是连接自己) 端口(不是3306) show databases; 直接使用图形化界面点击: 查看库里的表 使用命令行查看: 进入mysql数据库 u…

JavaFX学习教程二

一、JavaFX 体系结构 JavaFX 场景图(Scene Graph)是构建 JavaFX 应用程序的起点,一种树状数据结构,用于排列(和分组)图形对象,以便于逻辑表示。 stage:舞台,操作系统窗口的 JavaFX 表示,是所有…

Nodejs+Socket.io+Web端完成聊天

前言 源码获取:nodeexpresssocket.ioweb: 聊天demo (gitee.com) 目录结构 后端依赖 启动方式 前端是html正常启动 后端是node app.js 后端app.js核心代码 const express require(express) const app express() var http require(http).Server(app) var io require(so…

浅谈C++函数

目录 一、函数的概念二、调用函数的两个前提三、函数传参的三种形式四、函数返回类型 一、函数的概念 函数是C程序的基本模块,通常一个C程序由一个或多个函数组成。函数可以完成用户指定的任务,一般分为库函数和用户自定义的函数。函数由函数头和函数体…

02. Flink 快速上手

02. Flink 快速上手 1、创建项目导入依赖 pom文件&#xff1a; <properties><flink.version>1.17.0</flink.version> </properties><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java<…

【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;C语言刷题系列 目录 一、问题描述 二、解题思路 解题思路&#xff1a; 解题步骤: 三、C语言代码实现及测试 一、问题描述 给定一…

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

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

基于JSP/Servlet校园二手交易平台(二)

目录 2 开发技术及开发环境 2.1 Java语言简介 2.2 J2EE技术介绍 2.3 Servlet/JSP技术 2.4 MVC 简介 2.5 Struts 技术 2.6 Hibernate 技术 2.6.1 应用程序的分层体系结构 2.6.2 Hibernate的应用及API简介 2.7 开发环境及环境配置 2.7.1 Java/JSP系统环境 2.7.2 JSP环…

小程序-购物车-基于SKU电商规格组件实现

SKU 概念&#xff1a; 存货单位&#xff08; Stock Keeping Unit &#xff09;&#xff0c; 库存 管理的最小可用单元&#xff0c;通常称为“单品”。 SKU 常见于电商领域&#xff0c;对于前端工程师而言&#xff0c;更多关注 SKU 算法 &#xff0c;基于后端的 SKU 数据…

(二)vForm 动态表单设计器之下拉、选择

系列文章目录 &#xff08;一&#xff09;vForm 动态表单设计器之使用 目录 系列文章目录 前言 一、后端需提供接口 二、组件配置 总结 前言 动态表单下拉、选择等组件&#xff0c;大概率要使用数据库中的数据&#xff0c;那么vForm如何拿到数据库中的数据呢&#xff1f;跟随…

动物合并消除休闲游戏源码 Animal Merge 益智游戏

一款动物合并消除休闲游戏源码&#xff0c;Animal Merge是一款引人入胜的益智游戏&#xff0c;玩家的任务是合并方块&#xff0c;创造出可爱的动物&#xff0c;这些动物的体型会逐渐变大。游戏玩法包括将方块放到网格上&#xff0c;并战略性地将它们合并以形成更大的动物形状。…

【408精华知识】主存相关解题套路大揭秘!

讲完了Cache&#xff0c;再来讲讲主存是怎么考察的&#xff0c;我始终认为&#xff0c;一图胜千言&#xff0c;所以对于很多部件&#xff0c;我都是通过画图进行形象的记忆&#xff0c;那么接下来我们对主存也画个图&#xff0c;然后再来详细解读其考察套路~ 文章目录 零、主存…

python-pytorch 下批量seq2seq+Bahdanau Attention实现问答1.0.000

python-pytorch 下批量seq2seq+Bahdanau Attention实现简单问答1.0.000 前言原理看图数据准备分词、index2word、word2index、vocab_size输入模型的数据构造注意力模型decoder的编写关于损失函数和优化器在预测时完整代码参考前言 前面实现了 luong的dot 、general、concat注意…

【话题】我眼神的IT行业现状与未来趋势

目录 一、挑战 教学资源的重新分配 教师角色的转变 学生学习方式的改变 教育评价体系的挑战 二、机遇 个性化学习 跨学科学习 国际合作与交流 创新教育模式 三、如何培养下一代IT专业人才 更新教育理念 加强基础设施建设 整合课程资源 加强实践教学 培养跨学科…

【Linux】TCP协议【中】{确认应答机制/超时重传机制/连接管理机制}

文章目录 1.确认应答机制2.超时重传机制&#xff1a;超时不一定是真超时了3.连接管理机制 1.确认应答机制 TCP协议中的确认应答机制是确保数据可靠传输的关键部分。以下是该机制的主要步骤和特点的详细解释&#xff1a; 数据分段与发送&#xff1a; 发送方将要发送的数据分成一…

vue深度选择器(:deep​)

处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子组件&#xff0c;可以使用 :deep() 这个伪类&#xff1a; <style lang"scss" scoped> .evaluation-situation-details :deep .cl-icon-arrow-right {display: none…

【Python 对接QQ的接口(二)】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.05.25 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

JS根据所选ID数组在源数据中取出对象

let selectIds [1, 3] // 选中id数组let allData [{ id: 1, name: 123 },{ id: 2, name: 234 },{ id: 3, name: 345 },{ id: 4, name: 456 },] // 源数据let newList [] // 最终数据selectIds.map((i) > {allData.filter((item) > {item.id i && newList.pus…