USART的标准库编程

使用USART与计算机通信
在这里插入图片描述
电脑上只有usb端口 没有TX 和RX需要一个USB转TTL电平模块来实现通信
在这里插入图片描述
芯片C8T6中只有三个UASRT 选其中一个UASRT来通信即可 那么如何定位那个USART的TX 和RX引脚呢?
方式1 查找最小系统板引脚分布图
在这里插入图片描述
查找USART1的引脚 RTS CTS是硬件流控 CK引脚是同步时钟 (因为串口用的是异步通信所以不用到) 紫色绿圈圈起来的是复用 当有IO冲突时就可以重映射到别的引脚上
方式2 查找“复用功能重映射表”
在这里插入图片描述
当没有被重映射的时候 TX和RX的引脚分别为PA9
PA10 当被重映射后 TX和 RX引脚为PB6 PB7
这次我们使用了重映射
在这里插入图片描述
安装USB转TTL驱动
在这里插入图片描述
在这里插入图片描述
双击打开安装
安装串口调试助手软件

UASRT标准库编程接口

在这里插入图片描述
初始化 总开关 发送数据 接收数据 读取标志位
USART_Init
在这里插入图片描述
调用这个函数是对 CR寄存器的M STOP PE PS bit位进行操作 M是设置数据帧数据位 STOP是设置停止位的长度 PE是是否使用(使能)校验 PS是使用奇校验还是偶校验
还是声明一个结构体 然后填表对应的值 完成初始化
在这里插入图片描述
对应的成员 world…是设置数据帧的数据位的 Parity是设置是否使能校验 是使用奇校验还是偶校验 STopb是设置停止位的长度的 MODE是设置UASRT的模式 是要接收数据还是要发送数据的 (是打开TX
还是RX开关 还是都打开) BaudRate是设置波特率的 Hardwar 是设置硬件流控的
回忆流控的知识点 当数据发送过快时有可能会造成数据的丢失 这时加入一个流控信号 当一个数据传输完成 且接收方接收完成就发送一个流控信号 即可进行下一数据的发送
在这里插入图片描述
如图是两个单片机间进行通信 上面的两个单片机左边的只需要使能GTS接收流控信号 而右边的只需要使能RTS发送流控信号 对于下面两个单片机 皆有发送和接收所以需要两个单片机同时使能RTS 和CTS
USART——Cmd (Cmd通常是开关的意思)
在这里插入图片描述
这个函数的第一个参数是选择USART的 例如选择USART1就填 USART1 第二个是是否打开总开关
USART_SendData
在这里插入图片描述
第一个任然是USART1 第二个就是要发送的数据
USART_GetFlagStatus
在这里插入图片描述
如图 第一个为要读取的串口USART1
在这里插入图片描述
在这里插入图片描述
调用这个函数就可以查询标志位是否为1或0了 如第一个示例代码 就可以判断TXE(SR状态寄存器)是否为1 为1才可以写入新的数据 如果为0就表示还有数据在TDR寄存器中

USART的初始化

在这里插入图片描述
本次实验不需要用到流控信号(硬件流控)所以不需要RTS CTS引脚 串口通信是异步的也不需要时钟引脚 然后为了增加难度就使用重映射 映射到PB7 PB6
在这里插入图片描述
IO引脚初始化
在这里插入图片描述
这里直接查表 F1系列的芯片手册
在这里插入图片描述
输出是复用(通过USART控制IO引脚)
在这里插入图片描述
全双工和半双工的概念 就是全双工就是既可以发送数据也可以接收数据 二者能同时进行 半双工就是当你发送数据的时候就不能接收数据 当你接受数据的时候就不能发送数据 (半双工极少用到)
注意上表的CTS引脚最好为上拉输入 因为当空闲时给CTS一个高电平就默认为空闲模式 当CTS接收到高电平时就TX引脚就不会发送数据 处于空闲状态
RX引脚选择为上拉输入模式
完整的参数表格
在这里插入图片描述
复用功能重映射
在这里插入图片描述
设置USART的参数
在这里插入图片描述
闭合总开关
在这里插入图片描述USART的初始化总代码

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{GPIO_InitTypeDef  GPIOBInitStruct;PAL_Init();//初始化 TX PB6 AF_PP 10MHZRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB的时钟GPIOBInitStruct.GPIO_Pin = GPIO_Pin_6;GPIOBInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //配置PB6为复用推挽输出GPIOBInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIOBInitStruct);//	配置PB6(RTX)为复用推挽模式//初始化 RX PB7 IPU GPIOBInitStruct.GPIO_Pin =GPIO_Pin_7;//引脚配置GPIOBInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置PB7为输入上拉模式GPIO_Init(GPIOB,&GPIOBInitStruct);//重映射USART1的TX RX引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO的时钟GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); //使能USART的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//设置USART1的参数USART_InitTypeDef USARTInitStruct;USARTInitStruct.USART_BaudRate = 9600; //设置USART1的波特率为9600USARTInitStruct.USART_WordLength = USART_WordLength_8b; //设置数据帧的数据位为8位USARTInitStruct.USART_StopBits = USART_StopBits_1; //设置数据帧的停止位为1位USARTInitStruct.USART_Parity = USART_Parity_No; //不使用校验位 不需要使能 不使用奇偶校验USARTInitStruct.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;// 初始化USART1的模式是接收和发送USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; //不使用硬件流控USART_Init(USART1,&USARTInitStruct); 	//闭合总开关USART_Cmd(USART1,ENABLE);while(1){}
}

