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
3MX_ADC1_Init(); MX_DMA_Init();
代码倒是没错,但是顺序错了,应该是先初始化DMA,再初始化ADC,即:
1
2
3MX_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传输数据内容请搜索靠谱客的其他文章。
发表评论 取消回复