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 ...
随机推荐
- Windows平台安装Oracle11.2.0.4客户端报错INS-30131
之前为解决EXP-00003错误给出了安装Oracle11.2.0.4的解决方案,自己测试是没问题的,客户自己安装反馈遇到报错INS-30131,MOS有一篇文章: E1: DB: Error INS ...
- 19.2 显式加载/隐式加载--《Windows核心编程》
部分笔记来自于:https://blog.csdn.net/blade1080/article/details/81364161 注:关于DLL存放位置,一般是放到可执行文件的目录下. 下面时加载程序 ...
- go中的 4种 for循环
package main import "fmt" func main() { // 第一种写法 for i := 1;i < 10; i++ { fmt.Println(& ...
- ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
任务15:oauth2 + oidc 实现 server部分 基于之前快速入门的项目(MvcCookieAuthSample): https://www.cnblogs.com/MingsonZhen ...
- ABC 314
F 每次相当于创建一个包含 \(p_i,q_i\) 各自所在集合的点的大点 \(u\),然后 \(u\) 向 \(p_i,q_i\) 各自所在集合连边,边权就是胜率. 连完之后求每个点到根结点(\(\ ...
- 深入读懂 Kafka集群
前言 概述 Kafka是一个多分区.多副本的分布式流处理平台,以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性被广泛使用. 应用场景 (1)缓冲削峰:有利于解决生产消息和消费消息的处理速度不一 ...
- NC20875 舔狗舔到最后一无所有
题目链接 题目 题目描述 作为队伍的核心,forever97很受另外两个队友的尊敬. Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家fo ...
- Ubuntu下使用PlatformIO开发STC89/STC12/Arduino
安装VSCode 从 https://code.visualstudio.com/Download 下载最新的 deb 版, 通过命令行安装 sudo apt install ./code_1.59. ...
- 【Unity3D】UGUI之Dropdown
1 Dropdown属性面板 在 Hierarchy 窗口右键,选择 UI 列表里的 Dwondown (下拉列表)控件,即可创建 Dwondown 控件,选中创建的 Dwondown 控件,按键 ...
- Layui项目实战干货总结(精品)
写代码时遇到的知识点拿出来分享. 1.layer弹出层显示在top顶层 // 监听工具条 table.on('tool(tb-book)', function (obj) { var data = o ...