使用串口来发送数据
实验的简介
在这里插入图片描述
串口调试助手参数设置
在这里插入图片描述
如何用串口去发送单个字节
在这里插入图片描述
左边的代码是对寄存器的直接操作 右边是标准库的库函数操作
在这里插入图片描述
发送一个字节的代码

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{GPIO_InitTypeDef  GPIOBInitStruct;PAL_Init();//初始化 TX PB6 AF_PP 10MHZRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB的时钟GPIOBInitStruct.GPIO_Pin = GPIO_Pin_6;GPIOBInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //配置PB6为复用推挽输出GPIOBInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIOBInitStruct);//	配置PB6(RTX)为复用推挽模式//初始化 RX PB7 IPU GPIOBInitStruct.GPIO_Pin =GPIO_Pin_7;//引脚配置GPIOBInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置PB7为输入上拉模式GPIO_Init(GPIOB,&GPIOBInitStruct);//重映射USART1的TX RX引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO的时钟GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); //使能USART的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//设置USART1的参数USART_InitTypeDef USARTInitStruct;USARTInitStruct.USART_BaudRate = 9600; //设置USART1的波特率为9600USARTInitStruct.USART_WordLength = USART_WordLength_8b; //设置数据帧的数据位为8位USARTInitStruct.USART_StopBits = USART_StopBits_1; //设置数据帧的停止位为1位USARTInitStruct.USART_Parity = USART_Parity_No; //不使用校验位 不需要使能 不使用奇偶校验USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;// 初始化USART1的模式是接收和发送USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; //不使用硬件流控USART_Init(USART1,&USARTInitStruct); 	//闭合总开关USART_Cmd(USART1,ENABLE);//1.等待寄存器TDR清空while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; //TXE为0表示TDR寄存器中仍有数据// 2.写入要发送的数据USART_SendData(USART1, 0x5a);//3/等待数据发送完成while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET){};while(1){}
}

