OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4975|回复: 4

ADC的DMA模式用定时器控制读数异常求教

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2022-7-8
在线时间
4 小时
发表于 2022-7-8 16:49:02 | 显示全部楼层 |阅读模式
1金钱
各位大佬们好,萌新请教一个问题:
工程功能:用cubeMX配置ADC,启用了DMA模式。不连续转换、ADC全局中断未开。ADC1通道1独立模式采样。ADC的触发方式用TIM3的TRGO信号。TIM3配置为溢出update event。目的是用定时器控制ADC的采样时间,比如目前我控制在1ms,dma采样1000次。然后用dma的一般完成回调和全部完成回调函数,给主函数一个信号,半完成就printf前面500次数据,全部完成就printf后面500次数据。由于printf时间比dma久,会关掉ADC。全部printf后,打开ADC周期循环上述功能。
问题异常:程序跑第一轮,数据正常。但是第二轮之后,随机某个位置,ADC的采样周期和实际对不上,采样的时间与定时器不符合。但是调试如果启动adc后启动延时就没这个问题。请问大佬们,如果不要延时如何处理?
  1. #define NUM_MAX   1024
  2. #define NUM_HALF  NUM_MAX/2
  3. uint16_t  AdcBuf[NUM_MAX];

  4. short puthalf=0;
  5. short putplt=0;
  6. short putcpl=0;
  7. void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
  8. {
  9.      putcpl=1;
  10.         // printf("半完成\r\n");
  11.      puthalf=1;
  12.   //   putcpl=1;



  13. }

  14. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  15. {
  16.    // printf("完成\r\n");

  17.    putplt=1;
  18. //    putcpl=0;
  19. //    HAL_ADC_Stop(&hadc1);//此处stop经测试不能用hal_adc_stop_dma


  20. }
复制代码

int main(void)
{

     MX_GPIO_Init();
     MX_DMA_Init();
     MX_ADC1_Init();
     MX_TIM3_Init();

    int count = 1;


    HAL_ADCEx_Calibration_Start(&hadc1);//校准adc引脚
  //  HAL_TIM_Base_Start(&htim3);//定时器
//    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AdcBuf, NUM_MAX);
//    if (puthalf==0 && putplt==0 ) {
//
//            HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AdcBuf, NUM_MAX);
//           }



    while (count++)
    {

            if (puthalf==0 && putplt==0 ) {
                     MX_GPIO_Init();
                     MX_DMA_Init();
                     MX_ADC1_Init();
                     MX_TIM3_Init();
              HAL_TIM_Base_Start(&htim3);//定时器
              HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AdcBuf, NUM_MAX);
              rt_thread_mdelay(1);
                   }



        //if (putcpl==0  ) {
        if (puthalf==1 )
                            {
                                rt_kprintf("\r\n");
                                rt_kprintf("BUFF-A:");
                                rt_kprintf("\r\n");
                                for(int g=0;g<NUM_HALF;++g)
                                {
                                rt_kprintf("%d ",AdcBuf[g]);
                                }
                                rt_kprintf("\r\n");
                                puthalf=0;
                               // rt_thread_mdelay(1);
                            }

                 if ( putplt==1)
                 {
                    // HAL_ADC_Stop_DMA(&hadc1);
                     HAL_ADC_Stop(&hadc1);

                   //  HAL_TIM_Base_Stop(&htim3);

                    // HAL_TIM_Base_Stop(&htim3);
                     rt_kprintf("\r\n");
                     rt_kprintf("BUFF-B:");
                     rt_kprintf("\r\n");
                 for (int h = NUM_HALF; h < NUM_MAX; ++h)
                     {
                     rt_kprintf("%d ",AdcBuf[h]);
                      }
                     rt_kprintf("\r\n");
                     rt_memset(AdcBuf, 0, sizeof(AdcBuf));
                    // rt_thread_mdelay(1);
                     putcpl=0;
                     putplt=0;

                 }

     //  rt_thread_mdelay(10);



     }

    return RT_EOK;
}


最佳答案

查看完整内容[请看2#楼]

大概率就是ADC跟DMA错误造成的,简单点就是全部重新初始化就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3345
金钱
3345
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-7-8 16:49:03 | 显示全部楼层
大概率就是ADC跟DMA错误造成的,简单点就是全部重新初始化就好了
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2022-7-9 09:48:29 | 显示全部楼层
可以参考一下这个链接看一下:https://blog.csdn.net/weixin_36773706/article/details/86934108
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2022-7-8
在线时间
4 小时
 楼主| 发表于 2022-7-10 14:04:45 | 显示全部楼层
聚东风 发表于 2022-7-9 10:35
大概率就是ADC跟DMA错误造成的,简单点就是全部重新初始化就好了

我也是这么认为的,但是重新初始化不行。加了delay倒是可以,所以想知道不加delay怎么解决?
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3345
金钱
3345
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-7-11 09:12:56 | 显示全部楼层
elegyC 发表于 2022-7-10 14:04
我也是这么认为的,但是重新初始化不行。加了delay倒是可以,所以想知道不加delay怎么解决?

你试下从RCC里面把ADC跟DMA复位啊.
我是经常DMA设置成循环模式然后就不再处理.
ADC根据需要设置成循环或者单次或者干啥的,都没出现错位呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 17:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表