当前位置: 首页 > news >正文

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)。

相关文章:

  • 计算机图形学入门28:相机、透镜和光场
  • sysbench测试系统磁盘读写
  • 【开源项目】Rust开发复制文件夹目录结构工具
  • 新款S32K3 MCU可解决汽车软件开发的成本和复杂性问题(器件编号包含S32K322E、S32K322N、S32K328)
  • 【linux】服务器ubuntu安装cuda11.0、cuDNN教程,简单易懂,包教包会
  • 秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}
  • Spring的AOP
  • ASP.NET Core----基础学习06----将所有数据在页面中显示 布局页面的使用
  • 基于Faster R-CNN的安全帽目标检测
  • Redis分布式锁-Redisson可重入锁原理的个人见解。
  • 【全面介绍Pip换源】
  • 【密码学】密码学数学基础:剩余系
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架
  • Vue3 前置知识
  • 基于hive数据库的泰坦尼克号幸存者数据分析
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【node学习】协程
  • 4个实用的微服务测试策略
  • CentOS从零开始部署Nodejs项目
  • E-HPC支持多队列管理和自动伸缩
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript对象详解
  • JAVA多线程机制解析-volatilesynchronized
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • leetcode讲解--894. All Possible Full Binary Trees
  • Mithril.js 入门介绍
  • orm2 中文文档 3.1 模型属性
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Webpack 4 学习01(基础配置)
  • 创建一个Struts2项目maven 方式
  • 关于Flux,Vuex,Redux的思考
  • 猴子数据域名防封接口降低小说被封的风险
  • 回顾 Swift 多平台移植进度 #2
  • 基于组件的设计工作流与界面抽象
  • 解析带emoji和链接的聊天系统消息
  • 七牛云假注销小指南
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入手阿里云新服务器的部署NODE
  • 网页视频流m3u8/ts视频下载
  • 微服务入门【系列视频课程】
  • 怎样选择前端框架
  • ‌移动管家手机智能控制汽车系统
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #数学建模# 线性规划问题的Matlab求解
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)(1.11) SiK Radio v2(一)
  • (39)STM32——FLASH闪存
  • (day 12)JavaScript学习笔记(数组3)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (纯JS)图片裁剪
  • (二)测试工具
  • (二)原生js案例之数码时钟计时
  • (翻译)Quartz官方教程——第一课:Quartz入门