Cube+STM32+ADC+DMA多通道采集问题的问题解决

采用Cube+STM32+ADC+DMA进行多通道数据采集,有两个问题:
一、CubeMX配置无法关闭DMA的中断问题
上面图片中的DMA2中断无法取消
如上图,DMA2中断是灰色,无法取消选择,导致生成的代码会进中断,为了解决这个问题可以在生成的代码中加入该指令即可解决:
HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn); //手动关闭Cube的DMA中断
二、Cube+STM32+ADC+DMA生成的代码运行无法进入中断并且ADC无法采集(ADC采集的值没有更新)
为了解决了该问题需要将DMA初始化代码放到ADC初始化代码前面。另外串口的DMA初始化也类似,也需要将DMA的初始化放在UART初始化前面。 在这里插入图片描述

  /* Initialize all configured peripherals */
  MX_DMA_Init();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_ADC3_Init();
  MX_CAN2_Init();
  MX_RTC_Init();
  MX_SPI2_Init();
  MX_SPI3_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
  MX_USART6_UART_Init();
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32L0系列微控制器上,使用DMA进行ADC采集是一种非常高效的方式,可以大大减少CPU的负担。下面是一些关于使用DMA进行ADC通道多次采集的配置步骤: 1. 配置ADC通道 首先需要配置ADC通道,可以使用HAL库提供的函数进行配置,例如: ```c static void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = ENABLE; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 2; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } } ``` 2. 配置DMA 接下来需要配置DMA,使其能够从ADC中读取数据。可以使用HAL库提供的函数进行配置,例如: ```c static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } ``` 3. 开始采集 最后需要开始采集数据,可以使用HAL库提供的函数进行配置,例如: ```c HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_data, 2); ``` 其中,adc_data是保存采集数据的数组,2表示采集2个通道的数据。 在开启DMA传输后,每当一个转换序列完成时,都会触发一个DMA传输完成中断。可以在中断服务程序中处理采集到的数据。 这就是使用DMA进行ADC通道多次采集的基本步骤。需要注意,不同的微控制器可能具有不同的ADCDMA配置,具体的实现可能会有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值