久芯网

CubeMX生成的ADC DMA代码无效

avatar 企鹅1 提问时间: 2023-08-13 21:25:40 / 未解决
请问各位,我使用CubeMX生成STM32F103C8T6的DMA ADC代码,工程配置请看附件,我运行如下代码为什么无效:
/* USER CODE BEGIN Includes */
#include "main.h"
#include "stdio.h"
uint32_t ADC_Value=0;

int main(void)
{
   HAL_Init();

  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
printf("---211220---\r\n");
HAL_ADC_Start_DMA(&hadc1,&ADC_Value,1);
printf("Value=%d\r\n",ADC_Value);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {}

}
输出结果总是“0”。

10个回答
  • avatar 李康1202
    回答时间: 2023-08-13 21:53:30

    弄个延迟试一试

  • avatar yr
    回答时间: 2023-08-13 22:10:42

    一定要把MX_DMA_Init()初始化放在ADC1初始化前面,因为ADC初始化最后会调用ADC_MSP,此时会设置DMA的参数,由于DMA的时钟还没有开启,DMA的设置是无效的,可以说是cubemx的bug, 除非要进入到高级页面,刻意把初始化的顺序排正确,否则默认的排序是有问题的.

  • avatar xmshao
    回答时间: 2023-08-13 22:29:44

    建议你分两步来。首先看看基于DMA传输的ADC有没有结果出来,这个通过查看内存变量数据即可。如果这里数据有了,再看看uart输出相关配置及printf的实现环节,包括外部硬件线路。

  • avatar butterflyspring
    回答时间: 2023-08-13 23:00:41

    按照楼主目前的代码架构,MX_DMA_Init(); 需要调整顺序,放在最前面执行。否则DMA配置的参数没有打开时钟,无法配置。 这个楼主可以试试打开调试器看看DMA的寄存器是否有初始化即可验证是不是这个原因引起的。

  • avatar 企鹅1
    回答时间: 2023-08-13 23:29:15
    yr 发表于 2021-12-20 15:10
    [md]一定要把MX_DMA_Init()初始化放在ADC1初始化前面,因为ADC初始化最后会调用ADC_MSP,此时会设置DMA的参 ...

    现在MX_DMA_Init()放在ADC前面初始化了,和之前是有变化,可是值好像一直不变。没有随着电压变化,还有可能是哪里的问题?

  • avatar 企鹅1
    回答时间: 2023-08-13 23:54:31
    李康1202 发表于 2021-12-20 15:16
    弄个延迟试一试

    谢谢,我在HAL_ADC_Start_DMA()后面加了HAL_Delay(500),没效果。

  • avatar 废鱼
    回答时间: 2023-08-14 00:12:38

    楼主,请确定配置采集的IO口电压是多少。最好描述一下采集的IO口,还有ADC的带贴一下。仿真枪模式下,HAL_ADC_ConvCpltCallback这个是采集完成后调用的回调函数,是否可以进入?

  • avatar 企鹅1
    回答时间: 2023-08-14 00:41:23
    xmshao 发表于 2021-12-20 15:03
    建议你分两步来。首先看看基于DMA传输的ADC有没有结果出来,这个通过查看内存变量数据即可。如果这里数据有 ...

    通过仿真,发现ADC的DR寄存器是有变化的,但是DMA寄存器没变化。

  • avatar 废鱼
    回答时间: 2023-08-14 00:58:03

    楼主,您好。删除AN1的配置试试,另外看一下DMA是否能够产生中断,DMA和ADC的寄存器检查一下。

  • avatar xmshao
    回答时间: 2023-08-14 01:15:59
    企鹅1 发表于 2021-12-20 16:26
    通过仿真,发现ADC的DR寄存器是有变化的,但是DMA寄存器没变化。

    ok. 还要注意DMA初始化顺序要先于外设配置,这个你可能知道了,还是提醒下。 另外,你如果是调用HAL_ADC_Start_DMA(&hadc1, ADCData, 1);函数的话,ADCdata的数据宽度定义为32位。那么在CubeMx配置DMA的那个地方,Memory宽度选择为WORD。你不妨验证之。

会员中心 微信客服
客服
回到顶部