STM32-UART-DMA HAL库缓冲收发

文章目录

    • 1、说明
      • 1.1、注意事项:
      • 1.2、接收部分
      • 1.3、发送部分
    • 2、代码
      • 2.1、初始化
      • 2.2、缓冲接收
      • 2.3、缓冲发送
      • 2.4、格式化打印

1、说明

1.1、注意事项:

  • HAL库的DMA底层基本都会默认开启中断使能,如果在STM32CubeMx禁用了中断相关的功能,程序可能会进入空中断回调出不来。
  • 切记使用STM32-HAL库的DMA发送时需要开启USART中断和DMA中断。
  • 在一般时间要求不是很高很高的场合,使用HAL库自带的函数就可以,并不会很频繁的触发中断占用资源。

1.2、接收部分

  • 接收DMA初始化成循环传输模式。开启对应DMA通道中断和串口全局中断
  • 之前担心开启串口中断会在接收数据时连续触发中断、导致消耗CPU资源,实际HAL底层未开启接收中断,不会触发中断。

1.3、发送部分

  • 发送时如果要使用DAM功能,必须开启DMA中断和串口中断。HAL的全局状态需要在中断中得到更新,否则会发送完一次状态一直处于被占用中。
  • HAL底层开启了串口数据发送完成中断TC。该中断只有在DMA没有新的数据传入后,并且移位寄存器为空时才会触发一次,不会每发送一个字节就会触发中断

在这里插入图片描述


在这里插入图片描述

2、代码

2.1、初始化

初始化接收即可,发送会在有数据时才会去操作DMA
开启中断


在这里插入图片描述


在这里插入图片描述

 
#include "SEGGER_RTT.h"#define TX_FIFO_SIZE 36
#define RX_FIFO_SIZE 128static uint8_t rxbuff[RX_FIFO_SIZE];
static uint8_t txbuff[TX_FIFO_SIZE];static uint16_t tx_tail = 0;
static uint16_t tx_head = 0;

2.2、缓冲接收

循环接收、需要开启DMA和UART中断

void dma_uart_init()
{HAL_UART_Receive_DMA(&huart1, rxbuff, RX_FIFO_SIZE);
}
///查询读取一个字节数据
int dma_uart_read_char()
{static int rx_tail = 0;int rx_head = (RX_FIFO_SIZE)-huart1.hdmarx->Instance->CNDTR; // 接收到的数据偏移量if (rx_head != rx_tail){int ch = rxbuff[rx_tail++];if (rx_tail >= RX_FIFO_SIZE){rx_tail = 0;}return ch;}return -1;
}

2.3、缓冲发送

单次DMA发送,需要开启DMA和UART中断

