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

DMA使用心得-STM32

本文结构DMA简要介绍DMA主体思路DMA代码实现与分析DMA简要介绍什么是DMADMA(Direct Memory Access, 直接存储器访问)允许外设与内存直接传输数据的技术无需CPU干预。DMA的特点是什么不受CPU直接控制的“数据搬运工”说人话如果不用DMA你在调试串口时上位机发送数据过来你在接收的地方打了断点你就接收不到完整的数据但是如果你用了DMA你打了断点数据照常接收。DMA主体思路DMA代码的实现/** * brief 串口dma接收完成中断处理 * param * retval */voiduart_dmarx_done_isr(uint8_tuart_id){uint16_trecv_size;recv_sizes_uart_dev[uart_id].dmarx_buf_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*21]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_size0;}/** * brief 串口dma接收缓存大小一半数据中断处理 * param * retval * 描述 * 将接收的数据 */voiduart_dmarx_half_done_isr(uint8_tuart_id){uint16_trecv_total_size;uint16_trecv_size;if(uart_id0){recv_total_sizes_uart_dev[uart_id].dmarx_buf_size-bsp_uart1_get_dmarx_buf_remain_size();}elseif(uart_id1){recv_total_sizes_uart_dev[uart_id].dmarx_buf_size-bsp_uart2_get_dmarx_buf_remain_size();}recv_sizerecv_total_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*21]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_sizerecv_total_size;}/** * brief 串口空闲中断处理 * param * retval */voiduart_dmarx_idle_isr(uint8_tuart_id){uint16_trecv_total_size;uint16_trecv_size;if(uart_id0){recv_total_sizes_uart_dev[uart_id].dmarx_buf_size-bsp_uart1_get_dmarx_buf_remain_size();}elseif(uart_id1){recv_total_sizes_uart_dev[uart_id].dmarx_buf_size-bsp_uart2_get_dmarx_buf_remain_size();}recv_sizerecv_total_size-s_uart_dev[uart_id].last_dmarx_size;s_UartTxRxCount[uart_id*21]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_sizerecv_total_size;}代码解析这里有三个中断处理函数半满中断、满中断和空闲中断处理函数半满中断和全满中断我们设置DMA接收区域的长度128ByteDMA的CNDTR寄存器的值为128每接收一个字节数据数值就减1。当该数值减少为64时进入半满中断。当数值减少为0时进入全满中断空闲中断除非每帧数据刚好是半帧长度或者满帧长度否则空闲中断处理必然有效案例初始条件下以帧数据长度10为例连续发送6次都不会进入半满中断仅进入空闲中断第7次时便会进入半满中断同时也会进入空闲中断图片中NDT的值不为64第13次时便会进入全满中断同时也会进入空闲中断图片中NDT的值不为0而是翻板到0X7E。
http://www.rkmt.cn/news/1385108.html

相关文章:

  • 搜维尔科技:Xsens动作捕捉在人形机器人研发中的应用
  • 光轮智能 谢晨 访谈总结机器人仿真数据产业
  • 轻量化部署,异地机房快速接入,多机房管理不用再大动干戈
  • 基于ATtiny84的智能冰箱监控器:低功耗温度与门状态监测方案
  • 2026年平价国风键帽测评:浮光窑开PBT键帽深度解析
  • 小数据场景下语音情感识别实战:基于ResNet34与数据增强的优化方案
  • 孤舟笔记 互联网常用框架篇三 Dubbo是如何动态感知服务下线的?注册中心和服务端双保险
  • 孤舟笔记 互联网常用框架篇二 Dubbo服务请求失败怎么处理?集群容错策略你用过几种
  • 三维视图查看器项目(QT/C++)
  • 【收藏级】2026年国内无代码编程工具推荐:企业No Code全场景选型指南
  • 教育机构搭建AI编程辅导平台时如何通过Taotoken管理多学员用量
  • 【Harness Engineering详解】为什么大模型一跑长链路就雪崩?拆解硅谷新宠 Harness Engineering
  • 339商业模式介绍(代码)
  • 程序员的自我修养:链接、装载与库(库)
  • 碧蓝航线自动化脚本终极指南:3小时学会全自动游戏管理
  • 关于psthon问题
  • 百川AI医生+DeepSeek代码智能体:AI赛道双线突破
  • ETS2LA:为欧洲卡车模拟2打造的智能驾驶辅助系统
  • IEC 61000-4-5
  • YOLOv5遥感图像农田分割 | 农田目标检测训练教程 | 遥感影像分割实战
  • 微信小程序日历组件终极指南:3分钟实现专业级日期交互
  • 运维必看:CentOS7开机全链路分析+root密码/引导故障急救方案
  • 大模型开发中format_messages、invoke、format三种方法的对比
  • 16告警处理:如何避免告警风暴?
  • MyBatis缓存机制
  • 夏 | 日 | 躁 |动
  • 学习c语言第22天 循环语句do while
  • 质量好到经得起考验!2026广东犸力压力传感器,收获客户认可 - 品牌速递
  • 嵌入式Day18--数据结构
  • AI 英语学习APP的开发