请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CubeMX生成的ADC DMA代码无效

[复制链接]
企鹅1 提问时间:2021-12-20 14:53 / 未解决
请问各位,我使用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”。

串口输出的ADC值

串口输出的ADC值

ADC-CubeMX.rar

下载

2.6 KB, 下载次数: 4, 下载积分: ST金币 -1

配置

收藏 评论10 发布时间:2021-12-20 14:53

举报

10个回答
李康1202 回答时间:2021-12-20 15:16:01

弄个延迟试一试

yr 回答时间:2021-12-20 15:10:54

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

xmshao 回答时间:2021-12-20 15:03:59
建议你分两步来。首先看看基于DMA传输的ADC有没有结果出来,这个通过查看内存变量数据即可。如果这里数据有了,再看看uart输出相关配置及printf的实现环节,包括外部硬件线路。
butterflyspring 回答时间:2021-12-20 15:50:01
按照楼主目前的代码架构,MX_DMA_Init(); 需要调整顺序,放在最前面执行。否则DMA配置的参数没有打开时钟,无法配置。 这个楼主可以试试打开调试器看看DMA的寄存器是否有初始化即可验证是不是这个原因引起的。
企鹅1 回答时间:2021-12-20 16:07:10
yr 发表于 2021-12-20 15:10
[md]一定要把MX_DMA_Init()初始化放在ADC1初始化前面,因为ADC初始化最后会调用ADC_MSP,此时会设置DMA的参 ...

现在MX_DMA_Init()放在ADC前面初始化了,和之前是有变化,可是值好像一直不变。没有随着电压变化,还有可能是哪里的问题?
企鹅1 回答时间:2021-12-20 16:09:05

李康1202 发表于 2021-12-20 15:16
弄个延迟试一试

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

废鱼 回答时间:2021-12-20 16:19:38

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

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

通过仿真,发现ADC的DR寄存器是有变化的,但是DMA寄存器没变化。
废鱼 回答时间:2021-12-20 17:25:08

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

xmshao 回答时间:2021-12-21 11:50:35

企鹅1 发表于 2021-12-20 16:26
通过仿真,发现ADC的DR寄存器是有变化的,但是DMA寄存器没变化。

ok.

还要注意DMA初始化顺序要先于外设配置,这个你可能知道了,还是提醒下。

另外,你如果是调用HAL_ADC_Start_DMA(&hadc1, ADCData, 1);函数的话,ADCdata的数据宽度定义为32位。那么在CubeMx配置DMA的那个地方,Memory宽度选择为WORD。你不妨验证之。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版