我是靠谱客的博主 精明自行车,最近开发中收集的这篇文章主要介绍STM32G0系列ADC多通道采集时使用DMA传输数据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重新生成代码,程序也可以正常工作了。

最后

以上就是精明自行车为你收集整理的STM32G0系列ADC多通道采集时使用DMA传输数据STM32G0系列ADC多通道采集时使用DMA传输数据的全部内容,希望文章能够帮你解决STM32G0系列ADC多通道采集时使用DMA传输数据STM32G0系列ADC多通道采集时使用DMA传输数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部