STM32 HAL 使用串口IDLE中断+DMA实现收发
STM32 HAL 使用串口IDLE中断+DMA实现收发
cubeMX配置
mx配置如下(省去系统时钟,烧录口,工程属性配置)
注意:这里关闭 Force DMA channels Interrupts

然后按下面配置即可(TX和RX的DMA都是normal模式)


代码部分
uart_com.h:
#ifndef __UART_COM_H__
#define __UART_COM_H__
#include "main.h"
#include "string.h"
#include "stdarg.h"
#include "stdio.h"
#define DATA_SIZE 255
typedef struct UART_Data_T
{
UART_HandleTypeDef * phuart;
uint8_t pRxData[DATA_SIZE];
uint8_t rxData[DATA_SIZE];
uint16_t rxDataSize;
uint8_t txBuffer[DATA_SIZE];
}UART_Data_T;
extern UART_Data_T myUART1;
void myUART_Init(UART_HandleTypeDef * huart, UART_Data_T * myUART);
void myUART_send_DMA(UART_Data_T * myUART, uint8_t * buffer, uint16_t size);
void myUART_debug_printf(UART_Data_T * myUART, const char * format, ...);
static inline void myUART_copyData(UART_Data_T * myUART, uint16_t size);
static inline void myUART_resumeReceive(UART_Data_T * myUART);
#endif
uart_com.h:
#include "uart_com.h"
UART_Data_T myUART1;
void myUART_Init(UART_HandleTypeDef * huart, UART_Data_T * myUART)
{
myUART->phuart = huart;
HAL_UARTEx_ReceiveToIdle_DMA(huart, myUART->pRxData, sizeof(myUART->pRxData));
}
static inline void myUART_copyData(UART_Data_T * myUART, uint16_t size)
{
strcpy((char*)myUART->rxData, (char*)myUART->pRxData);
myUART->rxDataSize = size;
}
static inline void myUART_resumeReceive(UART_Data_T * myUART)
{
memset(myUART->pRxData, 0x00, sizeof(myUART->pRxData));
HAL_UARTEx_ReceiveToIdle_DMA(myUART->phuart, myUART->pRxData, sizeof(myUART->pRxData));
}
void myUART_send_DMA(UART_Data_T * myUART, uint8_t * buffer, uint16_t size)
{
while(HAL_DMA_GetState(myUART->phuart->hdmatx) != HAL_DMA_STATE_READY);
__HAL_DMA_DISABLE(myUART->phuart->hdmatx);
HAL_UART_Transmit_DMA(myUART->phuart, buffer, size);
}
void myUART_debug_printf(UART_Data_T * myUART, const char * format, ...)
{
uint16_t length = 0;
va_list args;
va_start(args, format);
length = vsnprintf((char*)myUART->txBuffer, sizeof(myUART->txBuffer), (char*)format, args);
myUART_send_DMA(myUART, myUART->txBuffer, length);
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==myUART1.phuart->Instance)
{
/*Deal with the data*/
myUART_copyData(&myUART1, Size);
//myUART_send_DMA(&myUART1, myUART1.rxData, myUART1.rxDataSize); // This sentence is used for testing.
//myUART_debug_printf(&myUART1, "%s", myUART1.rxData); // This sentence is used for testing.
/*Clear data and restart DMA receive*/
myUART_resumeReceive(&myUART1);
}
}
使用
以uart1为例,进行初始化:
myUART_Init(&huart1, &myUART1);
myUART_debug_printf(&myUART1, "Init OK!\n");
然后就可以在代码里调用发送函数了。
STM32 HAL 使用串口IDLE中断+DMA实现收发的更多相关文章
- STM32 HAL库的定时器中断回调函数跟串口中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //添加回调后的程序逻辑 if (htim->Instance == ...
- stm32 hal库串口通信资料汇集
串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transm ...
- STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收
转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)
截图 描述: l STM32 HAL库编程 l 使用模拟IIC通信,方便程序移植 l Python界面编写,蘑菇头的帽子是什么颜色 l STM32 HAL库串口通信 l Python界面使用 ...
- STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率
前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- STM32单片机串口中断+DMA使用(含CUBE配置)
最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的. 1.STM32CUBE配置 1. ...
- STM32 HAL库使用中断实现串口接收不定长数据
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...
- STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收
参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...
随机推荐
- Hive-服务启动和停止命令
1.启动命令 #!/bin/bash nohup hive --service metastore >> $HIVE_HOME/logs/metasotre.log 2>&1 ...
- SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试
今天在工作中遇到一个问题,一个Service类中有一个方法,其中使用了 AopContext.currentProxy() 去访问自身的函数,例如 int result = ((OrderServic ...
- 【Flink入门修炼】1-3 Flink WordCount 入门实现
本篇文章将带大家运行 Flink 最简单的程序 WordCount.先实践后理论,对其基本输入输出.编程代码有初步了解,后续篇章再对 Flink 的各种概念和架构进行介绍. 下面将从创建项目开始,介绍 ...
- 记一次 .NET某列控连锁系统 崩溃分析
一:背景 1. 讲故事 过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧. 去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答 ...
- [BUUCTF][Web][极客大挑战 2019]Secret File 1
打开靶机对应的url 右键查看网页源代码,查看到一个访问路径 /Archive_room.php 构造url访问一下 http://3bfaebad-fdfa-4226-ae0a-551f0228be ...
- 文心一言 VS 讯飞星火 VS chatgpt (201)-- 算法导论15.2 6题
六.用go语言,证明:对 n 个元素的表达式进行完全括号化,恰好需要 n-1 对括号. 文心一言,代码正常运行: 在Go语言中,证明对n个元素的表达式进行完全括号化恰好需要n-1对括号,可以通过数学归 ...
- pwd模块
# pwd模块提供了获取UNIX平台用户的账户与密码信息(通过文件/etc/passwd),在所有的UNIX版本平台都可以用. # pwd模块返回的是一个类似元组的对象,该对象的各个属性对应于pass ...
- java图书管理系统
一 .需求 1.使用数组存储学生(学号.姓名.性别.年级.院系.班级)信息数据和图书(书号.书名.出版日期.作者.价格.类别)信息数据 2.学生管理功能:增加学生.删除学生信息.修改学生信息.查询学生 ...
- 【LeetCode二叉树#12】合并二叉树(巩固层序遍历)
合并二叉树 力扣题目链接(opens new window) 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果 ...
- 需要入门IT行业并且想做java后台小伙伴-简单谈谈后台开发Spring与SpringBoot
1.Spring能做什么 1.1.Spring的能力 1.2.Spring的生态 https://spring.io/projects/spring-boot 覆盖了: web开发 数据访问 安全控制 ...