STM32 串口实验(学习一)
本章将实现如下功能:STM32通过串口和上位机对话,STM32在收到上位机发过来的字符串后,原原本本返回给上位机。
STM32 串口简介
串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。
通过USB串口和电脑通信
串口最基本的设置,就是波特率的设置。只要开启了串口时钟,设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用。
- 串口时钟使能。串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制,串口1是在APB2ENR寄存器的第14位。除了串口1的时钟使能在APB2ENR寄存器,其它串口的时钟使能位都在APB1ENR寄存器,而APB2的频率一般是APB1的一倍。
- 串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设让其重新工作。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。
串口1的复位设置位在APB2RSTR的第14位,通过向该位写1复位串口1,写0结束复位。
串口设置的一般步骤
- 串口时钟使能,GPIO时钟使能。
- 设置引脚复用器映射:调用GPIO_PinAFConfig函数。
- GPIO初始化设置:要设置模式为复用功能。
- 串口参数初始化:设置波特率,字长,奇偶校验等参数。
- 开启中断并且初始化NVIC,使能中断。
- 使能串口。
- 编写中断处理函数:函数名格式为USART1IRQHandler。
在HAL库中,串口相关的函数和定义主要在文件stm32f1xx_hal_uart.c和stm32f1xx_hal_uart.h中。
串口参数初始化
串口作为STM32的一个外设,HAL库为其配置了串口初始化函数。
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);typedef struct
{USART_TypeDef *Instance; UART_InitTypeDef Init; uint8_t *pTxBuffPtr; uint16_t TxXferSize; __IO uint16_t TxXferCount;uint8_t *pRxBuffPtr; uint16_t RxXferSize; __IO uint16_t RxXferCount; DMA_HandleTypeDef *hdmatx; DMA_HandleTypeDef *hdmarx; HAL_LockTypeDef Lock; __IO HAL_UART_StateTypeDef gState; __IO HAL_UART_StateTypeDef RxState;__IO uint32_t ErrorCode;
}UART_HandleTypeDef;
Instance是结构体指针类型变量,如果是串口11,取值为 USART1 即可。
Init 是 UART_InitTypeDef 结构体类型变量,它是用来设置串口的各个参数,包括波特率,停止位等。
typedef struct
{uint32_t BaudRate; //波特率uint32_t WordLength; //字长uint32_t StopBits; //停止位uint32_t Parity; //奇偶校验uint32_t Mode; //收/发模式设置uint32_t HwFlowCtl; //硬件流设置uint32_t OverSampling; //过采样设置
}UART_InitTypeDef
该结构体第一个参数 BaudRate 为串口波特率,波特率可以说是串口最重要的参数了,它用来确定串口通信的速率。第二个参数 WordLength 为字长,可以设置为 8 位字长或者 9 位字长,这里我们设置为 8 位字长数据格式 UART_WORDLENGTH_8B。第三个参数 StopBits 为停止位设置,可以设置为 1 个停止位或者 2 个停止位,这里我们设置为 1 位停止位 UART_STOPBITS_1。第四个参数 Parity 设定是否需要奇偶校验,我们设定为无奇偶校验位。第五个参数 Mode 为串口模式,可以设置为只收模式,只发模式,或者收发模式。这里我们设置为全双工收发模式。第六个参数 HwFlowCtl 为是否支持硬件流控制,我们设置为无硬件流控制。第七个参数OverSampling 用来设置过采样为 16 倍还是 8 倍。
pTxBuffPtr,TxXferSize 和 TxXferCount 三个变量分别用来设置串口发送的数据缓存指针,发送的数据量和还剩余的要发送的数据量。而接下来的三个变量pRxBuffPtr,RxXferSize 和RxXferCount 则是用来设置接收的数据缓存指针,接收的最大数据量以及还剩余的要接收的数据量。
UART_HandleTypeDef UART1_Handler; //UART 句柄
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=115200; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为 8 位格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能 UART1
函数HAL_UART_Init内部会调用串口使能函数使能相应串口,所以调用了该函数之后就不需要重复使能串口了。
在调用初始化函数HAL_UART_Init内部,会先调用MSP初始化回调函数进行MCU相关初始化,函数为:
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
该函数内部用来编写IO口初始化,时钟使能以及NVIC配置。
使能串口和GPIO口时钟
要使用串口,必须使能串口时钟和使用到的GPIO口时钟。
例如我们要使用串口 1,所以我们必须使能串口 1 时钟和 GPIOA 时钟(串口 1 使用的是 PA9 和 PA10)。
__HAL_RCC_USART1_CLK_ENABLE(); //使能 USART1 时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能 GPIOA 时钟
GPIO口初始化设置以及复用映射配置
在HAL库中IO口初始化参数设置和复用映射配置是在函数HAL_GPIO_Init中一次性完成的。
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化 PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
GPIO_Initure.Mode=GPIO_MODE_AF_INPUT; //模式要设置为复用输入模式!
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化 PA10
开启串口相关中断,配置串口中断优先级
HAL库中定义了一个使能串口中断的标识符__HAL_UART_ENABLE_IT。
使能接收完成中断
__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);
第一个参数为串口句柄,第二个参数为要开启的中断类型值。
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
HAL_NVIC_SetPrioority(USART1_IRQn,3,3); //抢占优先级3,子优先级3.
编写中断服务函数
void USART1_IRQHandler(void) ;
串口数据接收和发送
STM32F1 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
相关文章:
![](https://img-blog.csdnimg.cn/e9496aacb478424fb90d3cb008c6c5f6.png)
STM32 串口实验(学习一)
本章将实现如下功能:STM32通过串口和上位机对话,STM32在收到上位机发过来的字符串后,原原本本返回给上位机。 STM32 串口简介 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本…...
![](https://img-blog.csdnimg.cn/c03a7f180665410faa66b66ca75cf381.png)
多臂治疗规则的 Qini 曲线(Stefan Wager)
英文题目: Qini Curves for Multi-Armed Treatment Rules 中文题目:多臂治疗规则的 Qini 曲线 单位:Stefan Wager 论文链接: 代码:GitHub - grf-labs/maq: Treatment rule evaluation via the multi-armed Qini …...
![](https://img-blog.csdnimg.cn/6af9638114964b68b090979245aa6e63.png)
NOSQL之Redis配置及优化
目录 一、关系型数据库 二、非关系型数据库 三、关系型数据库和非关系型数据库区别 1、数据存储方式不同 2、扩展方式不同 3、对事务性的支持不同 四、Redis简介 五、Redis优点 (1)具有极高的数据读写速度 (2)支持丰富的…...
![](https://img-blog.csdnimg.cn/img_convert/3c296170b403a5912fd24c0fae7232dc.jpeg)
植物一区HR | 植物生理组+转录组:揭示豆科植物响应干旱胁迫机制
PlantArray 植物高通量生理学表型监测系统 是一套以植物生理学为基础的高精度,高通量,自动化表型监测系统,集合实验设置、数据分析、决策工具于一身,能够高通量实时动态监测并进行全天候生理及环境参数采集,是进行植物…...
![](https://www.ngui.cc/images/no-images.jpg)
TCP粘包问题
TCP粘包问题 TCP粘包问题造成TCP粘包的原因发送方原因接收方原因 如何处理TCP粘包发送方接收方应用层 为什么UDP没有粘包问题 TCP粘包问题 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据…...
![](https://img-blog.csdnimg.cn/3e38f40af93a44afa8dcb95e3a3ea6d1.png)
QT【day1】
登录框: #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//窗口设置this->setFixedSize(600,600); //大小this->setWindowTitle("MUMU"); //文本内容this->setWindowOpacity(0.8); //透…...
![](https://img-blog.csdnimg.cn/d248e8f19b51463297f721a2641fc471.png)
【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface
文章目录 前言官方解释内存布局程序运行中的内存布局通用方法 前言 在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。 举个例子: package mainimport "fmt"func foo(v inter…...
![](https://img-blog.csdnimg.cn/95148e11605f41f2b0017ba32b3fd5ef.png)
两数相加 II——力扣445
题目描述 法一 栈 本题旨在从后往前加,为了逆序处理所有数位,利用栈,把数字压入栈中,再依次取出相加,注意进位!进位是/10,另外需要注意栈的常用函数,push()、pop()、top()࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
js获取上传视频的封面第一帧
代码如下:粘贴到这个在线编辑器里,可以测试效果。 菜鸟教程在线编辑器 <div><div style"flex: 1;border: 1px solid #999; position:relative;color: #333;background-color:#FFF2B8;"><span style"position: absolute…...
![](https://img-blog.csdnimg.cn/529448960ce844ce8b5746a72251ca10.png)
Nginx 高可用负载均衡(三种模式)
一、nginx普通集群负载均衡 1、安装keepalived (1)下载 https://www.keepalived.org/download.html(2)解压 tar -zxvf keepalived-2.0.18.tar.gz(3)使用configure命令配置安装目录与核心配置文件所在位置: ./configure --prefix/usr/local/keepalived --sysconf/e…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux tail命令
在Linux中,tail命令用于查看文件的末尾内容。它可以显示文件的最后几行,默认情况下显示最后10行。 以下是一些常见的使用方式和示例: 显示文件的最后10行: tail filename将会显示名为filename的文件的最后10行内容。 显示文件…...
![](https://img-blog.csdnimg.cn/813d4e85537e4b30b71a6e7639fe814b.png#pic_center)
【屏幕适配发展介绍 Objective-C语言】
一、接下来,我们花一天时间,给大家介绍这个屏幕适配 1.那么,屏幕适配,是什么意思啊 我们说,写程序的时候,我们有时候要做 1)系统适配 2)屏幕适配 1)系统适配:是指的你写的这个代码,在iOS6、iOS7、iOS8,在不同的iOS系统下,是不是运行的效果,一致吧 这个指的是…...
![](https://www.ngui.cc/images/no-images.jpg)
linux中ls命令详解
ls 显示目录内容列表 补充说明 ls命令 就是list的缩写,用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。 语法 ls [选项] [文件名...][-1abcdfgiklmnopqrstuxABCDFGLNQRSUX…...
![](https://img-blog.csdnimg.cn/ad723e25ba764ff3a967c4f847a60911.png)
大盗阿福(记忆化搜索板子)
提供核心代码:(经典的记忆化搜索套路) int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界,越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…...
![](https://www.ngui.cc/images/no-images.jpg)
打卡力扣题目八
#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 四、两种方法的区别 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一…...
![](https://img-blog.csdnimg.cn/2a4afa9d67654c1c9066313de9b87b7d.png)
matlab使用教程(5)—矩阵定义和基本运算
本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度…...
![](https://img-blog.csdnimg.cn/00794742e8a04826af7a9dbe1f45c229.png)
用HTML写一个简单的静态购物网站
实现代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>购物网站</title> &l…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在go中实现程序的优雅退出,go-kratos源码解析
使用kratos这个框架有近一年了,最近了解了一下kratos关于程序优雅退出的具体实现。 这部分逻辑在app.go文件中,在main中,找到app.Run方法,点进入就可以了 它包含以下几个部分: App结构体:包含应用程序的配置选项和运行时状态。 …...
![](https://img-blog.csdnimg.cn/1b934526ee52476195f3be8365be53ee.png)
Appium+python自动化(二十八)- 高级滑动(超详解)
高级溜冰的滑动 滑动操作一般是两点之间的滑动,这种滑动在这里称其为低级的溜冰滑动;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作,连续拖动图片移动等场景。那么这种高级绚丽的溜…...
![](https://img-blog.csdnimg.cn/9d0a7ea3030a4f70a4dc02f9e0a96d8d.png)
github token使用方法
git remote set-url origin https://<githubtoken>github.com/<username>/<repositoryname>.git 在私有仓库的HTTPS的url上加入<githubtoken>即为token url,可以免ssh key登录...
![](https://www.ngui.cc/images/no-images.jpg)
Spring属性注解对配置项名称的自动转换
一、前言 在Spring中,我们经常需要将配置文件中的属性值注入到Java类中。Spring提供了两个主要的注解来实现这一功能:Value 和 ConfigurationProperties。其中 ConfigurationProperties支持将配置项名称与Java类中的属性名进行自动转换,包括…...
![](https://img-blog.csdnimg.cn/6369911301e14492bf08e9d459824596.jpeg)
Docker 安全 Docker HTTPS请求过程与配置
Docker 容器安全注意点 尽量别做的事 尽量不用 --privileged 运行容器(授权容器root用户拥有宿主机的root权限) 尽量不用 --network host 运行容器(使用 host 网络模式共享宿主机的网络命名空间) 尽量不在容器中运行 ssh 服务 尽…...
![](https://img-blog.csdnimg.cn/ef9a8f6cf94b467095e45f82571b6338.png)
DevOps(三)
CD(二) 1. 整体流程2. 环境准备1. jenkins安装2. 编译安装git3. docker安装4. docker-compose安装5. sonarqube安装6. harbor安装7. gitlab私服8. maven安装9. Nexus部署10. K8s部署3. 安装java及编写代码3.1 安装java3.2 安装IntelliJ IDEA3.3 安装tomcat3.4 安装maven3.5 c…...
![](https://www.ngui.cc/images/no-images.jpg)
AOP的妙用
一、改代码 自定义注解用于提示该代码已经在AOP中重构了 public interface ReviseToAop {// 用于记录修改状态String value() default ""; }使用注解(无意义,只是表名被修改) ReviseToAop("修改于:2023/7/30&quo…...
![](https://img-blog.csdnimg.cn/img_convert/8df63de3ecc488a3d3fff60c6e5bdec0.png)
CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法
由于好多现场会出现将CAN总线的设备接到EtherCAT网络中,由于协议的不相同,不能直接进行连接,现需一种能同时兼容CAN 总线和ETHERCAT网络的一种设备,由此捷米JM-ECT-CAN 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要…...
![](https://img-blog.csdnimg.cn/061f6e15fe3744eaadf521cbf64bfc81.png)
【大数据趋势】7月30日 汇率,恒指期货的大数据趋势概率分析。
1. 数据源头之一 : 汇率变化 从程序模拟趋势来看,美元在持续弱势状态,周线上正在构建一个新的下跌趋势,而且正在反抽过程中,即将完成,如果没有外部干预,会顺势往下。从月线来看,高点逐步降低&a…...
![](https://img-blog.csdnimg.cn/774a60ee98dc461c8e53168013d7e7d1.png)
mac使用mvn下载node-sass 会Binary download failed, trying source
m1 上使用nvm 以下node的版本可以直接下载(Binary download,而不是 trying source)而不用切换mac cpu架构 zhiwenwenzhiwenwendeMBP cockpit % nvm install 14.15.5 Downloading and installing node v14.15.5... Downloading https://node…...
![](https://img-blog.csdnimg.cn/6cbcd6c17cec4dba9bb3c0f895f02fa2.png)
【C++】开源:Muduo网络库配置与使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Muduo网络库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…...
![](https://www.ngui.cc/images/no-images.jpg)
VCS ICO - Intelligent Coverage Optimization
ico是vcs提供的用于优化覆盖率的feature;一般用户通过dist solver bofore等约束了变量的随机概率,而ico会在用户约束的基础上,做一些自动“修正”,以此来优化随机激励,提高随机多样性,加速覆盖率收敛&#…...
![](https://img-blog.csdnimg.cn/0cf804d67f134149982033b1127337f5.png)
【分布式系统】分布式系统的8个谬误
网络可靠 对于分布式系统来说,网络、计算、存储是三大基石,系统之间进行拆分隔离之后,那么必定存在网络通讯,而网络是最不可靠的。 不管是从硬件层面还是软件层面来说,网络是不可靠的。(断电、配置错误、ID…...
![](https://www.oschina.net/img/hot3.png)
鼓楼网站seo搜索引擎优化/站长工具百度
2019独角兽企业重金招聘Python工程师标准>>> 项目需求变更规范 一、需求变更的原因分析 需求变更可能来自方案服务商、客户或BD等,也可能来源于项目组内部。而需求变更的表现形式是多方面的,如老板临时改变想法、需求插入,某一功能…...
![](/images/no-images.jpg)
电子商务网站建设讯息/快速网站排名优化
tomcat超时解问题 在eclipse启动tomcat时遇到超时45秒的问题: 错误:Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错误。改动 workspace\.metadata\.plugins\org.eclipse.wst.…...
![](/images/no-images.jpg)
安徽平台网站建设公司/重庆seo团队
JSONP 和 JSON 的关系 事实上,JSONP 和 JSON 没有关系。若强行要有关系,也只能说 JSONP 这个技术使用了 JSON 这种数据格式。JSON 是一种数据交换格式。JSONP 是一种非官方跨域数据交互协议,是一种技术。 跨域是什么? 上面说了 JS…...
![](https://img-blog.csdnimg.cn/20210116173843708.png)
万网董事长是谁/如何进行网站性能优化?
1.理解多态性 具体来讲,是对象的多种形态,可以是man,woman等 父类的引用即p2 子类的对象即 Man; 声明的是变量 Person p2 右边是对象(man,或者woman,只要是person其他子类都可以)…...
![](https://img-blog.csdnimg.cn/2019062110233659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNDA0Mzk1,size_16,color_FFFFFF,t_70)
基础建设的网站有哪些内容/seo搜索引擎优化工资薪酬
一、软件简介 Apache Kafka是开源的分布式流处理平台,也是高吞吐量的分布式跨平台订阅消息系统,主要包含Broker服务器、Topic消息类别、Partition物理分区、Producer生产者、Consumer消费者、Consumer Group消费组部分。 二、架构图 总结: •Broker :…...
![](http://static.oschina.net/uploads/space/2016/0429/150902_xhuX_2613440.png)
具有价值的做网站/如何制定会员营销方案
2019独角兽企业重金招聘Python工程师标准>>> // MARK: 需要用 convenience 声明 遍历构造函数 convenience init(normalImage: UIImage,highlightedImage: UIImage?) { // 必须先 调用本类的指定构造函数 实例化自己 self.init(); …...