STM32
直播中

王秀珍

7年用户 1448经验值
私信 关注
[问答]

STM32L151多路ADC使用DMA模式有没有教程呀?

最近用CubeMX(版本到6.11.1了)调试ADC ,有4路,希望能用DMA模式,OS是FreeRTOS
HAL_ADC_ConvCpltCallback函数里面写标记位,
大致代码情况是
task里调用HAL_ADC_Start_DMA
然后判断标记位来确定DMA完成后在处理dma给出来的数据
调了半天都没法完成DMA判断。。。
代码改的乱七八糟的。。。
所以问下有没有相关的教程或者例程可以研究下。。。

回帖(1)

h1654155273.0656

2024-5-30 16:10:05
STM32L151多路ADC使用DMA模式的教程并不多,但是您可以参考以下步骤来实现您的需求:

1. 首先,确保您已经安装了最新版本的STM32CubeMX(您已经安装了6.11.1版本,这是很好的)。

2. 打开STM32CubeMX,选择您的STM32L151系列微控制器。

3. 在配置向导中,选择以下选项:
   - 选择ADC模块。
   - 选择DMA作为ADC的数据传输方式。
   - 选择您需要的ADC通道数量(4路)。

4. 配置DMA通道,将其与ADC模块关联。在DMA设置中,选择适当的DMA通道和请求源(通常是ADC)。

5. 配置中断和回调函数。在CubeMX中,您可以为ADC配置中断,并生成相应的HAL库回调函数。

6. 生成代码并打开生成的项目。

7. 在您的主函数中,初始化HAL库、ADC和DMA。

8. 在任务中,调用`HAL_ADC_Start_DMA()`函数,开始ADC转换并使用DMA传输数据。

9. 在`HAL_ADC_ConvCpltCallback()`回调函数中,设置一个标记位,表示DMA传输已完成。

10. 在任务中,检查标记位,如果标记位被设置,处理DMA传输的数据。

以下是一个简化的示例代码:

```c
#include "stm32l1xx_hal.h"

// 全局变量
uint32_t adc_values[4];
__IO uint32_t adc_dma_complete = 0;

// ADC和DMA初始化代码(在main函数中调用)
void SystemClock_Config(void);
void MX_ADC_Init(void);
void MX_DMA_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_ADC_Init();
  MX_DMA_Init();

  // ...

  while (1)
  {
    if (adc_dma_complete)
    {
      // 处理DMA传输的数据
      ProcessADCData(adc_values, 4);

      // 重置标记位
      adc_dma_complete = 0;
    }
  }
}

// HAL库回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  adc_dma_complete = 1;
}

// 处理ADC数据的函数
void ProcessADCData(uint32_t *data, uint32_t length)
{
  // ...
}
```

请注意,这只是一个简化的示例,您需要根据您的具体需求进行调整。希望这对您有所帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分