发送字节数组
在这里插入图片描述
发送一个数组

		uint8_t a[] = {0,1,2,3,4,5};uint32_t i;for(i=0;i<sizeof(a)/sizeof (uint8_t);i++){//1.等待TXE置位while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; //TXE为0表示TDR寄存器中仍有数据//2.把数据写入TDRUSART_SendData(USART1, a[i]);}//3/等待数据发送完成while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET){};

发送字符

const char *str = "Hello world";uint32_t i;for(i=0; i<strlen(str);i++){// 1. 等待TXE置位while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);// 2. TDRUSART_SendData(USART1, str[i]);	}	// 3. TC置位while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

串口接收数据
![在这里插入图片描述在这里插入图片描述![](https://img-blog.csdnimg.cn/98551df9699a4894bb7ee5ceef14b001.png)
在这里插入图片描述
在这里插入图片描述
发送1就灯亮 发送0灯就灭

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{GPIO_InitTypeDef  GPIOBInitStruct;PAL_Init();//初始化 TX PB6 AF_PP 10MHZRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB的时钟GPIOBInitStruct.GPIO_Pin = GPIO_Pin_6;GPIOBInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //配置PB6为复用推挽输出GPIOBInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIOBInitStruct);//	配置PB6(RTX)为复用推挽模式//初始化 RX PB7 IPU GPIOBInitStruct.GPIO_Pin =GPIO_Pin_7;//引脚配置GPIOBInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置PB7为输入上拉模式GPIO_Init(GPIOB,&GPIOBInitStruct);//重映射USART1的TX RX引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO的时钟GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); //使能USART的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//设置USART1的参数USART_InitTypeDef USARTInitStruct;USARTInitStruct.USART_BaudRate = 9600; //设置USART1的波特率为9600USARTInitStruct.USART_WordLength = USART_WordLength_8b; //设置数据帧的数据位为8位USARTInitStruct.USART_StopBits = USART_StopBits_1; //设置数据帧的停止位为1位USARTInitStruct.USART_Parity = USART_Parity_No; //不使用校验位 不需要使能 不使用奇偶校验USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;// 初始化USART1的模式是接收和发送USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; //不使用硬件流控USART_Init(USART1,&USARTInitStruct); 	//闭合总开关USART_Cmd(USART1,ENABLE);//	//1.等待寄存器TDR清空
//	 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; //TXE为0表示TDR寄存器中仍有数据
//	 
//	// 2.写入要发送的数据
//		USART_SendData(USART1, 0x5a);
//	
//	//3/等待数据发送完成
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET){};
//		uint8_t a[] = {0,1,2,3,4,5};
//		uint32_t i;
//		for(i=0;i<sizeof(a)/sizeof (uint8_t);i++)
//		{
//			//1.等待TXE置位
//			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){}; //TXE为0表示TDR寄存器中仍有数据
//			//2.把数据写入TDR
//				USART_SendData(USART1, a[i]);
//		}
//	
//			//3/等待数据发送完成
//		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET){};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIOBInitStruct.GPIO_Pin = GPIO_Pin_13; GPIOBInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIOBInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIOBInitStruct);GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭LEDuint8_t c;while(1){// 1. RXNEwhile(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);c = USART_ReceiveData(USART1);if(c == '0'){// 熄灭GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);}else if(c=='1'){//点亮GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);}else{}}
}

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

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

相关文章

C练习题_15

一、单项选择题(本大题共20小题&#xff0c;每小题2分&#xff0c;共40分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 在下列说法中&#xff0c;&#xff08;&#xff09;是正确的。 A.C程序从第一个函数开始…

Cache学习(1):常见的程序运行模型多级Cache存储结构

0 背景&#xff1a;常见的程序运行模型&#xff08;为什么要Cache&#xff09; 主存&#xff1a;Main Memory&#xff0c;硬件实现为RAM&#xff0c;产品形态&#xff1a;DDR&#xff08;例如&#xff1a; DDR3、DDR4等&#xff09;磁盘设备&#xff1a;Flash Memory&#xff…

IDEA如何将本地项目推送到GitHub上?

大家好&#xff0c;我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持多种编程语言和工具。它也内置了对Git和GitHub的支持&#xff0c;让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册&#xff0c;描述了…

Ubuntu下载离线安装包

旧版Ubuntu下载地址 https://old-releases.ubuntu.com/releases/ 下载离线包 sudo apt-get --download-only -odir::cache/ncayu install net-tools下载snmp离线安装包 sudo apt-get --download-only -odir::cache/root/snmp install snmp snmpd snmp-mibs-downloadersudo a…

idea开发jface、swt环境搭建

背景 jface、swt很难找到合适的maven仓库来下载配套的版本idea对eclipse套件不友好eclipse的windowbuilder固然很好&#xff0c; 但本人更喜欢idea编程&#xff0c; 互相取长补短 下载套件 进入swt下载界面 以当前最新的4.29为例&#xff0c; 点击&#xff1a; 找到全部并…

【brpc学习实践四】异步请求案例详解

注意 使用的还是源码的案例&#xff0c;添加个人注解。在前面的篇章我们讲解了客户端、服务端rpc构造的基本流程及同步、异步的案例基础之后&#xff0c;再理解此案例就容易了。 想直接看案例实现请看&#xff1a; server端实现 client端实现 服务端要点概览 controller ser…

2022最新版-李宏毅机器学习深度学习课程-P49 GPT的野望

GPT→类似于Transformer Encoder 训练任务&#xff1a;Predict Next Token 使用MASK-attention&#xff0c;不断预测“下一个token”。 可以用GPT生成文章。 How to use GPT? 给出描述和例子 给出前半段&#xff0c;补上后半段 In-context Learning(no GD) 结果 目前看起…

vue3 uniapp h5 安卓和iOS开发适配踩坑记录

font-size适配屏幕大小及iOS和安卓状态栏及安全距离的处理 App.vue <script setup lang"ts"> import { onLaunch, onShow, onHide } from "dcloudio/uni-app"; import ./main.scss onLaunch(() > {console.log("App Launch");var wid…

广西桂林钢结构钣金折弯件3d扫描全尺寸偏差检测-CASAIM中科广电

钣金是一种针对金属薄板&#xff08;通常在6mm以下&#xff09;的综合冷加工工艺&#xff0c;包括剪、冲/切/复合、折、焊接、铆接、拼接、成型&#xff08;如汽车车身&#xff09;等&#xff0c;其显著的特征就是同一零件厚度一致&#xff0c;通过钣金工艺加工出的产品叫做钣金…

uni-app:实现request请求的递归(设置request请求的访问次数),并且调用自定义方法给出返回值

一、效果展示 失败效果 成功效果 二、写入后端请求部分 分析 ①自定义一个模块common.js主要用于封装所有的请求函数 ②核心代码 function requestWithRetry(cmd, username, password, retryCount) {return new Promise((resolve, reject) > {uni.request({url: ip sys…

Openlayer【三】—— 绘制多边形GeoJson边界绘制

1.1、绘制多边形 在绘制多边形和前面绘制线有异曲同工之妙&#xff0c;多边形本质上就是由多个点组成的线然后连接组成的面&#xff0c;这个面就是最终的结果&#xff0c;那么这里使用到的是Polygon对象&#xff0c;而传给这个对象的值也是多个坐标&#xff0c;坐标会一个个的…

抖音本地生活服务商申请怎么做?无保证金的申请方法来了

想做抖音的本地生活服务项目&#xff0c;却不知道去哪里申请&#xff0c;或者如何申请&#xff0c;其实&#xff0c;官方的通道在今年上半年还是有的&#xff0c;自己去平台上提交资料申请就可以了&#xff0c;但需要缴纳高额的保证金。 而在今年下半年&#xff0c;平台已经关…

揭秘MySQL SLEEP()函数:避免这些常见误区,不再被时间迷惑!

点击上方蓝字关注我 关于MySQL sleep()函数&#xff0c;很多同学会觉得这个很简单&#xff0c;但是在和研发同学沟通时发现&#xff0c;很多人对此函数存在误解&#xff0c;本文举3个典型的例子进行说明。 1.误区一 以下SQL的运行结果是什么样的 SELECT NOW(),SLEEP(2),NOW()&a…

redis的数据类型的增删改查

redis的高可用 在集群中有一个非常重要的指标&#xff0c;提供服务的时间的百分比&#xff08;365天&#xff09;99.9% redis的高可用含义更加宽泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展&#xff0c;数据的安全性 在redis中实现高可用技术 持久化&…

Prometheus监控mysql nginx tomcat 黑盒监控

部署consul_exporter https://github.com/prometheus/consul_exporter/releases/download/v0.9.0/consul_exporter-0.9.0.linux-amd64.tar.gz 注册 ootubuntu20:~# cat consul_export.json rootubuntu20:~# cat consul_export.json {"services": [{"id"…

技术为业务赋能:深度剖析开发与业务的紧密结合

技术为业务赋能&#xff1a;深度剖析开发与业务的紧密结合 很多做开发的同学有一种认知&#xff0c;技术最牛&#xff0c;进而忽视了对业务的理解和积累&#xff0c;眼里认为技术和游戏一样&#xff0c;有着层出不穷的新技术&#xff0c;更新迭代的非常快&#xff0c;而业务方…

Modbus转Profinet网关在大型自动化仓储项目应用案例

Modbus转Profinet网关在大型自动化仓储项目应用案例 在自动化仓储项目中&#xff0c;Modbus是一种常见的通信协议&#xff0c;用于连接各种设备&#xff0c;例如传感器、PLC和人机界面。然而&#xff0c;Modbus协议只支持串行通信&#xff0c;并且数据传输速度较慢。为了提高通…

【C++历练之路】stack||queue||底层原理知多少

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; C标准模板库&#xff08;Standard Template Library&#xff0c;STL&#xff09;是C语言的一个重要组成部分&#xff0c;提供了一组通用的数据结构和算法&#xff0c;以便开发人员能够高…

计算机算法分析与设计(24)---分支限界章节复习

文章目录 一、分支界限法介绍二、旅行商问题应用三、装载问题应用3.1 问题介绍与分析3.2 例题 四、0-1背包问题应用4.1 问题介绍与分析4.2 例题 一、分支界限法介绍 二、旅行商问题应用 三、装载问题应用 3.1 问题介绍与分析 3.2 例题 四、0-1背包问题应用 4.1 问题介绍与分析…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…