概述
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传输数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复