stm32 Checklists - ADC篇

基础初始化过程

  1. APB EnableClock, 查找定时器所在APB及分组(一般APB1 GRP2),开启时钟
    LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_TIMx);
    
  2. 如果有相应的GPIO,初始化GPIO时钟、端口等。
  3. 填写 ADC_InitStructADC_REG_InitStruct
    LL_ADC_InitTypeDef ADC_InitStruct = {0};
    LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
    ADC_InitStruct.Clock = LL_ADC_CLOCK_ASYNC;
    ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
    ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
    ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;
    ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
    ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
    ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
    ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEM;
    
  4. 初始化ADC及ADC_REG。
    LL_ADC_Init(ADCx, &ADC_InitStruct);
    LL_ADC_REG_Init(ADCx, &ADC_REG_InitStruct);
    
  5. 其它ADC设置。
    LL_ADC_REG_SetSequencerScanDirection(ADCx, LL_ADC_REG_SEQ_SCAN_DIR_FORWARD);
    LL_ADC_SetSamplingTimeCommonChannels(ADCx, LL_ADC_SAMPLINGTIME_1CYCLE_5);
    

软件触发一次转换并等待转换完毕

  1. ADC已完成基础初始化。
  2. 启动校准,并等待校准完成。
    LL_mDelay(1);
    LL_ADC_StartCalibration(ADCx);
    while (LL_ADC_IsCalibrationOnGoing(ADCx));
    
  3. 启用ADC,并等待ADC启动完毕。
    LL_ADC_Enable(ADCx);
    while (LL_ADC_IsActiveFlag_ADRDY(ADCx) == 0);
    
  4. 清除EOC标志,确保转换被执行。
    if (LL_ADC_IsActiveFlag_EOC(ADCx)) LL_ADC_ClearFlag_EOC(ADCx);
    
  5. 设置转换通道。
    LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
    
  6. 启动转换。
    LL_ADC_StartConversion(ADCx);
    
  7. 检查EOC标志。
    while (LL_ADC_IsActiveFlag_EOC(ADCx) == 0);
    LL_ADC_ClearFlag_EOC(ADCx);
    
  8. 读取转换结果。
    LL_ADC_REG_ReadConversionData12(ADCx);
    

使用EOC中断

  1. ADC已完成基础初始化。
  2. 启用ADC,并等待ADC启动完毕。
    LL_ADC_Enable(ADCx);
    while (LL_ADC_IsActiveFlag_ADRDY(ADCx) == 0);
    
  3. 清除EOC标志,确保转换被执行。
    if (LL_ADC_IsActiveFlag_EOC(ADCx)) LL_ADC_ClearFlag_EOC(ADCx);
    
  4. 设置转换通道。
    LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
    
  5. 启用EOC中断。
    LL_ADC_EnableIT_EOC(ADCx);
    
  6. 设置NVIC。
    NVIC_SetPriority(ADCx_IRQn, 0);
    NVIC_EnableIRQ(ADCx_IRQn);
    
  7. 启动转换。
    LL_ADC_StartConversion(ADCx);
    
  8. 在中断服务函数中读取转换结果。
    void ADCx_IRQHandler(void)
    {
        LL_ADC_REG_ReadConversionData12(ADCx);
    }
    

使用触发源

参考时钟配置部分 https://zhujinliang.com/stm32-checklist-tim/

  1. ADC已完成基础初始化。
  2. ADC_REG_InitStruct中指定触发源。
    ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIMx_TRGO;
    
  3. 设置TriggerEdge
    LL_ADC_REG_SetTriggerEdge(ADCx, LL_ADC_REG_TRIG_EXT_RISING);
    
  4. 启用ADC。
    LL_ADC_Enable(ADCx);
    
  5. 设置转换通道。
    LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
    
  6. 启用EOC中断。
    LL_ADC_EnableIT_EOC(ADCx);
    
  7. 设置NVIC。
    NVIC_SetPriority(ADCx_IRQn, 0);
    NVIC_EnableIRQ(ADCx_IRQn);
    
  8. 启动转换。
    LL_ADC_StartConversion(ADCx);
    
  9. 在中断服务函数中读取转换结果。
    void ADC_IRQHandler(void)
    {
        LL_ADC_REG_ReadConversionData12(ADCx);
    }