我是靠谱客的博主 精明自行车,这篇文章主要介绍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生成的代码有问题,就是下面这两句:

复制代码
1
2
3
MX_ADC1_Init(); MX_DMA_Init();

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

复制代码
1
2
3
MX_DMA_Init(); MX_ADC1_Init();

改过以后程序正常工作。

5 改进

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 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传输数据内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部