栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[笔记]STM32基于HAL库的ADC+DMA多通道扫描

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[笔记]STM32基于HAL库的ADC+DMA多通道扫描

前提:有一段时间没有使用STM32了,最近在使用ADC功能,要提高其效率的问题就会用到DMA,但是ST公司的STM32CubeMX软件生成出来的代码,它的排序是有问题的,所以本文章进行记录

 

MCU:STM32G031P6F6

生成软件工具:STM32CubeMX

前面的部分我就省略了,我就挑重点

1、选择ADC的输入通道

2、设置DMA为循环模式、半字传输、外设到内存

3、添加Rank列表参数,这一步是你有几个ADC通道就写几个Rank值

 之后扫描存储的顺序就会按照你这里设定的通道,从1到3顺序读取和保存到数组中

4、使能扫描模式、连续模式、DMA

5、修改ADC的频率

因为ADC的频率不能超过12M,所以你要在时钟树中修改一下。

请注意,毕竟每个系列或型号多多少少的时钟树上是不同的显示,所以就只管找到ADC所属于的时钟或是APB/AHB之类的

我这里选择21.333333明显是超过了12M,但是ADC的配置中会有分频器的问题,所以最后的频率是21.3333 / 2

6、最后配置一下后面的路径和版本

如果不会配置的,请参考其他博主的方法,这里我就不提供了

 7、生成代码

Keil打开代码后,有一行DMA初始化代码要放在ADC初始化的前面才能正常使用DMA+ADC的功能,否则出来的结果都是0!!!

最后贴出部分代码

int main(void)
{
    
  
    float Vin = 0;
    float Vout = 0;
    float Iin = 0;
	uint16_t AD_DMA[3] = {0};
  

  

  
  HAL_Init();

  

  

  
  SystemClock_Config();

  

  

  
  MX_GPIO_Init();
	MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
//  MX_DMA_Init();
  MX_USART1_UART_Init();
  
	
	
	printf("hellorn");
	
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_DMA, 3);

  

  
  
  while (1)
  {
    

    
		HAL_Delay(1000);
		Vin = ((AD_DMA[2]*(3.3/4096));
		Vout = ((AD_DMA[1]*(3.3/4096));
		Iin = ((AD_DMA[0]*(3.3/4096));
		
		printf("Vin = %frn",Vin);
		printf("Vout = %frn",Vout);
		printf("Iin = %frn",Iin);
		
		
  }
  
}

最后

导致这个问题的原因可能是时钟没有开启,却配置DMA参数。而导致参数并未成功赋值。

我们可以看到MX_DMA_Init函数里面只有三行代码,开启时钟、配置DMA的NVIC、开启DMA的NVIC

按照排除法,应该就是时钟问题

 

有问题的话请在评论区或是私信,有点要说,CSDN的私信和评论的提醒做的有点拉跨,我在使用的时候没有一眼发现有人私信或是评论。不知道是不是我的设置问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号