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实现收发的更多相关文章

  1. STM32 HAL库的定时器中断回调函数跟串口中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //添加回调后的程序逻辑 if (htim->Instance == ...

  2. stm32 hal库串口通信资料汇集

    串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transm ...

  3. STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收

    转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676

  4. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  5. 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)

    截图 描述: l  STM32 HAL库编程 l  使用模拟IIC通信,方便程序移植 l  Python界面编写,蘑菇头的帽子是什么颜色 l  STM32 HAL库串口通信 l  Python界面使用 ...

  6. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

  7. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  8. STM32单片机串口中断+DMA使用(含CUBE配置)

    最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的. 1.STM32CUBE配置 1. ...

  9. STM32 HAL库使用中断实现串口接收不定长数据

    以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...

  10. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

随机推荐

  1. 《ASP.ENT Core 与 RESTful API 开发实战》-- 读书笔记(第1章)

    第 1 章 REST 简介 1.1 API 与 REST API 是一个系统向外暴露或公开的一套接口,通过这些接口,外部应用程序能够访问该系统 REST 是一种基于资源的架构风格,任何能够命名的对象都 ...

  2. 《ASP.NET Core 微服务实战》-- 读书笔记(第8章)

    第 8 章 服务发现 面对大量服务,为了简化配置和管理工作,我们需要了解"服务发现"概念 回顾云原生特性 配置外置 将 URL 和登录凭证移到配置文件和 C# 代码之外,放到环境变 ...

  3. 《AI驱动下的开发者新生态》-2024长沙.NET技术社区活动-诚邀大家报名

    回顾 2019年初,在.NET中文社区及包括苏州.广州.深圳等地区社区等大力推动.在众多企业的大力支持下,长沙地区的开发者们发起成立了长沙.NET技术社区,并组织了<2019年长沙开发者技术大会 ...

  4. Java线程状态(生命周期)--一篇入魂

    1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态. 线程可以有如下6 种状态: New (新创建):未启动的线程: Runnable (可运行):可运行的线程,需要等待操作系统资源: ...

  5. Redis+Lua实现简易的秒杀抢购

    1  商品抢购 主要逻辑是:减库存,记录抢购成功的用户 @RestController public class DemoController { @Resource private StringRe ...

  6. springboot项目使用外置tomcat7部署项目

    Springboot使用外置tomcat7部署运行 1.pom修改 2.tomcat底下config下catalina.properties 3.在tomcat的lib文件夹下添加 javax.el- ...

  7. Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象(即装饰者),动态扩展目标对象的功能,并且不会改变目标对象的结构,提供了一种比继承更灵活的替代方案.需要注意的是,装饰对象要与目标对象实现相同的接口,或 ...

  8. spring boot发邮件

    项目地址:https://gitee.com/indexman/spring_boot_in_action 在task模块下,我写了test类 邮件发送流程: 发件方:836491384@qq.com ...

  9. leetcode 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  10. OpenCV开发笔记(六十一):红胖子8分钟带你深入了解Shi-Tomasi角点检测(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...