ADC 多通道DMA采样

例程路径:ls_sdk\examples\peripheral\adcv2\adc_multi_channel_dma

一、功能描述

  • 对于ADC的DMA功能只有循环组通道才支持,规则通道和注入通道没有DMA功能。

二、软件配置

2.1 ADC IO配置

例程中我们使用ADC0模块的通道4、5、6、7四个通道,可以使用以下接口配置IO的复用功能。

static void pinmux_adc_init(void)
{
    pinmux_adc0_in4_init();// PA00
    pinmux_adc0_in5_init();// PA01
    pinmux_adc0_in6_init();// PA02
    pinmux_adc0_in7_init();// PA03
}

2.2 基本ADC采样配置

void ADC_Init_Func(void)
{
	//DMA初始化
    DMA_CONTROLLER_INIT(dmac1_inst);
    ADCx_Hdl.Env.DMA.DMA_Channel        = 0;
    ADCx_Hdl.DMAC_Instance              = &dmac1_inst;

    ADCx_Hdl.Instance                   = LSADC;//选择硬件ADC模块
    ADCx_Hdl.Init.DataAlign             = ADC_DATAALIGN_RIGHT;//数据右对齐
    ADCx_Hdl.Init.ContinuousConvMode    = DISABLE;//规则通道的配置项,此处忽略
    ADCx_Hdl.Init.NbrOfConversion       = 0;//规则通道的配置项,此处忽略
    ADCx_Hdl.Init.DiscontinuousConvMode = DISABLE;//规则通道的配置项,此处忽略
    ADCx_Hdl.Init.NbrOfDiscConversion   = 0;  // 间断转换序列长度,循环组忽略
    ADCx_Hdl.Init.TrigType              = ADC_SOFTWARE_TRIGT;// 触发方式,通常都是软件触发
    ADCx_Hdl.Init.Vref                  = ADC_VREF_INSIDE;// 参考源选择,这里选择内部参考
    ADCx_Hdl.Init.AdcDriveType          = BINBUF_DIRECT_DRIVE_ADC;// 采样路径选择
    ADCx_Hdl.Init.AdcCkDiv              = 256;// ADC 时钟分频,可以配置0~0x1FF
    if (HAL_ADC_Init(&ADCx_Hdl) != HAL_OK)
    {
        Error_Handler();
    }
}

2.3 循环组通道配置

void ADC_LoopMode_Channel_setcfg(void)
{
    ADC_LoopConfTypeDef sConfig = {0};
    sConfig.Channel         = ADC_CHANNEL_4;// ADC通道选择,与具体IO相对应
    sConfig.Rank            = ADC_LOOP_RANK_1;// 采样序列配置,这里表示第一次采样的通道
    sConfig.SamplingTime    = ADC_SAMPLETIME_15CYCLES;// 采样周期
    sConfig.LoopClk         = ADC_CH_CLOCK_DIV8;// 通道时钟配置
    sConfig.NbrOfConversion = 4;//循环通道组采样序列长度
    sConfig.CapIntv = 0xFFFF;//两次捕获序列之间的间隔,轮询模式此配置无效
    if(HAL_ADC_LoopConfigChannel(&ADCx_Hdl,&sConfig)!= HAL_OK)
    {
        Error_Handler();
    }
	
}

2.4 事件触发和中断回调

在ADC基础配置完成后,应用上面可以使用以下接口去触发ADC采样,ADC转换完成的结果会通过DMA搬移到指定内存中。

HAL_StatusTypeDef HAL_ADC_LoopChannel_Start_DMA(ADC_HandleTypeDef* hadc, uint16_t* pData, uint32_t Length,void (*Callback)(ADC_HandleTypeDef* hadc));

需要注意的是第三个参数长度的配置,这个长度可以是配置通道数的倍数关系。比如示例中使用了4个通道,如果Length配置为4的话,那完成4个通道的采集后,采样会停止;如果Length配置为8,那在采完4个通道的数据又会自动继续下一轮采样,直到采完8个数据才会停止。

当采完指定个数的AD值后,可以通过void (*Callback)(ADC_HandleTypeDef* hadc)回调函数获知。

三、下载验证

将开发板的PA00、PA01、PA02、PA03输入电压,运行程序,打开RTT LOG查看打印信息。