STM32F103RC使用HAL库配置USART进行数据收发

目录

STM32F103RC使用HAL库配置USART进行数据收发(代码模块)

一、USART初始化

二、USART使用的GPIO初始化

三、USART的接收中断配置

四、USART的数据发送

五、补充


STM32F103RC使用HAL库配置USART进行数据收发(代码模块)

一、USART初始化

UART_HandleTypeDef  huart1;
uint8_t Rdata;
​
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BandRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;if(HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}#if 1HAL_UART_Receive_IT(&huart1,&Rdata,1);      //使能接收中断,会进入回调函数#else__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //直接使能串口接收中断,不会进入回调函数#endif
}                   

二、USART使用的GPIO初始化

UART使用的GPIO初始化函数是在void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)函数中:
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)    
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance == USART1){__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_AFIO_CLK_ENABLE();//PA9(USART1_TX)    GPIO_InitStruct.Pin = USART1_TX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  GPIO_InitStruct.Pull = GPIO_NOPULL;      HAL_GPIO_Init(USART1_TX_GPIO_Port,&GPIO_InitStruct); //PA10(USART1_RX)GPIO_InitStruct.Pin = USART1_RX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;    HAL_GPIO_Init(USART1_RX_GPIO_Port,&GPIO_InitStruct);    HAL_NVIC_SetPriority(USART1_IRQn,0,0);HAL_NVIC_EnableIRQ(USART1_IRQn);}
}

三、USART的接收中断配置

USART的接收中断的配置有两种方式,以下简要介绍下两种配置方式的不同。1、使用串口接收中断回调函数  2、不使用串口接收中断的回调函数
######使用串口接收中断回调函数时的配置如下:
1、函数MX_USART1_UART_Init的配置
void MX_USART1_UART_Init(void)
{/*//这里是串口的初始化配置*/HAL_UART_Receive_IT(&huart1,&Rdata,1);      //使能接收中断,会进入回调函数
}   
在函数void MX_USART1_UART_Init(void)中的最后使用HAL_UART_Receive_IT(&huart1,&Rdata,1)进行配置。该函数会使能接收中断,每当串口接收到1个字节后就会进入回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中。
2、串口接收中断回调函数HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)配置
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){QueueWrite((void *)buf_pc_to_uart,Rdata);   //将串口接收到的数据写入到队列中HAL_UART_Receive_IT(&huart1,&Rdata,1);      //接收完1字节后要重新使能接收中断}
}
在串口接收回调函数中,需要先对接收的数据进行处理,需要注意的是在处理完接收数据后要重新调用HAL_UART_Receive_IT函数使能接收中断,使得下次接收完数据后能继续进入回调函数。 
######不使用串口接收中断回调函数时的配置如下:
1、函数MX_USART1_UART_Init的配置
void MX_USART1_UART_Init(void)
{/*//这里是串口的初始化配置*/__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //直接使能串口接收中断,不会进入回调函数
}   
在函数void MX_USART1_UART_Init(void)中的最后使用__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE)进行配置。该函数会使能接收中断,但是不会进入回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中,而是进入
void USART1_IRQHandler(void)中。
2、串口接收中断函数void USART1_IRQHandler(void)配置
void USART1_IRQHandler(void)
{if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET){HAL_UART_Receive(&huart1,&Rdata,1,100);QueueWrite((void *)buf_pc_to_uart,Rdata);   //将串口接收到的数据写入到队列中__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);}HAL_UART_IRQHandler(&huart1);
}
在串口中断函数中,和标准库的处理流程相同,先通过接收中断标志位是否置1判断接收中断是否触发,触发后接收数据,对接收到的数据进行处理后,清除接收中断标志位即可。 

四、USART的数据发送

直接调用HAL库接口函数
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout)
或者
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)即可。    

五、补充

1、这里介绍的串口配置及串口的收发数据是没有使用DMA进行传输数据的,如果需要进行大数据包传输,就需要使用DMA进行数据传输了。这时就需要进一步配置DMA的发送或者接收功能了。这里不再介绍,可以自己去网上查找相关资料。
2、以上的配置我们使用的串口接收中断每次接收1个字节的数据,当需要进行不定长数据或者大数据包的接收时,就不适合采用这种接收方式了,这时可以采用串口空闲中断+DMA的方式来进行不定长数据或者大数据包的接收。一般配置流程如下:
首先、配置串口,串口GPIO及DMA完成初始化
然后、在串口初始化函数最后调用:
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)函数,该函数会使能串口的DMA接收并且使能串口的空闲中断。当接收到一包数据后就会进入回调函数:
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t Size)。

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

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

相关文章

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表,只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶,另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子: 栈的模拟实现 下面是Jav…

windows USB 设备驱动程序开发-总线接口查询

