H743双ADC,DMA输出的数组无法读取。。。(HAL库写法)

2019-07-20 00:48发布

如题,开了两个ADC都是单通道,定义了一个数组adc_data[]来接收DMA的输出数据。...
if (HAL_ADC_Start_DMA(&ADC1_Handler,(u32*)&adc_data[0],1) != HAL_OK)
  {
    while(1);
  }

if (HAL_ADC_Start_DMA(&ADC2_Handler,(u32*)&adc_data[1],1) != HAL_OK)
  {
    while(1);
  }


...
然后配置DMA、ADC代码就不放了,严格按照STM32CubeH7中的例程写的。。
然后开了一个定时器timer,每隔0.01s中断一次,去读取adc_data[]中的数据,即当前ADC采样值,并转换成电压值,由于是差分输入的所以temp1是那个样子。。。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM3_Handler))
    {
        adcx1=adc_data[0];//执行过后,adcx1仍然是0x0000000,但是同时adc_data[0]有值!
temp1=(float)(3300*((2.0*adc_data[0]/65536.0)-1.0));        
...
}
然后重点来了!玄幻了!Debug可以看到,adc_data[]中的数是不断自动变化的,然而adcx1永远是0x00000000!!!!
这就一个简单的赋值语句啊,而且我看到例程里面也都是这么处理的,无非是加了一个定时器。
memcpy(adcx,adc_data,1);内存复制函数已经尝试过了,无效
求各位大佬走过路过给看看原因。。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
爱芝麻的苹果Z
1楼-- · 2019-07-20 04:57
各位 我自己解决了 跟大家分享一下以免走弯路:
使用DMA时数据是不经过CPU没错 但是要经过cache存储器,我们的问题就是没有使能cache。
在中断函数里增加了这一段,问题就解决了。
void  HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
     uint32_t i;
     SCB_DisableDCache();
     for(i=0;i<3;i++)
     {
         adc_data_read[i] = adc_data[i];
     }
      SCB_EnableDCache();   
}

共勉!
话说论坛怎么冷冷清清都没人讨论的 我之前的帖子也都是自己解决的。。

爱芝麻的苹果Z
2楼-- · 2019-07-20 09:07
DMA取得的数据怎么读出来啊??
1208
3楼-- · 2019-07-20 15:06
 精彩回答 2  元偷偷看……
爱芝麻的苹果Z
4楼-- · 2019-07-20 18:31
1208 发表于 2019-6-18 21:58
http://www.openedv.com/forum.php?mod=viewthread&tid=295390&extra=
你参考看下

谢谢!
jwcai
5楼-- · 2019-07-20 21:15
 精彩回答 2  元偷偷看……
团子
6楼-- · 2019-07-20 22:53
 精彩回答 2  元偷偷看……

一周热门 更多>