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. NOIp 2023 游记

    咕了正好一周的 NOIp 游记,是我第一篇游记,也是一张寄往四年后不得不退役的.即将画上青春句号的自己的,包含了自己的青涩.期待与成长的信笺. Day \((-\infty, -7)\) CSP-S ...

  2. Excel如何核对同一行的两列数据是否一致

    方法一 Ctrl+G 快捷键Ctrl+G,点击[定位条件],选择"行内容差异单元格",点击[确定]. 方法二 条件格式 逆向思维,先利用条件格式查找出相同的数据,筛选剔除相同的数据 ...

  3. Linux--Vi编辑命令(复制、粘贴、删除、查找)

    1.复制 1)单行复制 在命令模式下,将光标移动到将要复制的行处,按"yy"进行复制: 2)多行复制 在命令模式下,将光标移动到将要复制的首行处,按"nyy"复 ...

  4. 了解一下基本的http代理配置

    我们首先用一个简单例子了解一下基本的http代理配置 worker_processes 1; #nginx worker 数量 error_log logs/error.log; #指定错误日志文件路 ...

  5. Power BI 12 DAY

    电商平台流量分析 案例练习 参数建模 建模-->新建参数 新建度量值使用SWITCH函数将需要的指标数据化 15.关键指标 = switch([指标选择 值],1,[1.访客数合计],2,[2. ...

  6. NC24911 数独挑战

    题目链接 题目 题目描述 数独是一种填数字游戏,英文名叫 Sudoku,起源于瑞士,上世纪 70 年代由美国一家数学逻辑游戏杂志首先发表,名为 Number Place,后在日本流行,1984 年将 ...

  7. tensorflow中交叉熵损失函数详解

    1 前言 tensorflow中定义了3个交叉熵损失函数: softmax_cross_entropy_with_logits(logits, labels) softmax_cross_entrop ...

  8. 解决VMware与win10无法共享目录

    1.安装VMware Tools 这一步适用于多数情况,但对于高版本的VMWare这一步无效,当然了,先试一试总没有坏处. 有看见网上说如果VMware内安装的是高版本的Ubuntu,安装的VMwar ...

  9. Nacos搭建单机实例

    Nacos是阿里开源的微服务架构组件,既可以用作服务注册中心,也可用作配置中心. 虽然Nacos的官方文档也有关于如何部署的说明,但是个人觉得不够详细和连续,故本文将阐述在单机环境实际搭建Nacos环 ...

  10. mysql分组后获取每个组排序后的第一条数据(整行)

    有一个学生分数表student,数据结构是这样的 CREATE TABLE `student` ( `id` int(11) NOT NULL, `student_id` int(11) DEFAUL ...