[STM32 HAL]一种可能不错的DMA处理数据方案

原文链接:https://blog.csdn.net/youmeichifan/article/details/51750435?spm=1001.2014.3001.5506

本文配置稍有不同,大体类似。

MX配置

开启USART1,使能USART1全局中断,打开RX,TX的DMA通道,均为normal模式,内存地址自增,使能TX对应DMA的中断,RX不需要。

代码部分

  • 在main.c里将MX_DMA的初始化放在MX_UART的初始化之前

usart.h:

/* USER CODE BEGIN Prototypes */

#define RECEIVELEN 1024
#define USART_DMA_SENDING 1//发鿁未完成
#define USART_DMA_SENDOVER 0//发鿁完房
typedef struct
{
uint8_t receive_flag:1; // 空闲接收标记
uint8_t dmaSend_flag:1; // 发鿁完成标访
uint16_t rx_len; // 接收长度
uint8_t usartDMA_rxBuf[RECEIVELEN]; // DMA接收缓存
}USART_RECEIVETYPE; extern USART_RECEIVETYPE usartType1; void __USART_Receive_IDLE(UART_HandleTypeDef *huart);
void __USART_SendData_DMA(uint8_t *pdata, uint16_t Length); /* USER CODE END Prototypes */

usart.c:

/* USER CODE BEGIN 0 */
#include "string.h"
#include "main.h" USART_RECEIVETYPE usartType1; /* USER CODE END 0 */
/* USER CODE BEGIN 1 */

void __USART_SendData_DMA(uint8_t *pdata, uint16_t Length)
{
while(usartType1.dmaSend_flag == USART_DMA_SENDING);
usartType1.dmaSend_flag = USART_DMA_SENDING;
HAL_UART_Transmit_DMA(&huart1, pdata, Length);
} //DMA发鿁完成中断回调函敿
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 1);
__HAL_DMA_DISABLE(huart->hdmatx);
usartType1.dmaSend_flag = USART_DMA_SENDOVER;
//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 0);
} //串口接收空闲中断
void __USART_Receive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp; if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(huart);
temp = huart1.hdmarx->Instance->NDTR;
usartType1.rx_len = RECEIVELEN - temp;
usartType1.receive_flag=1;
HAL_UART_Receive_DMA(&huart1,usartType1.usartDMA_rxBuf,RECEIVELEN);
}
} /* USER CODE END 1 */

stm32f4xxit.c:

/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
__USART_Receive_IDLE(&huart1); // 这段代码是自己加进去的
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */
}

main.c:

/* USER CODE BEGIN PV */
char rxStr[256]; char drawBuffer1[256];
char drawBuffer2[256];
char drawBuffer3[256];
/* USER CODE END PV */ /* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, usartType1.usartDMA_rxBuf, RECEIVELEN);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/* USER CODE END 2 */ while (1)
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
if(usartType1.receive_flag)
{
usartType1.receive_flag = 0;
//printf("%s\r\n", (char*)usartType1.usartDMA_rxBuf);
strcpy(rxStr, (char*)usartType1.usartDMA_rxBuf);
// 处理数据
get_Data(rxStr, drawBuffer1, 'a', 'b');
get_Data(rxStr, drawBuffer2, 'b', 'c');
get_Data(rxStr, drawBuffer3, 'c', 'd'); memset(usartType1.usartDMA_rxBuf, 0x00, sizeof(usartType1.usartDMA_rxBuf));
} //__USART_SendData_DMA((uint8_t*)sendBuffer1, sizeof(sendBuffer1));
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawStr(&u8g2, 0, 15, drawBuffer1);
u8g2_DrawStr(&u8g2, 0, 30, drawBuffer2);
u8g2_DrawStr(&u8g2, 0, 45, drawBuffer3);
}while(u8g2_NextPage(&u8g2));
}
/* USER CODE END 3 */

然后基本就可以了

