stm32 Checklists - ADC篇
基础初始化过程
- APB EnableClock, 查找定时器所在APB及分组(一般APB1 GRP2),开启时钟
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_TIMx);
- 如果有相应的GPIO,初始化GPIO时钟、端口等。
- 填写
ADC_InitStruct
及ADC_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;
- 初始化ADC及ADC_REG。
LL_ADC_Init(ADCx, &ADC_InitStruct); LL_ADC_REG_Init(ADCx, &ADC_REG_InitStruct);
- 其它ADC设置。
LL_ADC_REG_SetSequencerScanDirection(ADCx, LL_ADC_REG_SEQ_SCAN_DIR_FORWARD); LL_ADC_SetSamplingTimeCommonChannels(ADCx, LL_ADC_SAMPLINGTIME_1CYCLE_5);
软件触发一次转换并等待转换完毕
- ADC已完成基础初始化。
- 启动校准,并等待校准完成。
LL_mDelay(1); LL_ADC_StartCalibration(ADCx); while (LL_ADC_IsCalibrationOnGoing(ADCx));
- 启用ADC,并等待ADC启动完毕。
LL_ADC_Enable(ADCx); while (LL_ADC_IsActiveFlag_ADRDY(ADCx) == 0);
- 清除EOC标志,确保转换被执行。
if (LL_ADC_IsActiveFlag_EOC(ADCx)) LL_ADC_ClearFlag_EOC(ADCx);
- 设置转换通道。
LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
- 启动转换。
LL_ADC_StartConversion(ADCx);
- 检查EOC标志。
while (LL_ADC_IsActiveFlag_EOC(ADCx) == 0); LL_ADC_ClearFlag_EOC(ADCx);
- 读取转换结果。
LL_ADC_REG_ReadConversionData12(ADCx);
使用EOC中断
- ADC已完成基础初始化。
- 启用ADC,并等待ADC启动完毕。
LL_ADC_Enable(ADCx); while (LL_ADC_IsActiveFlag_ADRDY(ADCx) == 0);
- 清除EOC标志,确保转换被执行。
if (LL_ADC_IsActiveFlag_EOC(ADCx)) LL_ADC_ClearFlag_EOC(ADCx);
- 设置转换通道。
LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
- 启用EOC中断。
LL_ADC_EnableIT_EOC(ADCx);
- 设置NVIC。
NVIC_SetPriority(ADCx_IRQn, 0); NVIC_EnableIRQ(ADCx_IRQn);
- 启动转换。
LL_ADC_StartConversion(ADCx);
- 在中断服务函数中读取转换结果。
void ADCx_IRQHandler(void) { LL_ADC_REG_ReadConversionData12(ADCx); }
使用触发源
参考时钟配置部分 https://zhujinliang.com/stm32-checklist-tim/
- ADC已完成基础初始化。
- 在
ADC_REG_InitStruct
中指定触发源。ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIMx_TRGO;
- 设置
TriggerEdge
。LL_ADC_REG_SetTriggerEdge(ADCx, LL_ADC_REG_TRIG_EXT_RISING);
- 启用ADC。
LL_ADC_Enable(ADCx);
- 设置转换通道。
LL_ADC_REG_SetSequencerChannels(ADCx, LL_ADC_CHANNEL_0);
- 启用EOC中断。
LL_ADC_EnableIT_EOC(ADCx);
- 设置NVIC。
NVIC_SetPriority(ADCx_IRQn, 0); NVIC_EnableIRQ(ADCx_IRQn);
- 启动转换。
LL_ADC_StartConversion(ADCx);
- 在中断服务函数中读取转换结果。
void ADC_IRQHandler(void) { LL_ADC_REG_ReadConversionData12(ADCx); }