STM32H750VB用DMA进行ADC采集经验

原来用STM32F103系列的ADC,12位精度,采集速率为5.5US/次, ADC1与ADC2同步采集,这次平台改用STM32H750VB后,使用过程发现还是有一些不同,初次使用时,只能ADC1采用一个DMA,ADC2采用另一个DMA,不像原来F103用同步同样,一个DMA将ADC1和ADC2的转换数据传输到指定内存区域,后面经过折腾结果发现其实与F103差不多,主要函数调用不熟悉,搞了几次再弄出来,知道函数调用其实很简单:),我喜欢用DMA环形缓冲传输数据,然后产生HALF中断和FULL中断,在两个中断中将数据处理掉,即可以实现ADC的连续转换,也不会使数据处理过于频繁,同时H750还有硬件过采样,这里也准备试一下是。
第一步首先进入CUBEMX进入ADC转换时钟配置,ADC时钟选择24MHZ,如下图:
这里面直接写入24MHZ就可以了,其他的CUBEMX会自己配置
配置好ADC输入引脚,这个采集4个通道,ADC1采集2个通道,ADC2采集两个通道
在这里插入图片描述
在这里插入图片描述
上面是本例程序采用的配置,一面对相关的参数进有简单的解析。ADC1与ADC2同步采集,每个ADC采集4个通道,规则顺序采集,循环采集,软件启动,采集的精度为14位,采集的ADC周期为8.5个周期,DMA循环传输,DMA传输的缓冲为64双字,过半和全满产生DMA中断,ADC不生产中断。所有的配置如上,下面是相关选项的说明 ,这个里为网上摘抄整理。
一、 ADCs_Common_Settings

Mode: 设置ADC 工作模式(独立模式或多重模式)
独立模式
<1> Independent mode ADC1 和ADC2 工作在独立模式
双重模式
<2> Dual regular simultaneous + injected simultaneous mode ADC1 和ADC2 工作在同步规则模式和同步注入模式
<3> regular regular simultaneous + alternate trigger mode ADC1 和ADC2 工作在同步规则模式和交替触发模式
<4> Dual injected simultaneous mode only ADC1 和ADC2 工作在同步注入模式
<5> Dual regular simultaneous mode only ADC1 和ADC2 工作在同步规则模式
<6> Dual interleaved mode only ADC1 和ADC2 工作在交叉模式
<7> Dual alternate trigger mode only ADC1 和ADC2 工作在交替触发模式

DMA Access Mode :(DMA)直接存储器存取访问模式(在多重模式下才有此项)

Delay between 2 sampling phases: 2个抽样阶段的延迟(在多重模式下才有此项)

二、 ADCs _Settings
<1> Clock Prescaler ADC的时钟分频数
<2> Resolution 分辨率(意思是AD位数)
<4> Scan Conversion Mode ADC工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE 或者DISABLE。
<5> Continuous Conversion Mode ADC模数转换工作在连续模式。可以设置这个参数为 ENABLE或者DISABLE 。
<6> Discontinuous Conversion Mode ADC模数转换工作在不连续模式(单次模式)。可以设置这个参数为 ENABLE或者DISABLE 。
<7> End of Conversion Selection 转换选择结束
<8> Overrun behaviour 如果数据没有读取,新的ADC转换结果是保持上次一结果,还是新的转换结果覆盖原来的结果
<9>ConversionDataManagement 此参数成员用于ADC采集数据的管理,可以存到ADC的DR寄存器,传输给DFSDM,又或者通过DMA的单次或者循环模式传输数据到指定地址。
<10>Low Power Auto Wait 用于使能或者禁止低功耗自动延迟等待模式

三、 ADCs_Regular_ConversionMode (规则通道转换模式)

<1>LeftBitShift 用于设置ADC转换结果的左移位数,使用或者没有使用过采样的情况下,都可以使用此参数。
<2> Enable Regular Conversions(规则通道控制)ENABLE(使能)、DISABLE(禁止),需要使能规则通道控制才可以进一步对规则通道的使用进行配置
<3> Number of Conversion ADC转换的通道数量
<4> External Trigger Conversion Source ADC外部触发转换源
<5> External Trigger Conversion Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
四、 Rank
<1> Channel ADC转换通道
<2> Sampling Time ADC转换时间
五、 ADC_Injected_ConversionMode(注入通道转换模式)
<1> Number of Conversion ADC转换的注入通道数
注入通道数不为0时,才有下面的配置项
<2> External Trigger Source ADC外部触发转换源
<3> External Trigger Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
<4> Injected Conversion Mode ADC注入转换通道模式
六、 Rank(ADC_Injected_ConversionMode的(Number of Conversion )ADC转换的注入通道数不为0时,才能配置注入通道的其他参数)
<1> Channel ADC转换通道
<2> Sampling Time ADC转换时间
<3> Injected Offset ADC注入通道的偏值
七、 WatchDog
<1> Enable Analog WatchDog Mode
下面为DMA配置,这里只需要在ADC1配置DMA就可以了,ADC2不需要配置DMA了,这里使用的是DMA1的通道0
在这里插入图片描述
因为ADC1和ADC2同步转换时,会将转换结果组合成32位的双字格式,放到ADC1转换结果,DMA需要选择WORD双字格式,DMA传输结果到内存缓冲区的数据,高字是ADC1结果,低字是ADC2结果。配置好后就可以生产代码了,:)
下面是在程序调用的过程,刚开始调用的DMA单模式启动函数一下木有启动ADC,找了好久,因为网上相关例程木有,折腾了半天,:)
unsigned int ADCxValues1[64];//ADC1和ADC2转换结果数组
第一步初始化GPIO,ADC1,ADC2,DMA1;
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_ADC2_Init();

第二步 校准 ADC1和ADC2
/* 校准ADC,采用偏移校准 /
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
/**/
if (HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
/下面是常规的ADC直接启动函数,不知道为为什么要先启ADC2,再启动ADC1,否则ADC2启动不了:(。/
//HAL_ADC_Start(&hadc2);
//HAL_ADC_Start(&hadc1);
//下面是独立通道ADC和DMA启动函数,ADC1与ADC2同步
//转换时不能用下面的DMA函数启动:)
/
ADC和DMA的配置部分未贴,函数较多
if (HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADCxValues2, 64) != HAL_OK)
{
Error_Handler();
}

if (HAL_ADC_Start_DMA(&hadc1, (uint32_t )ADCxValues1, 64) != HAL_OK)
{
Error_Handler();
}
/
//下面才是启动ADC1和ADC2同步采集的DMA启动函数。
//
if (HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)ADCxValues1,64) != HAL_OK)
{
Error_Handler();
}
如上面处理后,ADC1和ADC2即可以按设计规则进入转换,结果存储到ADCxValues1数组里,一直循环。下面转换运行调试结果:),如果错误,请多指教:)
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值