但这个方案好像有点小问题,具体还没有搞清楚,大体是可以用的,至少可以接收电脑发送的数据并处理且显示,等有空再好好研究一下啦~

[STM32 HAL]一种可能不错的DMA处理串口数据方案的更多相关文章

  1. STM32使用DMA发送串口数据

    1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...

  2. STM32—无需中断来实现使用DMA接收串口数据

    本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何 ...

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

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

  4. 利用DMA实现采样数据的直接搬运存储

    尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作 ...

  5. DMA实现采样数据的直接搬运存储

    尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作 ...

  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 HAL库之串口详细篇

    一.基础认识 (一) 并行通信 原理:数据的各个位同时传输 优点:速度快 缺点:占用引脚资源多,通常工作时有多条数据线进行数据传输 8bit数据传输典型连接图: 传输的数据是二进制:11101010, ...

  9. 【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动

    一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3 使用STM32 HAL库编程 PWM+DMA控制输出,CubeMX生成初始工程 实现 ...

  10. STM32 UART DMA实现未知数据长度接收

    串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...

随机推荐

  1. 使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序

    对于在线客服与营销系统,客服端指的是后台提供服务的客服或营销人员,他们使用客服程序在后台观察网站的被访情况,开展营销活动或提供客户服务.在本篇文章中,我将详细介绍如何通过 WPF + Chrome 内 ...

  2. 小知识:enable_ddl_logging参数的设置和日志位置变化

    业务部门需求,要协助客户DBA查truncate操作历史执行情况. 首先确认数据库已开启enable_ddl_logging, 然后从alert中查找没有记录: 之前11g版本都是记录到alert日志 ...

  3. CF131D Subway 题解

    题目传送门 前置知识 强连通分量 | 最短路 解法 考虑用 Tarjan 进行缩点,然后跑最短路. 缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在 Tarjan 过程中要额外记 ...

  4. 【LGR-154-Div.4】洛谷入门赛 #15

    [LGR-154-Div.4]洛谷入门赛 #15 \(A\) luoguB3813 [语言月赛 202308]四个人的排名加起来没有小粉兔高 AC 水题. #include<bits/stdc+ ...

  5. NC50390 布局 Layout

    题目链接 题目 题目描述 FJ有N头奶牛 \((2 \leq N \leq1000)\) ,编号为 \(1 \ldots N\) .奶牛们将按照编号顺序排成一列队伍(可能有多头奶牛在同一位置上).换句 ...

  6. Atom N2600, N2800 安装 Ubuntu22.04 卡住的问题处理

    问题描述 Atom N2600, N2800 的某些旧型号机器, 安装 Ubuntu 时在安装界面选择安装后, 启动过程中会卡住, 或者数秒即黑屏, 再无反应. 这个问题对于Debian系的其他发行版 ...

  7. C# readonly修饰符

    readonly修饰符在作祟 强化官方解释: readonly是一个修饰字段的关键字:被它修饰的字段只有在初始化或者构造函数中才能够赋值. readonly修饰的引用类型字段必须始终引用同一对象: r ...

  8. 【Android逆向】破解黑宝宝apk,绕过签名校验

    这是52pojie的一道题,实现输入任何密码都可以登录成功 他知道你最近在学习Android逆向 他想在游戏上线前让你测试一下他新加的签名验证是否能防住别人的破解. 下面是李华编写的黑宝宝apk 链接 ...

  9. vue实现导出word文档(含多张图片)

    vue实现导出word文档(含多张图片) 转自: https://www.pudn.com/news/62e1e14e55398e076bea2d2f.html

  10. django中如果不是第一次迁移的时候就配置AUTH_USER_MODEL(用来告知django认证系统识别我们自定义的模型类),那么该如何解决才能让django的认证系统识别且不会报未知错误?

    Django认证系统中提供的用户模型类及方法很方便,我们可以使用这个模型类,但是字段有些无法满足项目需求,如还需要保存用户的手机号,需要给模型类添加额外的字段. Django提供了django.con ...