总线接口的查询 USB 客户端驱动程序可以获取对USB总线驱动程序接口的引用,并使用它来访问总线驱动程序例程,而不是使用 I/O 请求数据包 (IRP) 机制。 使用总线驱动程序接口为客户端驱动程序提供了几个优势: 它可以使用接口的服务&#xff…

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能,组织发起企业微信会议,于是需要和企业微信做API对接。对接过程很难受,文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配,只能说企业微信的API是从业以来见过的最难用的AP…

[Spring] Spring Web MVC基础理论

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

n3.平滑升级和回滚

平滑升级和回滚 1. 平滑升级流程2. 平滑升级和回滚案例 有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级 1. 平滑升级流程 平…

使用ChatGPT来撰写和润色学术论文的教程(含最新升级开桶ChatGpt4教程)

现在有了ChatGPT4o更加方便了, 但次数太少了 想要增加次数可以考虑升级开桶ChatGpt4 一、引言 在学术研究中,撰写高质量的论文是一项重要的技能。本教程将介绍如何利用ChatGPT来辅助完成从论文构思到润色的全过程。 二、使用ChatGPT写论文 1. 写标题 Title/Topic…

【TB作品】51单片机,MSP430单片机,STM32单片机,简易波形发生器

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2二、 简易波形发生器 (限MSP430、STM32单片机) 任务要求: 制作一个简易波形发生器,具有如下功能: 1、能够产生方波、正弦波,并可通过示波器观察到&…

QT 多线程 QThread

继承QThread的线程 继承 QThread 是创建线程的一个普通方法。其中创建的线程只有 run() 方法在线程里的。其他类内定义的方法都在主线程内。 通过上面的图我们可以看到,主线程内有很多方法在主线程内,但是子线程,只有 run() 方法是在子线…

基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)

基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】整体需求总结【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】华为云IOT手机APP界面开发思路1.3 项目开发背景【1】选题的意义【2…

R语言学习笔记6-数据框

R语言学习笔记6-数据框 数据框(DataFrame)介绍数据框用途创建数据框从矩阵创建数据框索引和切片添加和修改列数据框的预处理数据框的排序数据框的合并与拆分数据框的计算与汇总数据框的筛选处理缺失值应用函数处理数据重塑数据框使用 dplyr 进行数据框的管道操作数据框的时间序…

使用 WebSocket 进行实时数据传输

以下是使用 WebSocket 进行实时数据传输的一般步骤: 一、前端部分 (一)创建 WebSocket 连接 const socket new WebSocket(ws://your-server-url); 在上述代码中,将 ws://your-server-url 替换为您实际的服务器 WebSocket 地…

SvANet:微小医学目标分割网络,增强早期疾病检测

SvANet:微小医学目标分割网络,增强早期疾病检测 提出背景前人工作医学对象分割微小医学对象分割注意力机制 SvANet 结构图SvANet 解法拆解解法逻辑链 论文:SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本转word】

富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…

可灵重大升级!新增Web端上线、首尾帧控制、单次生成视频时长增加至10s!

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;作为全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

永恒之蓝:一场网络风暴的启示

引言 在网络安全的漫长历史中&#xff0c;“永恒之蓝”&#xff08;EternalBlue&#xff09;是一个不可忽视的里程碑事件。它不仅揭示了网络世界的脆弱性&#xff0c;还促使全球范围内对网络安全的重视达到了前所未有的高度。本文将深入探讨“永恒之蓝”漏洞的起源、影响及其对…

【WebGIS】从设计层面设计系统

本项目在通过现代信息技术手段&#xff0c;对古村古镇进行多方位、多角度的数字化记录、展示与传播&#xff0c;实现文化遗产的数字化保护、活化利用与共享。项目内容主要包括&#xff1a;1&#xff09;古村古镇数据库的建立&#xff1a;通过多种渠道收集古村古镇的各类信息&am…

期货量化交易客户端开源教学第八节——TCP通信服务类

private FReciveStr: AnsiString; {接收到的数据} IsConErr: Boolean; {网络连接是否失败} FSocket_LB: Integer; {TCP连接类别,0为交易,1为行情,2为查询} FRetryCount: Integer; {网络连接重试次数} FLoginErrEvent: TLoginErrEvent; {…

如何从 PDF 中删除背景

您是否曾经收到过充满分散注意力背景的扫描 PDF 文档&#xff1f;也许是带有繁忙水印的旧收据或背景光线不均匀的扫描文档。虽然这些背景可能看起来没什么大不了的&#xff0c;但它们会使您的工作空间变得混乱&#xff0c;并使您难以专注于重要信息。轻松删除这些不需要的元素并…

短视频SEO矩阵系统:源码开发与部署全攻略

在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式。随着短视频平台的兴起&#xff0c;如何让自己的内容在众多视频中脱颖而出&#xff0c;成为每个创作者和内容运营者关注的焦点。本文将为您深入解析短视频SEO矩阵系统的源码开发与部署&#xff0c;助您在…