您的位置:首页 > 文旅 > 旅游 > 【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓存数组设成100,只能收到50个数据

【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓存数组设成100,只能收到50个数据

2024/10/5 21:25:37 来源:https://blog.csdn.net/weixin_44407238/article/details/142350798  浏览:    关键词:【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓存数组设成100,只能收到50个数据

系列文章目录

1.元件基础
2.电路设计
3.PCB设计
4.元件焊接
5.板子调试
6.程序设计
7.算法学习
8.编写exe
9.检测标准
10.项目举例
11.职业规划


文章目录

  • 方案一、改DMA中断
  • 方案二、改数据类型
  • 方案三、改数据长度
  • 后记

方案一、改DMA中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。
在这里插入图片描述
DMA中断使能函数

void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT,  FunctionalState NewState);

功能:配置指定的DMAy通道x的中断

注释:DMA_IT_TC:传输完成 DMA_IT_HT:传输一半 DMA_IT_TE:传输错误

例如:

DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);

如果是串口接受数据,想要关闭,直接在main函数初始化下面写这句话就行

__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT); //关闭DMA传输过半中断

方案二、改数据类型

uint32_t dma_value[20]={0};
HAL_ADC_Start_DMA(&hadc1,dma_value,20);注意此处设置的传输数量为20,即搬运20次ADC转换后的值

因函数HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)中接受转换完的数据类型需为32位,如果定义一个32位的变量dma_value[20];结果就是库函数自动把每个32位变量都塞满了。
如dma_value[0]应该是0x0FFF,就变成了0x00000FFF,把高16位的有效数据给浪费了

或者是这样写的

uint16_t ADC_value[20]={0};
HAL_ADC_Start_DMA(&hadc1,ADC_value,20);

在这里插入图片描述

改为这样就好了:

uint16_t dma_value[20]={0};
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)dma_value,20);

方案三、改数据长度

uint32_t dma_value[100]={0};
HAL_ADC_Start_DMA(&hadc1,dma_value,100);

缓存数组设成100,只能收到50个数据,即0-49有数据,后面50-99都是0或其他不正常的值。

uint32_t dma_value[100]={0};
HAL_ADC_Start_DMA(&hadc1,dma_value,200);

上面函数的最后一个参数改为采集数据个数的2倍,就好了

后记

什么是DMA (DMA的基本定义)

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,

CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?

因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理,

DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。

DMA定义:
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

DMA传输方式

DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:

外设到内存
内存到外设
内存到内存
外设到外设
DMA传输参数

我们知道,数据传输,首先需要的是1 数据的源地址 2 数据传输位置的目标地址 ,3 传递数据多少的数据传输量 , 进行多少次传输的传输模式 DMA所需要的核心参数,便是这四个

当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。
  
也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com