STM32U5单通道ADCDMA配置

以下是我的cubemx配置图,我想做4M系统时钟配置10M采样频率,ADC用的时钟是锁相环2,配置140M。开启ADC电源后,单独使用ADC_start可以从寄存器读取ADC的值,但使用ADC_start_DMA这个就完全不运行,但是主循环里的串口打印一直有,求解(ADC4因为要配置IN16使用了不可完全设置ADC这个选项!)

img

img

在使用了下面开启电源并打开adc dma后,打印adc value的数据


 HAL_PWREx_EnableVddA();
  HAL_PWREx_EnableVddIO2();
  if (HAL_ADCEx_Calibration_Start(&hadc4, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
  {
    /* Calibration Error */
    Error_Handler();
  }
HAL_ADC_Start_DMA(&hadc4, (uint32_t *)&adc_Value, 16);
……
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc4), HAL_ADC_STATE_REG_EOC))
     {     
    for (int i = 0; i < 50; i++)
      printf("%d ", adc_Value[i]);
     }
    printf("\n");

打出来全是空格,表明ADC没转换完成。

  • 这篇博客: 【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发中的 4)定时器触发ADC采样 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 顾名思义,就是由定时器设定时间,到点就启动ADC采样,这样可以精确控制采样率。

    首先设置定时器的计时参数,这里设置为1s(可以不开启定时器中断):

    ADC的设置中,要关闭连续转换模式,并且设置为定时器触发:

    这里如果连续转换不关闭,会自动连续运行,不受定时器触发的控制。所以要disable。

    最后,还要开启ADC中断。

    设置好之后就可以生成工程代码了。

    在keil中打开工程,重写ADC中断的回调函数,以指示ADC转换好:

    main函数中添加如下代码,检测是否转换好,并读取AD值回传:

    下载到板子运行,可以看到每1s输出一个ad值,说明实现了定时器触发adc转换的功能。

    好了,这一节的内容基本讲完了。

    欢迎关注我的公众号,可留言“资料”获取相关资料和软件: