STM32CubeMx ADC的DMA功能不能输出adc值的问题

本文探讨了STM32CubeMX中DMA与ADC集成的问题,详细解析了DMA时钟配置顺序对ADC值获取的影响,以及如何通过调整代码顺序和中断设置,确保ADC值的正确读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.DMA时钟配置问题

想使用STM32CubeMX的DMA功能输出adc的值,使用软件生成代码后,添加启动DMA语句HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,20);并不能得到adc的值
STM32Cube输出的代码段:

MX_GPIO_Init();
MX_ADC_Init();
MX_DMA_Init();

MX_DMA_Init()内部开启DMA时钟:

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);
}

这是直接由软件生成的代码块,问题是DMA的时钟再ADC初始化之后才开始配置,这样DMA的功能不能使用,调整为DMA的时钟在ADC初始化之前开始。

MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();

之后再开启DMA便可以得到adc的经过DMA搬运的数值。

HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,20);

2.DMA中断问题

在cubemx中配置好DMA之后,会自动开启DMA中断,如果单通道的ADC,那么会一直处在中断,这种情况也不能输出adc的值,需要屏蔽那两句中断优先级配置的代码
下面展示一些 内联代码片

/** 
  * Enable DMA controller clock
  */
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);

}
......
HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,1);

这样在使用单通道单次转换的时候便会正常输出adc的值。其余情况没有测试,有需要的请自行测试。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华申杨电子科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值