IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 DMA 清除传输完成标志错误导致的问题 -> 正文阅读

[嵌入式]STM32 DMA 清除传输完成标志错误导致的问题

硬件平台:STM32F407
开发平台:MDK

问题描述:

这几天在调试STM32 串口通讯时,突然发现某些发送的数据不对,如下所示:
请添加图片描述

本来需要发送的是:

24 06 FF 03 00 36 8C 0A AA 55

结果变成了:

24 06 FF 10 00 19 02 0C DD DD

其中,发送的数据变成了下一帧需要发送的数据的一部分。

由于我的串口通讯采用的是DMA发送,模式配置为Normal(每次发送都需要重新启动和清除标志)。

我清除标志的方式采用的是如下方式:

    if(DMA_GetFlagStatus(RS485_USART_DMA_STREAM, RS485_USART_DMA_TCIF_FLAG) != RESET)//等待DMA2_Steam7传输完成
    {        
        DMA_ClearFlag(RS485_USART_DMA_STREAM, RS485_USART_DMA_TCIF_FLAG);//清除DMA2_Steam7传输完成标志
    }

    //开始一次DMA传输!
    DMA_Enable(RS485_USART_DMA_STREAM, g_RS422TxBuf[FRAME_INDEX_FRAME_LENGTH]);  

采用if去判断传输完成标志是否传输完成,然后再启动DMA传输。

这里有一个bug就是:

如果DMA在刚好启动传输的过程中,突然其他任务修改了DMA定义的传输缓存内容,那么传输的内容也会随之而修改。如下图所示:

请添加图片描述

这样也就能解释为什么上述传输的数据改变了的问题了。

解决方案

由于DMA采用的是单次模式(Normal),因此每次开启DMA传输时都需要清除传输完成标志。因此在清除传输完成标志时采用 while() 超时等待的方式去就解决该问题。

    DMASendTimeout = 0xFFFF;

	//开始一次DMA传输!
    DMA_Enable(RS485_USART_DMA_STREAM, g_RS422TxBuf[FRAME_INDEX_FRAME_LENGTH]);     
	
    //等待DMA传输完成
    while(!DMA_GetFlagStatus(RS485_USART_DMA_STREAM, RS485_USART_DMA_TCIF_FLAG))//等待DMA2_Steam7传输完成
    {        
        if((DMASendTimeout--) == 0) return;
    }
    DMA_ClearFlag(RS485_USART_DMA_STREAM, RS485_USART_DMA_TCIF_FLAG);//清除DMA2_Steam7传输完成标志

总结

之前采用 if 的语句判断传输完成标志时是为了避免任务存在while(1) 的死等方式导致卡死系统,就算要使用,必须添加超时溢出机制。

解决该问题的方案有多种,上述方案是最直接的,也是解决源头问题。也可以采用其他方案,例如,将所有设计到修改DMA内存值的代码全部放在一个任务中,由于单片机是单线程,顺序执行的,因此将其放到一个任务中就可以避免该问题的出现。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:07:48  更:2022-09-30 01:09:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 19:04:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码