【嵌入式外设精学】Day15|DMA:半满全满、乒乓、为什么丢数

发布时间:2026/10/3 8:49:06
【嵌入式外设精学】Day15|DMA:半满全满、乒乓、为什么丢数 【嵌入式外设精学】Day15DMA半满全满、乒乓、为什么丢数今天解决采集为什么尾部不对如何让 CPU 不跟数据抢着跑目录问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案1. 问题ADC/串口配了 DMA 仍丢数处理慢一点缓冲里的数据就花掉2. 原理2.1 DMA 干什么外设和内存之间直接搬数据CPU 不用一个个字节去搬只处理结果。2.2 丢数的本质缓冲是循环写的。CPU 处理比 DMA 写得慢→ 旧数据还没用完就被覆盖。2.3 乒乓半区处理把大缓冲分成前后两半事件谁拥有哪半半满HTDMA 在写后半CPU 处理前半全满TCDMA 回头写前半CPU 处理后半同一时间每半只属于一个人就不会互相踩。2.4 时间条件用话记处理半区的最坏时间 填满半区的时间还要留调度余量。做不到就加大缓冲、降低采样率、加快算法。3. 代码示例#includestm32f4xx.h#includestdint.h#defineN1024ustaticuint16_tbuf[N];typedefenum{EVT_NONE,EVT_HALF,EVT_FULL}evt_t;staticvolatileevt_tevtEVT_NONE;voidDMA1_Stream0_IRQHandler(void){if(DMA_GetITStatus(DMA1_Stream0,DMA_IT_HTIF0)!RESET){DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_HTIF0);evtEVT_HALF;}if(DMA_GetITStatus(DMA1_Stream0,DMA_IT_TCIF0)!RESET){DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);evtEVT_FULL;}}voidprocess_half(uint16_t*p,uint32_tn){/* 滤波/FFT/统计… */(void)p;(void)n;}voidapp_dma_poll(void){evt_teevt;if(eEVT_NONE){return;}evtEVT_NONE;if(eEVT_HALF){process_half(buf[0],N/2u);}else{process_half(buf[N/2u],N/2u);}}4. 常见误区误区正解DMA 就永远不会丢处理跟不上仍会覆盖缓冲越小越好太小来不及处理运行中随便改 DMA 寄存器先停通道再改只开全满中断用 HT/TC 乒乓更稳5. 自测N1024HT 和 TC 各处理多少乒乓解决什么问题6. 答案各512。明确“这一半归 CPU、那一半归 DMA”避免写读冲突和撕裂。作者shuifanyu标签DMA乒乓采集

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询