///查询状态并触发一次发送
static void dma_uart_write_trig()
{static int lock = 0;if (lock)//中断重入锁return;lock = 1;if (huart1.gState == HAL_UART_STATE_READY){static uint8_t dma_tx_fifo[128];for (size_t n = 0; n < 128; n++){if (tx_head != tx_tail){dma_tx_fifo[n] = txbuff[tx_tail++];if (tx_tail >= TX_FIFO_SIZE)tx_tail = 0;}else{if (n > 0){HAL_UART_Transmit_DMA(&huart1, dma_tx_fifo, n);}break;}}}lock = 0;
}///DMA缓冲发送多个字节数据
void dma_uart_writes(const uint8_t *data, int size)
{for (size_t i = 0; i < size; i++){uint16_t tmp = tx_head + 1;if (tmp >= TX_FIFO_SIZE){tmp = 0;}
#if 0 // 丢弃新的数据if (tmp == tx_tail) // 数据溢出 发送慢于写入{break;  }
#else // 等待旧数据发送完if (tmp == tx_tail){while (tmp == tx_tail){}}
#endiftxbuff[tx_head] = data[i];tx_head = tmp;}dma_uart_write_trig();
}///中断回掉函数,该函数由串口发送完成中断TC触发
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{dma_uart_write_trig();
}

2.4、格式化打印

#include "stdarg.h"
#include "stdio.h"#define PRINT_BUFF_SIZE 500
static char print_buff[PRINT_BUFF_SIZE];
void print_x(void *format, ...)
{va_list ap;va_start(ap, format);int n = vsnprintf(print_buff, PRINT_BUFF_SIZE, format, ap);va_end(ap);if (n > 0){dma_uart_writes((uint8_t *)print_buff, n);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WinForm.NET开发】使用 FlowLayoutPanel 在 Windows 窗体上排列控件

本文内容 创建项目水平和垂直排列控件更改流方向插入流中断使用停靠和锚定来定位控件使用填充和边距排列控件通过在工具箱中双击来插入控件通过绘制控件轮廓来插入控件使用插入条来插入控件将现有控件重新分配给不同的父控件后续步骤 某些应用程序要求窗体布局在窗体调整大小…

人工智能与量子计算:开启未知领域的智慧之旅

导言 人工智能与量子计算的结合是科技领域的一场创新盛宴&#xff0c;引领我们进入了探索未知领域的新时代。本文将深入研究人工智能与量子计算的交汇点&#xff0c;探讨其原理、应用以及对计算领域的深远影响。 量子计算的崛起为人工智能领域注入了新的活力&#xff0c;开启了…

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

GPT-4V被超越?SEED-Bench多模态大模型测评基准更新

&#x1f4d6; 技术报告 SEED-Bench-1&#xff1a;https://arxiv.org/abs/2307.16125 SEED-Bench-2&#xff1a;https://arxiv.org/abs/2311.17092 &#x1f917; 测评数据 SEED-Bench-1&#xff1a;https://huggingface.co/datasets/AILab-CVC/SEED-Bench SEED-Bench-2&…

纽扣电池是什么

纽扣电池 电工电气百科 文章目录 纽扣电池前言一、纽扣电池是什么二、纽扣电池的类别三、纽扣电池的作用原理总结前言 纽扣电池具有易于更换的特点,这使得它们成为许多便携设备的理想电源选择。但是,由于它们较小且外壳易于打开,所以家中有婴幼儿的家庭应特别注意将其放置在…

抓包工具:Sunny网络中间件

Sunny网络中间件 和 Fiddler 类似。 是可跨平台的网络分析组件 可用于HTTP/HTTPS/WS/WSS/TCP/UDP网络分析 为二次开发量身制作 支持 获取/修改 HTTP/HTTPS/WS/WSS/TCP/TLS-TCP/UDP 发送及返回数据 支持 对 HTTP/HTTPS/WS/WSS 指定连接使用指定代理 支持 对 HTTP/HTTPS/WS/WSS/T…

Mybatis-Plus利用Sql注入器批量插入更新

Mybatis-Plus是在Mybatis持久层框架上封装的一层非常好用的工具&#xff0c;最近因为想要在Mapper里加入自己自定义的通用方法&#xff0c;所以用到了Mybatis-Plus的Sql注入器。Sql注入器的作用是可以实现自定义的sql脚本并注入到MappedStatement里&#xff0c;从而达到动态拼装…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

【算法提升—力扣每日一刷】五日总结【12/06--12/10】

文章目录 2023/12/06力扣每日一刷&#xff1a;[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/) 2023/12/07力扣每日一刷&#xff1a;[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)力扣今日两刷&#xff1a;[19. 删除链…

iOS_给View的部分区域截图 snapshot for view

文章目录 1.将整个view截图返回image&#xff1a;2.截取view的部分区域&#xff0c;返回image&#xff1a;3.旧方法&#xff1a;4.Tips参考&#xff1a; 1.将整个view截图返回image&#xff1a; 这些 api 已被废弃&#xff0c;所以需要判断 iOS 版本 写两套代码&#xff1a; R…

NVMe over Fabrics with SPDK with iRDMA总结 - 1

1.0 Introduction简介 NVM Express* (NVMe*) drives are high-speed, low-latency, solid-state drives (SSDs), that connect over the server Peripheral Component Interconnect Express* (PCIe*) bus. NVM Express* (NVMe*) 硬盘是高速、低延迟的固态硬盘 (SSD),通过服…

轻松制作健身预约小程序

如果你想制作一个健身预约小程序&#xff0c;实现高效预约与健身管理&#xff0c;可以按照以下步骤进行操作。 第一步&#xff1a;注册登录乔拓云平台&#xff0c;进入后台 第二步&#xff1a;点击【轻应用小程序】&#xff0c;进入设计小程序页面。 第三步&#xff1a;在设计小…

Python基础(八、random模块探秘)

大家好&#xff0c;今天我要和你们聊一聊一个非常有趣的Python模块——random。它就像是一个疯狂的抽签者&#xff0c;总是在背后悄悄地为我们制造出各种各样的随机事件。让我们一起来揭开random的神秘面纱&#xff0c;看看它到底能带给我们哪些惊喜&#xff01; 文章目录 1. …

uniGUI学习之Cookie

UniApplication.Cookies.SetCookie( const ACookieName: string, const AValue: string, AExpires: TDateTime 0, ASecure: Boolean False, AHTTPOnly: Boolean False, const APath: string / )

多汗症的预防措施有哪些?

多汗症的预防措施主要包括以下几个方面&#xff0c;通过这些措施&#xff0c;可以有效地减少多汗症的发生&#xff0c;提高生活质量。 一、保持身体清洁 保持身体清洁是预防多汗症的重要措施之一。每天洗澡&#xff0c;特别是在运动或出汗后&#xff0c;及时更换衣物&#xf…

Python-类视图和蓝图

目录 一.类视图 二.蓝图 一.类视图 在Flask中&#xff0c;可通过视图函数展示视图 http://t.csdnimg.cn/r6IFG 也可基于类实现&#xff0c;类视图的好处是支持继承。标准类视图是继承flask.views模块中基类View的子类 from flask.views import View 该子类中必须重写View…

查找一个时间序列中一个具体时刻的所有值Series.at_time()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 查找时间序列中 指定的具体时刻 对应的所有元素 Series.at_time() [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd i pd.date_range(2023-12-10, periods4, freq12H) r p…

tcp/ip协议2实现的插图,数据结构5 (22 - 章)

(103) 103 二二1 协议控制块 结构 file, socket , rawcb , inpcb , tcpcb 之间的联系 (104) (105)

转载:TableView性能优化

转载&#xff1a;TableView性能优化 原文链接&#xff1a;https://juejin.cn/post/6955731915672387592 tableView性能优化 Cell重用、标识重用 使用 static 修饰重用标识名称能够保证这个标识只会创建一次&#xff0c;提高性能。接着调用dequeueReusableCellWithIdentifie…

超越架构师!消息通知系统优化设计

5 收集联系信息流程 为发送通知&#xff0c;需收集各种信息如移动设备令牌、email、phone和第三方通道信息。 用于存储联系信息的简化的数据库表模式。它是个带有电子邮件、电话、设备令牌和外部通道的单个NoSQL DynamoDB表。Contacts table schema&#xff1a; device_tokens…