当前位置: 首页 > news >正文

DMA使用心得-STM32

本文结构

  • DMA简要介绍
  • DMA主体思路
  • DMA代码实现与分析

DMA简要介绍

  1. 什么是DMA?
    DMA(Direct Memory Access, 直接存储器访问),允许外设与内存直接传输数据的技术,无需CPU干预。
  2. DMA的特点是什么?
    不受CPU直接控制的“数据搬运工”,说人话,如果不用DMA,你在调试串口时,上位机发送数据过来,你在接收的地方打了断点,你就接收不到完整的数据;但是,如果你用了DMA,你打了断点数据照常接收。

DMA主体思路

DMA代码的实现

/** * @brief 串口dma接收完成中断处理 * @param * @retval */voiduart_dmarx_done_isr(uint8_tuart_id){uint16_trecv_size;recv_size=s_uart_dev[uart_id].dmarx_buf_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*2+1]+=recv_size;fifo_write(&s_uart_dev[uart_id].rx_fifo,(constuint8_t*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),recv_size);s_uart_dev[uart_id].last_dmarx_size=0;}/** * @brief 串口dma接收缓存大小一半数据中断处理 * @param * @retval * @描述: * 将接收的数据 */voiduart_dmarx_half_done_isr(uint8_tuart_id){uint16_trecv_total_size;uint16_trecv_size;if(uart_id==0){recv_total_size=s_uart_dev[uart_id].dmarx_buf_size-bsp_uart1_get_dmarx_buf_remain_size();}elseif(uart_id==1){recv_total_size=s_uart_dev[uart_id].dmarx_buf_size-bsp_uart2_get_dmarx_buf_remain_size();}recv_size=recv_total_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*2+1]+=recv_size;fifo_write(&s_uart_dev[uart_id].rx_fifo,(constuint8_t*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),recv_size);s_uart_dev[uart_id].last_dmarx_size=recv_total_size;}/** * @brief 串口空闲中断处理 * @param * @retval */voiduart_dmarx_idle_isr(uint8_tuart_id){uint16_trecv_total_size;uint16_trecv_size;if(uart_id==0){recv_total_size=s_uart_dev[uart_id].dmarx_buf_size-bsp_uart1_get_dmarx_buf_remain_size();}elseif(uart_id==1){recv_total_size=s_uart_dev[uart_id].dmarx_buf_size-bsp_uart2_get_dmarx_buf_remain_size();}recv_size=recv_total_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*2+1]+=recv_size;fifo_write(&s_uart_dev[uart_id].rx_fifo,(constuint8_t*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),recv_size);s_uart_dev[uart_id].last_dmarx_size=recv_total_size;}

代码解析:

  • 这里有三个中断处理函数:半满中断、满中断和空闲中断处理函数,
  • 半满中断和全满中断:我们设置DMA接收区域的长度128Byte,DMA的CNDTR寄存器的值为128,每接收一个字节数据,数值就减1。当该数值减少为64时,进入半满中断。当数值减少为0时,进入全满中断;
  • 空闲中断:除非每帧数据刚好是半帧长度或者满帧长度,否则空闲中断处理必然有效;

案例:


初始条件下,以帧数据长度10为例,连续发送6次都不会进入半满中断,仅进入空闲中断;第7次时便会进入半满中断,同时也会进入空闲中断(图片中NDT的值不为64);第13次时便会进入全满中断,同时也会进入空闲中断(图片中NDT的值不为0而是翻板到0X7E)。

http://www.jsqmd.com/news/886634/

相关文章:

  • 暗黑破坏神2存档修改器:5分钟掌握Diablo Edit2终极指南
  • eqMac开源工具功能对比与技术选择指南:技术解析与决策框架
  • 打不开JupyterLab
  • 35岁那年我考下AI认证,职业反而越走越宽
  • 论坛水友查看树节点插件cc-inspector
  • YOLOv11卫生间卫浴设备目标检测数据集-2978张-washroom-1
  • 暗黑破坏神2存档修改器:Diablo Edit2让你的游戏体验随心所欲
  • ai-agent框架spring ai alibaba (三)外部调用II-1 MCP
  • P.4文本统计工具
  • HDI 高密度互连板阶数的深度理解
  • 运维必看:CentOS7开机全链路分析+root密码/引导故障急救方案
  • 构建高安全本地智能家居:基于MQTT over TLS与双向认证的实践
  • 2026年老面小笼包面粉怎么挑?五大品牌发酵力与出品表现横评 - 科技焦点
  • 黑盒模型数据最小化合规审计:对抗性攻击视角下的隐私风险度量
  • 炉石传说脚本终极指南:智能自动对战助手完整教程
  • DeepSeek重构模式推荐:为什么92%的团队在RAG升级中选错模式?3个被忽略的上下文耦合指标
  • 别被忽悠了!2026亲测靠谱的AI论文网站|避坑精选版
  • 15事件警报:告警机制的设计案例
  • YOLOv11医院病房医护人员目标检测数据集-579张-doc-nurse--1
  • 02-大模型AI:AI大模型应用中的关键术语解析
  • 做老面小笼包怕翻车?2026五大面粉品牌品控稳定性与口碑实测 - 科技焦点
  • 区块链共识机制基础知识
  • YOLO26涨点改进| TPAMI 2025 | 独家创新首发、注意力改进篇| 引入TMSA泰勒展开多头自注意力新范式,含二次创新多种改进点,助力目标检测、图像分割、遥感目标检测、图像修复任务涨点
  • 【深度解析】AI Coding 模型竞速:从 Claude Mythos 安全编码到 GPT-5.6 传闻,如何落地代码审查智能体
  • Mysql:事务管理(中)
  • 告别Cygwin:在Windows 11的WSL2上轻松部署UCSF DOCK 6.11完整环境
  • 探索Windows 11 LTSC系统商店恢复的模块化解决方案:智能部署实战
  • 从Windows API调用到硬盘读写:一次‘读文件’请求的完整I/O栈之旅(含图解)
  • 股票买卖最佳时机:LeetCode121题解
  • 339商业模式介绍(代码)