STM32G0系列ADC多通道采集时使用DMA传输数据

STM32G0系列ADC多通道采集时使用DMA传输数据

使用CubeMX配置会非常方便,本次调试用的版本是最新的6.4。但CubeMX生成的代码有时会有Bug,特别是像G0这类较新的MCU,这次就把我遇到的问题说一下

使用内部时钟,开启SWD等

使用内部时钟,并设置为64MHz频率,开启SWD调试,这些都是常规操作,就不多说了

1 开启ADC并配置

使用了5和10两个ADC通道,分别对应开启和设置
在这里插入图片描述
在这里插入图片描述

2 开启DMA并配置

开启DMA的ADC1传输通道,
模式为Normal,这样当一次传输完成时会停止。
外设地址固定,内存地址自增,数据宽度为字,其余默认
在这里插入图片描述

3 开启DMA中断,禁止ADC中断

开启DMA中断,禁止ADC中断

4 调试

生成代码。
正常来说,启动HAL_ADC_Start_DMA函数后后,当采样数量完成时,会进入DMA1_Channel1_IRQHandler中断,但今天死活就是进不了中断。
一通折腾,最后发现是CubeMX生成的代码有问题,就是下面这两句:

MX_ADC1_Init();
MX_DMA_Init();

代码倒是没错,但是顺序错了,应该是先初始化DMA,再初始化ADC,即:

MX_DMA_Init();
MX_ADC1_Init();

改过以后程序正常工作。

5 改进

在调整过代码顺序以后,一旦用CubeMX重新生成代码,则顺序又不对了。
鉴于此,我们需要在代码开始阶段加入DMA的初始化代码, 如下:

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  MX_DMA_Init();

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_I2C1_Init();
  MX_I2C2_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

即在/* USER CODE BEGIN SysInit */代码片中插入DMA的初始化代码MX_DMA_Init();

这样即使CubeMX重新生成代码,程序也可以正常工作了。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值