5.1 ADC 使用说明

本章说明 N32H49x 标准外设库中 ADC 驱动的文件组成、75 个公开函数,以及 12 个示例。ADC 的时钟树、校准、采样时间、模拟看门狗与多 ADC 同步等硬件细节请配合用户手册的“ADC”章节阅读。

5.1.1 相关文件

相对路径 作用
firmware/n32h49x_std_periph_driver/inc/n32h49x_adc.h 定义 ADC 的初始化与偏移结构体、工作模式、外部触发、采样时间、模拟看门狗、FIFO 与过采样等宏,并声明 75 个公开函数
firmware/n32h49x_std_periph_driver/src/n32h49x_adc.c 实现上述 75 个函数:复位、初始化与校准,规则/注入通道与触发配置,数据读取,模拟看门狗,标志与中断,过采样、偏移与增益补偿,FIFO 操作以及时钟与电源配置
projects/n32h49x_EVAL/examples/ADC/ ADC 示例根目录,含 ADC1_DMA、ADC1_FIFOMode、ADC1_Oversampling、ADC1_TEMP、ADC_DifferentialMode、ADC_Gain_Offset、ADC_SingleRead、AnalogWDG_SimComp、AnalogWatchdog、ExtLinesTrigger、RegSimul_DualMode、TIMTrigger_AutoInjection 12 个示例
projects/n32h49x_EVAL/examples/ADC/ADC1_DMA/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32h49x_EVAL/bsp/ 各示例共用的板级支持文件:日志初始化、打印串口重映射与延时函数

5.1.2 API 参考

搜索 API共 75 个函数

以下 75 个公开函数按 n32h49x_adc.h 的声明顺序分组;每个条目给出功能摘要与 n32h49x_adc.c 中该函数正上方的注释原文。

复位、初始化与校准

ADC_DeInit、ADC_Init、ADC_InitStruct、ADC_Enable、ADC_SetDMATransferMode、ADC_CalibrationOperation、ADC_CalibrationReset、ADC_GetCalibrationStatus

软件启动、停止与温度传感器

ADC_EnableSoftwareStartConv、ADC_GetSoftwareStartConvStatus、ADC_EnableSoftwareStartInjectedConv、ADC_GetSoftwareStartInjectedConvCmdStatus、ADC_GetGainCompensationCmdStatus、ADC_EnableTempSensorVrefint、ADC_StopRegularConv、ADC_StopInjectedConv

触发与采样控制

ADC_SetRegularTriggerEdge、ADC_SetInjectTriggerEdge、ADC_SetMultiTwoSamplingDelay、ADC_ConfigDiscModeChannelCount、ADC_EnableDiscMode、ADC_ConfigRegularChannel

转换结果读取与自动注入

ADC_GetDat、ADC_GetMutiModeConversionDat、ADC_EnableAutoInjectedConv、ADC_EnableInjectedDiscMode、ADC_ConfigExternalTrigInjectedConv、ADC_ConfigExternalTrigRegularConv、ADC_ConfigInjectedChannel、ADC_ConfigInjectedSequencerLength、ADC_GetInjectedConversionDat

模拟看门狗

ADC_ConfigAnalogWatchdog1WorkChannelType、ADC_SetAWDG1FilteringConfig、ADC_ConfigAnalogWatchdogThresholds、ADC_ConfigAnalogWatchdog1SingleChannel、ADC_SetAnalogWatchdog23MonitChannels、ADC_GetAnalogWatchdog23MonitChannels、ADC_SetAnalogWatchdog23IntConfig、ADC_GetAnalogWatchdog23IntConfig、ADC_GetAnalogWatchdog23StatusFlag、ADC_ClearAnalogWatchdog23StatusFlag

标志与中断

ADC_GetFlagStatus、ADC_ClearFlag、ADC_ConfigInt、ADC_GetIntStatus、ADC_ClearIntPendingBit

差分、精度与低功耗配置

ADC_SetChannelSingleDiff、ADC_SetCalibrationFactor、ADC_SetConvResultBitNum、ADC_SelectClockMode、ADC_EnableDeepSleepMode、ADC_SetBypassCalibration、ADC_EnableBatteryVoltageMonitor、ADC_EnableCalibrationAutoLoad

DSMU 模式

ADC_EnableAdcDSMU、ADC_EnableMutiAdcDSMU、ADC_SetAdcDSMUChannel

过采样、偏移与增益补偿

ADC_ConfigOverSamplingRatioAndShift、ADC_SetOverSamplingScope、ADC_EnableOverSamplingDiscont、ADC_SetOffsetConfig、ADC_GetOffsetConfig、ADC_SetGainCompensation

FIFO 操作

ADC_ClearFIFO、ADC_EnableFIFO、ADC_GetFIFOInvalidedDataCount、ADC_GetFIFOFlagStatus、ADC_ClearFIFOFlag、ADC_ConfigFIFOWaterLevel、ADC_ConfigFIFOInt、ADC_ClearFIFOIntPendingBit

外部线触发、电源与时钟配置

ADC_ConfigRegularExtLineTrigSource、ADC_ConfigInjectedExtLineTrigSource、ADC_ConfigADCPowerSupport、ADC_ConfigClk

void ADC_DeInit(ADC_Module* ADCx)复位 ADC 寄存器。
源码注释
name    ADC_DeInit.
fun     Reset the ADC registers.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return  none
void ADC_Init(ADC_Module* ADCx, ADC_InitType* ADC_InitStruct)按 ADC_InitStruct 中的指定参数初始化 ADCx 外设。
源码注释
name    ADC_Init.
fun     Initializes the ADCx peripheral according to the specified parameters in the ADC_InitStruct.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_InitStruct :
          - WorkMode
             - ADC_WORKMODE_INDEPENDENT
             - ADC_WORKMODE_DUAL_REG_INJECT_SIMULT
             - ADC_WORKMODE_DUAL_REG_SIMULT_ALTER_TRIG
             - ADC_WORKMODE_DUAL_INJ_SIMULT_INTERL
             - ADC_WORKMODE_DUAL_INJ_SIMULT
             - ADC_WORKMODE_DUAL_REG_SIMULT
             - ADC_WORKMODE_DUAL_INTERL
             - ADC_WORKMODE_DUAL_ALTER_TRIG
             - ADC_WORKMODE_TRIPPLE_REG_INJECT_SIMULT
             - ADC_WORKMODE_TRIPPLE_REG_SIMULT_ALTER_TRIG
             - ADC_WORKMODE_TRIPPLE_INJ_SIMULT_INTERL
             - ADC_WORKMODE_TRIPPLE_INJ_SIMULT
             - ADC_WORKMODE_TRIPPLE_REG_SIMULT
             - ADC_WORKMODE_TRIPPLE_INTERL
             - ADC_WORKMODE_TRIPPLE_ALTER_TRIG
          - MultiChEn
             - ENABLE
             - DISABLE
          - ContinueConvEn
             - ENABLE
             - DISABLE
          - ExtTrigSelect
             - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4
             - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO
             - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2
             - ADC_EXT_TRIG_REG_CONV_ATIM2_CC4
             - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO
             - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO2
             - ADC_EXT_TRIG_REG_CONV_ATIM3_CC4
             - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO
             - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO2
             - ADC_EXT_TRIG_REG_CONV_GTIM1_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM2_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM3_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM4_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM5_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM6_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM7_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM8_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM9_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM10_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM1_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM2_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM3_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM4_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM5_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM6_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM7_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM8_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM9_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM10_TRGO
             - ADC_EXT_TRIG_REG_CONV_LPTIM1_OUT
             - ADC_EXT_TRIG_REG_CONV_LPTIM2_OUT
             - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15
             - ADC_EXT_TRIG_REG_CONV_SOFTWARE
          - DatAlign
             - ADC_DAT_ALIGN_R
             - ADC_DAT_ALIGN_L
          - Resolution
             - ADC_DATA_RES_12BIT
             - ADC_DATA_RES_10BIT
             - ADC_DATA_RES_8BIT
             - ADC_DATA_RES_6BIT
          - ChsNumber: This parameter must be between 1 to 16.
return  none
void ADC_InitStruct(ADC_InitType* ADC_InitStruct)将 ADC_InitStruct 的各成员填充为默认值。
源码注释
name    ADC_InitStruct.
fun     Fills all ADC_InitStruct member with default value.
param   ADC_InitStruct :
          - WorkMode
          - MultiChEn
          - ContinueConvEn
          - ExtTrigSelect
          - DatAlign
          - ChsNumber
          - Resolution
return  none
void ADC_Enable(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定的 ADC。
源码注释
name    ADC_Enable.
fun     Configures the specified ADC enable or disable.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_SetDMATransferMode(ADC_Module *ADCx, uint32_t DMAMode)选择多通道转换时数据传输的 DMA 模式。
源码注释
name    ADC_SetDMATransferMode.
fun     Select the DMA mode for data transmission in multi-channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   DMAMode :
          - ADC_MULTI_REG_DMA_DISABLE    :DMA Mode 0
          - ADC_MULTI_REG_DMA_EACH_ADC   :DMA Mode 1
          - ADC_MULTI_REG_DMA_LIMIT_RES12_10B :DMA Mode 2
          - ADC_MULTI_REG_DMA_LIMIT_RES8_6B :DMA Mode 3
return  none
void ADC_CalibrationOperation(ADC_Module* ADCx, ADC_CALI_MOD cali_mode)启动所选 ADC 的差分或单端模式校准过程。
源码注释
name    ADC_CalibrationOperation.
fun     Starts the selected ADC differential or signal mode calibration process.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   cali_mode : specifies differential or signal mode of calibration.
          - ADC_CALIBRATION_SINGLE_MODE
          - ADC_CALIBRATION_DIFF_MODE
return  none
void ADC_CalibrationReset(ADC_Module* ADCx, ADC_CALI_MOD cali_mode)复位所选 ADC 的差分或单端模式校准过程。
源码注释
name    ADC_CalibrationReset.
fun     Reset the selected ADC differential or signal mode calibration process.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   cali_mode : specifies differential or signal mode of calibration.
          - ADC_CALIBRATION_SINGLE_MODE
          - ADC_CALIBRATION_DIFF_MODE
return  none
FlagStatus ADC_GetCalibrationStatus(ADC_Module* ADCx, ADC_CALI_MOD cali_mode)获取所选 ADC 的校准状态。
源码注释
name    ADC_GetCalibrationStatus.
fun     Gets the selected ADC calibration status.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   cali_mode : specifies differential or signal mode of calibration.
          - ADC_CALIBRATION_SINGLE_MODE
          - ADC_CALIBRATION_DIFF_MODE
return  FlagStatus:
          - RESET : ADCx calibration is finished;
          - SET   : ADCx calibration is not finished;
void ADC_EnableSoftwareStartConv(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭所选 ADC 的软件启动规则转换。
源码注释
name    ADC_EnableSoftwareStartConv.
fun     Enables or disables the selected ADC software start conversion ..
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_Module* ADCx)获取所选 ADC 软件启动规则转换的状态。
源码注释
name    ADC_GetSoftwareStartConvStatus.
fun     Gets the selected ADC Software start conversion Status.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return The new state of ADC software start conversion (SET or RESET).
void ADC_EnableSoftwareStartInjectedConv(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭所选 ADC 的注入通道转换启动。
源码注释
name    ADC_EnableSoftwareStartInjectedConv.
fun    Enables or disables the selected ADC start of the injected channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_Module* ADCx)获取所选 ADC 软件启动注入转换的状态。
源码注释
name    ADC_GetSoftwareStartInjectedConvCmdStatus.
fun     Gets the selected ADC Software start injected conversion Status.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return The new state of ADC software start injected conversion (SET or RESET).
FlagStatus ADC_GetGainCompensationCmdStatus(ADC_Module* ADCx)获取所选 ADC 的增益补偿状态。
源码注释
name    ADC_GetGainCompensationCmdStatus.
fun     Gets the selected ADC gain compensation status.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return The new state of gain compensation (SET or RESET).
void ADC_EnableTempSensorVrefint(FunctionalState Cmd)使能或关闭温度传感器与 Vrefint 通道。
源码注释
name    ADC_EnableTempSensorVrefint.
fun     Enables or disables the temperature sensor and Vrefint channel
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_StopRegularConv(ADC_Module* ADCx)停止 ADC 规则通道组转换。
源码注释
name    ADC_StopRegularConv.
fun     Stop ADC group regular channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return  none
void ADC_StopInjectedConv(ADC_Module* ADCx)停止 ADC 注入通道组转换。
源码注释
name    ADC_StopInjectedConv.
fun     Stop ADC group injected channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return  none
void ADC_SetRegularTriggerEdge(ADC_Module* ADCx, uint32_t ExternalRegularTriggerEdge)设置 ADCx 规则转换的触发极性。
源码注释
name    ADC_SetRegularTriggerEdge.
fun     Set ADCx group regular conversion trigger polarity.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ExternalRegularTriggerEdge :
          - ADC_REG_TRIG_EXT_SOFTWARE
          - ADC_REG_TRIG_EXT_RISING
          - ADC_REG_TRIG_EXT_FALLING
          - ADC_REG_TRIG_EXT_RISINGFALLING
return  none
void ADC_SetInjectTriggerEdge(ADC_Module* ADCx, uint32_t ExternalInjectTriggerEdge)设置 ADCx 注入转换的触发极性。
源码注释
name    ADC_SetInjectTriggerEdge.
fun     Set ADCx group injected conversion trigger polarity.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ExternalInjectTriggerEdge :
          - ADC_INJ_TRIG_EXT_SOFTWARE
          - ADC_INJ_TRIG_EXT_RISING
          - ADC_INJ_TRIG_EXT_FALLING
          - ADC_INJ_TRIG_EXT_RISINGFALLING
return  none
void ADC_SetMultiTwoSamplingDelay(ADC_Module* ADCx, uint32_t MultiTwoSamplingDelay)设置多 ADC 模式下两个采样阶段之间的延迟。
源码注释
name    ADC_SetMultiTwoSamplingDelay.
fun     Set ADC multimode delay between 2 sampling phases.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   MultiTwoSamplingDelay
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_1
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_2
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_3
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_4
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_5
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_6
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_7
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_8
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_9
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_10
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_11
          - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_12
return  none
note    1.When ADC resolution is 12, the maximum of the parameter 'MultiTwoSamplingDelay' \
          can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_12.
        2.When ADC resolution is 10, the maximum of the parameter 'MultiTwoSamplingDelay' \
          can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_10.
        3.When ADC resolution is 8, the maximum of the parameter 'MultiTwoSamplingDelay' \
          can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_8.
        4.When ADC resolution is 6, the maximum of the parameter 'MultiTwoSamplingDelay' \
          can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_6.
void ADC_ConfigDiscModeChannelCount(ADC_Module* ADCx, uint8_t Number)配置所选 ADC 规则通道组间断模式的通道个数。
源码注释
name    ADC_ConfigDiscModeChannelCount.
fun     Configures the discontinuous numbers for the selected ADC regular
        group channels.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Number : specifies the discontinuous mode regular channel
         count value. This number must be range form 1 to 8.
return  none
void ADC_EnableDiscMode(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 规则通道组的间断模式。
源码注释
name    ADC_EnableDiscMode.
fun     Enables or disables the discontinuous mode on regular group
\*         channel for the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_ConfigRegularChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)为所选 ADC 规则通道配置其在序列中的秩与采样时间。
源码注释
name    ADC_ConfigRegularChannel.
fun     Configures for the selected ADC regular channel its corresponding
        rank in the sequencer and its sample time.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_Channel :
          - ADC_CH_0 : ADC Channel0 selected
          - ADC_CH_1 : ADC Channel1 selected
          - ADC_CH_2 : ADC Channel2 selected
          - ADC_CH_3 : ADC Channel3 selected
          - ADC_CH_4 : ADC Channel4 selected
          - ADC_CH_5 : ADC Channel5 selected
          - ADC_CH_6 : ADC Channel6 selected
          - ADC_CH_7 : ADC Channel7 selected
          - ADC_CH_8 : ADC Channel8 selected
          - ADC_CH_9 : ADC Channel9 selected
          - ADC_CH_10 : ADC Channel10 selected
          - ADC_CH_11 : ADC Channel11 selected
          - ADC_CH_12 : ADC Channel12 selected
          - ADC_CH_13 : ADC Channel13 selected
          - ADC_CH_14 : ADC Channel14 selected
          - ADC_CH_15 : ADC Channel15 selected
          - ADC_CH_16 : ADC Channel16 selected
          - ADC_CH_17 : ADC Channel17 selected
          - ADC_CH_18 : ADC Channel18 selected
param   Rank : The rank in the regular group sequencer. This parameter must be between 1 to 16.
param   ADC_SampleTime : The sample time value to be set for the selected channel.
          - ADC_SAMP_TIME_CYCLES_1_5
          - ADC_SAMP_TIME_CYCLES_2_5
          - ADC_SAMP_TIME_CYCLES_4_5
          - ADC_SAMP_TIME_CYCLES_7_5
          - ADC_SAMP_TIME_CYCLES_13_5
          - ADC_SAMP_TIME_CYCLES_19_5
          - ADC_SAMP_TIME_CYCLES_28_5
          - ADC_SAMP_TIME_CYCLES_41_5
          - ADC_SAMP_TIME_CYCLES_55_5
          - ADC_SAMP_TIME_CYCLES_61_5
          - ADC_SAMP_TIME_CYCLES_71_5
          - ADC_SAMP_TIME_CYCLES_181_5
          - ADC_SAMP_TIME_CYCLES_239_5
          - ADC_SAMP_TIME_CYCLES_601_5
return  none
uint16_t ADC_GetDat(ADC_Module* ADCx)获取规则通道最近一次 ADCx 转换结果。
源码注释
name    ADC_GetDat.
fun     Get the last ADCx conversion result data for regular channel
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return  The Data conversion value.
uint32_t ADC_GetMutiModeConversionDat(ADC_Module* ADCx)获取双 ADC 或三 ADC 模式下最近一次转换结果。
源码注释
name    ADC_GetMutiModeConversionDat.
fun     Get the last ADC conversion result data in dual-ADC or tripple-ADC mode.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return  The Data conversion value in dual-ADC or tripple-ADC mode.
void ADC_EnableAutoInjectedConv(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭所选 ADC 在规则转换之后自动进行注入组转换。
源码注释
name    ADC_EnableAutoInjectedConv.
fun     Enables or disables the selected ADC automatic injected group
        conversion after regular one
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_EnableInjectedDiscMode(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 注入通道组的间断模式。
源码注释
name    ADC_EnableInjectedDiscMode.
fun     Enables or disables the discontinuous mode on injected group
\*         channel for the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_ConfigExternalTrigInjectedConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigInjecConv)配置 ADCx 注入通道转换的外部触发源。
源码注释
name    ADC_ConfigExternalTrigInjectedConv.
fun     Configures the ADCx external trigger source for injected channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_ExternalTrigInjecConv :
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC4
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO2
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC4
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO2
          - ADC_EXT_TRIG_INJ_CONV_ATIM3_CC4
          - ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO
          - ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO2
          - ADC_EXT_TRIG_INJ_CONV_GTIM1_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM2_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM5_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM6_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM7_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM8_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM9_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM10_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM1_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM2_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM5_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM6_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM7_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM8_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM9_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM10_TRGO
          - ADC_EXT_TRIG_INJ_CONV_LPTIM1_OUT
          - ADC_EXT_TRIG_INJ_CONV_LPTIM2_OUT
          - ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15
          - ADC_EXT_TRIG_INJ_CONV_SOFTWARE
return  none
void ADC_ConfigExternalTrigRegularConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigRegularConv)配置 ADCx 规则通道转换的外部触发源。
源码注释
name    ADC_ConfigExternalTrigRegularConv.
fun     Configures the ADCx external trigger source for regular channels conversion.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_ExternalTrigRegularConv :
          - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4
          - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO
          - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2
          - ADC_EXT_TRIG_REG_CONV_ATIM2_CC4
          - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO
          - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO2
          - ADC_EXT_TRIG_REG_CONV_ATIM3_CC4
          - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO
          - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO2
          - ADC_EXT_TRIG_REG_CONV_GTIM1_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM2_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM3_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM4_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM5_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM6_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM7_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM8_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM9_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM10_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM1_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM2_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM3_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM4_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM5_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM6_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM7_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM8_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM9_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM10_TRGO
          - ADC_EXT_TRIG_REG_CONV_LPTIM1_OUT
          - ADC_EXT_TRIG_REG_CONV_LPTIM2_OUT
          - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15
          - ADC_EXT_TRIG_REG_CONV_SOFTWARE
return  none
void ADC_ConfigInjectedChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)为所选 ADC 注入通道配置其在序列中的秩与采样时间。
源码注释
name    ADC_ConfigInjectedChannel.
fun     Configures for the selected ADC injected channel its corresponding
        rank in the sequencer and its sample time.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_Channel :
          - ADC_CH_0 : ADC Channel0 selected
          - ADC_CH_1 : ADC Channel1 selected
          - ADC_CH_2 : ADC Channel2 selected
          - ADC_CH_3 : ADC Channel3 selected
          - ADC_CH_4 : ADC Channel4 selected
          - ADC_CH_5 : ADC Channel5 selected
          - ADC_CH_6 : ADC Channel6 selected
          - ADC_CH_7 : ADC Channel7 selected
          - ADC_CH_8 : ADC Channel8 selected
          - ADC_CH_9 : ADC Channel9 selected
          - ADC_CH_10 : ADC Channel10 selected
          - ADC_CH_11 : ADC Channel11 selected
          - ADC_CH_12 : ADC Channel12 selected
          - ADC_CH_13 : ADC Channel13 selected
          - ADC_CH_14 : ADC Channel14 selected
          - ADC_CH_15 : ADC Channel15 selected
          - ADC_CH_16 : ADC Channel16 selected
          - ADC_CH_17 : ADC Channel17 selected
          - ADC_CH_18 : ADC Channel18 selected
param   Rank : The rank in the injected group sequencer. This parameter must be between 1 to 4.
param   ADC_SampleTime : The sample time value to be set for the selected channel.
          - ADC_SAMP_TIME_CYCLES_1_5
          - ADC_SAMP_TIME_CYCLES_2_5
          - ADC_SAMP_TIME_CYCLES_4_5
          - ADC_SAMP_TIME_CYCLES_7_5
          - ADC_SAMP_TIME_CYCLES_13_5
          - ADC_SAMP_TIME_CYCLES_19_5
          - ADC_SAMP_TIME_CYCLES_28_5
          - ADC_SAMP_TIME_CYCLES_41_5
          - ADC_SAMP_TIME_CYCLES_55_5
          - ADC_SAMP_TIME_CYCLES_61_5
          - ADC_SAMP_TIME_CYCLES_71_5
          - ADC_SAMP_TIME_CYCLES_181_5
          - ADC_SAMP_TIME_CYCLES_239_5
          - ADC_SAMP_TIME_CYCLES_601_5
return  none
void ADC_ConfigInjectedSequencerLength(ADC_Module* ADCx, uint8_t Length)配置注入通道序列的长度。
源码注释
name    ADC_ConfigInjectedSequencerLength.
fun     Configures the sequencer length for injected channels
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Length : The sequencer length. This parameter must be a number between 1 to 4.
uint16_t ADC_GetInjectedConversionDat(ADC_Module* ADCx, uint8_t ADC_InjectedChannel)获取 ADC 注入通道的转换结果。
源码注释
name    ADC_GetInjectedConversionDat.
fun     Get the ADC injected channel conversion result.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_InjectedChannelOffset :
          - ADC_INJECT_DATA_OFFSET_1
          - ADC_INJECT_DATA_OFFSET_2
          - ADC_INJECT_DATA_OFFSET_3
          - ADC_INJECT_DATA_OFFSET_4
return  The data conversion value. this date is range 0 - 0xFFFF.
void ADC_ConfigAnalogWatchdog1WorkChannelType(ADC_Module* ADCx, uint32_t ADC_AnalogWatchdog)在单个/全部规则或注入通道上使能或关闭模拟看门狗 1。
源码注释
name    ADC_ConfigAnalogWatchdog1WorkChannelType.
fun     Enables or disables the analog watchdog 1 on single/all regular or injected channels.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_AnalogWatchdog :
          - ADC_ANALOG_WTDG_NONE
          - ADC_ANALOG_WTDG_SINGLEREG_ENABLE
          - ADC_ANALOG_WTDG_SINGLEINJEC_ENABLE
          - ADC_ANALOG_WTDG_SINGLEREG_OR_INJEC_ENABLE
          - ADC_ANALOG_WTDG_ALLREG_ENABLE
          - ADC_ANALOG_WTDG_ALLINJEC_ENABLE
          - ADC_ANALOG_WTDG_ALLREG_ALLINJEC_ENABLE
return  none.
void ADC_SetAWDG1FilteringConfig(ADC_Module *ADCx, uint32_t FilteringCount)设置 ADC 模拟看门狗滤波配置。
源码注释
name    ADC_SetAWDG1FilteringConfig.
fun     Set ADC analog watchdog filtering configuration.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   FilteringCount :
          - ADC_AWDG1_FILTERING_NONE
          - ADC_AWDG1_FILTERING_2SAMPLES
          - ADC_AWDG1_FILTERING_3SAMPLES
          - ADC_AWDG1_FILTERING_4SAMPLES
          - ADC_AWDG1_FILTERING_5SAMPLES
          - ADC_AWDG1_FILTERING_6SAMPLES
          - ADC_AWDG1_FILTERING_7SAMPLES
          - ADC_AWDG1_FILTERING_8SAMPLES
return  none.
void ADC_ConfigAnalogWatchdogThresholds(ADC_Module* ADCx, ADC_AWDG Awdg, uint16_t HighThreshold, uint16_t LowThreshold)配置模拟看门狗 1/2/3 的高、低阈值。
源码注释
name    ADC_ConfigAnalogWatchdogThresholds.
fun     Configures the high and low thresholds of the analog watchdog 1/2/3.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Awdg :
          - ADC_AWDG1
          - ADC_AWDG2
          - ADC_AWDG3
param   HighThreshold : the ADC analog watchdog 1/2/3 high threshold value.
          - This parameter must be a 12bit value.
param   LowThreshold : the ADC analog watchdog 1/2/3 low threshold value.
          - This parameter must be a 12bit value.
return  none
void ADC_ConfigAnalogWatchdog1SingleChannel(ADC_Module* ADCx, uint8_t ADC_Channel)配置模拟看门狗 1 监控单个通道。
源码注释
name    ADC_ConfigAnalogWatchdog1SingleChannel.
fun     Configures the analog watchdog 1 guarded on single channel.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_AnalogWatchdog :
          - ADC_CH_0 : ADC Channel0 selected
          - ADC_CH_1 : ADC Channel1 selected
          - ADC_CH_2 : ADC Channel2 selected
          - ADC_CH_3 : ADC Channel3 selected
          - ADC_CH_4 : ADC Channel4 selected
          - ADC_CH_5 : ADC Channel5 selected
          - ADC_CH_6 : ADC Channel6 selected
          - ADC_CH_7 : ADC Channel7 selected
          - ADC_CH_8 : ADC Channel8 selected
          - ADC_CH_9 : ADC Channel9 selected
          - ADC_CH_10 : ADC Channel10 selected
          - ADC_CH_11 : ADC Channel11 selected
          - ADC_CH_12 : ADC Channel12 selected
          - ADC_CH_13 : ADC Channel13 selected
          - ADC_CH_14 : ADC Channel14 selected
          - ADC_CH_15 : ADC Channel15 selected
          - ADC_CH_16 : ADC Channel16 selected
          - ADC_CH_17 : ADC Channel17 selected
          - ADC_CH_18 : ADC Channel18 selected
return  none.
void ADC_SetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset, uint32_t AWDG_ChannelGroup)设置模拟看门狗 2/3 监控的通道:单通道、多通道或全部通道。
源码注释
name    ADC_SetAnalogWatchdog23MonitChannels.
fun     Set ADC analog watchdog 2/3 monitored channels: a single channel, multiple channels or all channels.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegEnOffset :
          - ADC_AWDG2_EN_OFFSET : config analog watchdog 2.
          - ADC_AWDG3_EN_OFFSET : config analog watchdog 3.
param   AWDG_ChannelGroup : channels monitored: flexible on channels monitored, selection is
          channel wise, from from 1 to all channels. Specificity of this analog watchdog:
          Multiple channels can be selected.eg : 0x00000005 mean CH0 and CH2 are monitored.
          0x00000000 mean this analog watchdog disable.
return  none.
uint32_t ADC_GetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset)获取模拟看门狗 2/3 监控的通道。
源码注释
name    ADC_GetAnalogWatchdog23MonitChannels.
fun     Get ADC analog watchdog 2/3 monitored channels.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegEnOffset :
          - ADC_AWDG2_EN_OFFSET : analog watchdog 2.
          - ADC_AWDG3_EN_OFFSET : analog watchdog 3.
return  channels monitored by this analog watchdog2/3.
void ADC_SetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegIntEnOffset, uint32_t AWDG_ChannelEn)使能或关闭模拟看门狗 2/3 被监控通道的中断。
源码注释
name    ADC_SetAnalogWatchdog23IntConfig.
fun     Enable or disable ADC analog watchdog 2/3 monitored channels interrupt.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegIntEnOffset :
          - ADC_AWDG2_INTEN_OFFSET : config analog watchdog 2.
          - ADC_AWDG3_INTEN_OFFSET : config analog watchdog 3.
param   AWDG_ChannelEn : channels monitored: flexible on channels monitored, selection is
          channel wise, from from 1 to all channels. Specificity of this analog watchdog:
          Multiple channels can be selected.eg : 0x00000005 mean CH0 and CH2 monitored enable interrupt.
          0x00000000 mean this analog watchdog disable the interrupt.
return  none.
uint32_t ADC_GetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset)获取模拟看门狗 2/3 被监控通道的中断使能情况。
源码注释
name    ADC_GetAnalogWatchdog23MonitChannels.
fun     Get ADC analog watchdog 2/3 monitored channels.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegEnOffset :
          - ADC_AWDG2_EN_OFFSET : analog watchdog 2.
          - ADC_AWDG3_EN_OFFSET : analog watchdog 3.
return  channels monitored by this analog watchdog2/3 enable the interrupt or not.

使用提示: 源码注释中的 name 与函数名不一致,此处以函数声明 ADC_GetAnalogWatchdog23IntConfig 为准。

uint32_t ADC_GetAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset)获取模拟看门狗 2/3 被监控通道的状态标志。
源码注释
name    ADC_GetAnalogWatchdog23StatusFlag.
fun     Get ADC analog watchdog 2/3 monitored channels status flag.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegSTSOffset :
          - ADC_AWDG2_STS_OFFSET : analog watchdog 2.
          - ADC_AWDG3_STS_OFFSET : analog watchdog 3.
return    channels monitored by this analog watchdog2/3 indicates outside the programmed
          thresholds or not.
void ADC_ClearAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset, uint32_t AWDG_ChannelFlag)清除模拟看门狗 2/3 被监控通道的状态标志。
源码注释
name    ADC_ClearAnalogWatchdog23StatusFlag.
fun     Clear ADC analog watchdog 2/3 monitored channels status flag.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   AWDG_RegSTSOffset :
          - ADC_AWDG2_STS_OFFSET : analog watchdog 2.
          - ADC_AWDG3_STS_OFFSET : analog watchdog 3.
param   AWDG_ChannelFlag : channels monitored flag wil l be cleared.
          eg : 0x00000005 mean CH0 and CH2 status flag will be cleared.
return    none.
FlagStatus ADC_GetFlagStatus(ADC_Module* ADCx, uint16_t ADC_FLAG)检查指定的 ADC 标志是否置位。
源码注释
name    ADC_GetFlagStatus.
fun     Checks whether the specified ADC flag is set or not.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FLAG :
          - ADC_FLAG_ENDC
          - ADC_FLAG_EOC_ANY
          - ADC_FLAG_JENDC
          - ADC_FLAG_JEOC_ANY
          - ADC_FLAG_AWDG1
          - ADC_FLAG_ENDC_ERROR
          - ADC_FLAG_RDY
          - ADC_FLAG_PDRDY
          - ADC_FLAG_EOSAMP
          - ADC_FLAG_TCFLAG
          - ADC_FLAG_STR
          - ADC_FLAG_JSTR
return    The new state of ADC_FLAG (SET or RESET).
void ADC_ClearFlag(ADC_Module* ADCx, uint16_t ADC_FLAG)清除指定 ADC 的挂起标志。
源码注释
name    ADC_ClearFlag.
fun     Clears pending flags of the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FLAG :
          - ADC_FLAG_ENDC
          - ADC_FLAG_EOC_ANY
          - ADC_FLAG_JENDC
          - ADC_FLAG_JEOC_ANY
          - ADC_FLAG_AWDG1
          - ADC_FLAG_ENDC_ERROR
          - ADC_FLAG_RDY
          - ADC_FLAG_PDRDY
          - ADC_FLAG_EOSAMP
          - ADC_FLAG_TCFLAG
          - ADC_FLAG_STR
          - ADC_FLAG_JSTR
return    none.
void ADC_ConfigInt(ADC_Module* ADCx, uint16_t ADC_IT, FunctionalState Cmd)使能或关闭指定的 ADC 中断。
源码注释
name    ADC_ConfigInt.
fun     Enables or disables the specified ADC interrupts.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_IT :
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWD1
          - ADC_INT_ENDCERR
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP
param   Cmd :
          - ENABLE
          - DISABLE
return    none.
INTStatus ADC_GetIntStatus(ADC_Module* ADCx, uint16_t ADC_IT)检查指定的 ADC 中断是否发生。
源码注释
name    ADC_GetIntStatus.
fun     Checks whether the specified ADC interrupt has occurred or not.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_IT : specifies the ADC interrupt source to check.
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWD1
          - ADC_INT_ENDCERR
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP
return    The new state of ADC_IT (SET or RESET).
void ADC_ClearIntPendingBit(ADC_Module* ADCx, uint16_t ADC_IT)清除指定 ADC 的中断挂起位。
源码注释
name    ADC_ClearIntPendingBit.
fun     Clears  interrupt pending bits of the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_IT :
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWD1
          - ADC_INT_ENDCERR
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP
return    none.
void ADC_SetChannelSingleDiff(ADC_Module* ADCx, uint32_t Channel, uint32_t SingleDiff)设置所选 ADC 通道为单端或差分输入模式。
源码注释
name    ADC_SetChannelSingleDiff.
fun     Set mode single-ended or differential input of the selected ADC channel.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Channel :
          - ADC_CH_1
          - ADC_CH_2
          - ADC_CH_3
          - ADC_CH_4
          - ADC_CH_5
          - ADC_CH_6
          - ADC_CH_7
          - ADC_CH_8
          - ADC_CH_9
          - ADC_CH_10
          - ADC_CH_11
          - ADC_CH_12
          - ADC_CH_13
          - ADC_CH_14
          - ADC_CH_15
          - ADC_CH_16
          - ADC_CH_17
          - ADC_CH_18
param   SingleDiff :
          - ADC_SINGLE_ENDED
          - ADC_DIFFERENTIAL_ENDED
return    none.
note  Some channels are internally fixed to single-ended inputs: please refer to ADC chapter of user manual.
void ADC_SetCalibrationFactor(ADC_Module *ADCx, uint32_t SingleDiff, uint32_t CalibrationFactor)设置单端或差分模式下的 ADC 校准因子。
源码注释
name    ADC_SetCalibrationFactor.
fun     Set ADC calibration factor in the single-ended or differential mode.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   SingleDiff :
          - ADC_SINGLE_ENDED
          - ADC_DIFFERENTIAL_ENDED
param   CalibrationFactor : The parameter between Min_Data=0x00 and Max_Data=0x7F
return    none.
void ADC_SetConvResultBitNum(ADC_Module* ADCx, uint32_t ResultBitNum)设置 ADC 的分辨率,可选 12bit、10bit、8bit、6bit。
源码注释
name    ADC_SetConvResultBitNum.
fun     Set ADC resolution including 12bit,10bit,8bit,6bit .
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ResultBitNum :
          - ADC_DATA_RES_12BIT
          - ADC_DATA_RES_10BIT
          - ADC_DATA_RES_8BIT
          - ADC_DATA_RES_6BIT
return    none.
void ADC_SelectClockMode(ADC_Module* ADCx, uint32_t ClockMode)设置 ADC 时钟来自 AHB 或 PLL。
源码注释
name    ADC_SelectClockMode.
fun     Set Adc Clock mode from AHB or PLL.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ClockMode :
          - ADC_CLOCK_MODE_PLL
          - ADC_CLOCK_MODE_AHB
return    none.
void ADC_EnableDeepSleepMode(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 进入深度睡眠模式。
源码注释
name    ADC_EnableDeepSleepMode.
fun     Enables or disables the specified ADC entering deep sleep mode.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_SetBypassCalibration(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭 ADC 校准旁路模式。
源码注释
name    ADC_SetBypassCalibration.
fun     Enable or disable ADC calibration bypass mode.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return    none.
void ADC_EnableBatteryVoltageMonitor(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的电池电压监测。
源码注释
name    ADC_EnableBatteryVoltageMonitor.
fun     Enables or disables the specified ADC battery voltage monitor.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note  if users wants to measure the VBAT/2, they should set this bit first.
void ADC_EnableCalibrationAutoLoad(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的校准值自动加载。
源码注释
name    ADC_EnableCalibrationAutoLoad.
fun     Enables or disables the specified ADC calibration value auto load.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_EnableAdcDSMU(ADC_Module *ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的 DSMU 模式。
源码注释
name    ADC_EnableAdcDSMU.
fun     Configures ADC DSMU mode for the specified ADC enable or disable.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_EnableMutiAdcDSMU(ADC_Module *ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的多 ADC DSMU 模式。
源码注释
name    ADC_EnableMutiAdcDSMU.
fun     Configures Multi-adc DSMU mode for the specified ADC enable or disable.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_SetAdcDSMUChannel(ADC_Module *ADCx, uint8_t ADC_Channel, FunctionalState Cmd)使能或关闭指定 ADC 通道的 DSMU 模式。
源码注释
name    ADC_EnableAdcDSMU.
fun     Configures ADC DSMU mode for the specified ADC enable or disable.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_Channel :
          - ADC_CH_0 : ADC Channel0 selected
          - ADC_CH_1 : ADC Channel1 selected
          - ADC_CH_2 : ADC Channel2 selected
          - ADC_CH_3 : ADC Channel3 selected
          - ADC_CH_4 : ADC Channel4 selected
          - ADC_CH_5 : ADC Channel5 selected
          - ADC_CH_6 : ADC Channel6 selected
          - ADC_CH_7 : ADC Channel7 selected
          - ADC_CH_8 : ADC Channel8 selected
          - ADC_CH_9 : ADC Channel9 selected
          - ADC_CH_10 : ADC Channel10 selected
          - ADC_CH_11 : ADC Channel11 selected
          - ADC_CH_12 : ADC Channel12 selected
          - ADC_CH_13 : ADC Channel13 selected
          - ADC_CH_14 : ADC Channel14 selected
          - ADC_CH_15 : ADC Channel15 selected
          - ADC_CH_16 : ADC Channel16 selected
          - ADC_CH_17 : ADC Channel17 selected
          - ADC_CH_18 : ADC Channel18 selected
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note The DSMU filtering cannot distinguish the difference among ADC channels.

使用提示: 源码注释中的 name 与函数名不一致,此处以函数声明 ADC_SetAdcDSMUChannel 为准。

void ADC_ConfigOverSamplingRatioAndShift(ADC_Module *ADCx, uint32_t Ratio, uint32_t Shift)设置 ADC 过采样倍数与右移位数。
源码注释
name    ADC_ConfigOverSamplingRatioAndShift.
fun     Set ADC oversampling rate times and shift bit.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Ratio : ADC oversampling ratio times
          - ADC_OVERSAMPE_RATE_TIMES_1
          - ADC_OVERSAMPE_RATE_TIMES_2
          - ADC_OVERSAMPE_RATE_TIMES_4
          - ADC_OVERSAMPE_RATE_TIMES_8
          - ADC_OVERSAMPE_RATE_TIMES_16
          - ADC_OVERSAMPE_RATE_TIMES_32
          - ADC_OVERSAMPE_RATE_TIMES_64
          - ADC_OVERSAMPE_RATE_TIMES_128
          - ADC_OVERSAMPE_RATE_TIMES_256
param   Shift : ADC oversampling data right shift
          - ADC_OVERSAMPE_DATA_SHIFT_0
          - ADC_OVERSAMPE_DATA_SHIFT_1
          - ADC_OVERSAMPE_DATA_SHIFT_2
          - ADC_OVERSAMPE_DATA_SHIFT_3
          - ADC_OVERSAMPE_DATA_SHIFT_4
          - ADC_OVERSAMPE_DATA_SHIFT_5
          - ADC_OVERSAMPE_DATA_SHIFT_6
          - ADC_OVERSAMPE_DATA_SHIFT_7
          - ADC_OVERSAMPE_DATA_SHIFT_8
return  none
void ADC_SetOverSamplingScope(ADC_Module *ADCx, uint32_t OversampleScope)设置 ADC 过采样的作用范围。
源码注释
name    ADC_SetOverSamplingScope.
fun     Set ADC oversampling scope.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   OversampleScope :This parameter can be one of the following values
          - ADC_OVERSAMPE_DISABLE
          - ADC_OVERSAMPE_REGULAR_CONTINUED
          - ADC_OVERSAMPE_REGULAR_RESUMED
          - ADC_OVERSAMPE_INJECTED
          - ADC_OVERSAMPE_REGULAR_INJECTED
return  none
void ADC_EnableOverSamplingDiscont(ADC_Module *ADCx, FunctionalState Cmd)设置 ADC 过采样间断模式(触发模式)。
源码注释
name    ADC_SetOverSamplingDiscont.
fun     Set ADC oversampling discontinuous mode (triggered mode).
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return  none

使用提示: 源码注释中的 name 与函数名不一致,此处以函数声明 ADC_EnableOverSamplingDiscont 为准。

void ADC_SetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct)设置指定通道的转换偏移配置。
源码注释
name    ADC_SetOffsetConfig.
fun     Set the specified channel conversion offset configuration.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_Offset :
          - ADC_REGESTER_OFFSET_1
          - ADC_REGESTER_OFFSET_2
          - ADC_REGESTER_OFFSET_3
          - ADC_REGESTER_OFFSET_4
param   ADC_OffsetStruct :
          - OffsetData : Set the selected channel data offset .This parameter must be range from 0 to 0xfff.
          - OffsetChannel : Set the selected channel .This parameter must be range from 0 to 0x12. means CH0 - CH18.
          - OffsetDirPositiveEn : Enable or disable the selected channel offset positive direction.
             - ENABLE
             - DISABLE
          - OffsetSatenEn : Enable or disable the selected channel offset saturation .
             - ENABLE
             - DISABLE
          - OffsetEn : Enable or disable the selected channel offset.
             - ENABLE
             - DISABLE
return  none
void ADC_GetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct)获取指定通道的转换偏移配置。
源码注释
name    ADC_GetOffsetConfig.
fun     Get the specified channel conversion offset configuration.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_Offset :
          - ADC_REGESTER_OFFSET_1
          - ADC_REGESTER_OFFSET_2
          - ADC_REGESTER_OFFSET_3
          - ADC_REGESTER_OFFSET_4
param   ADC_OffsetStruct :
          - OffsetData : Set the selected channel data offset .This parameter must be range from 0 to 0xfff.
          - OffsetChannel : Set the selected channel .This parameter must be range from 0 to 0x12. means CH0 - CH18.
          - OffsetDirPositiveEn : Enable or disable the selected channel offset positive direction.
             - ENABLE
             - DISABLE
          - OffsetSatenEn : Enable or disable the selected channel offset saturation .
             - ENABLE
             - DISABLE
          - OffsetEn : Enable or disable the selected channel offset.
             - ENABLE
             - DISABLE
return  none
void ADC_SetGainCompensation(ADC_Module *ADCx, uint32_t GainCompensationValue)设置 ADC 增益补偿。
源码注释
name    ADC_SetGainCompensation.
fun     Set ADC gain compensation.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   GainCompensationValue :
          when this value is 0, it means gain compensation will be disabled and value set to 0.
          when this value is 1 ~ 16393, gain compensation will be enabled with specified value.
return    none.
void ADC_ClearFIFO(ADC_Module* ADCx)清空指定 ADC 的 FIFO。
源码注释
name    ADC_ClearFIFO.
fun     Clear the specified ADC FIFO.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return    none.
void ADC_EnableFIFO(ADC_Module* ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的 FIFO。
源码注释
name    ADC_EnableFIFO.
fun     Enables or disables the specified ADC FIFO.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   Cmd :
          - ENABLE
          - DISABLE
return    none.
uint8_t ADC_GetFIFOInvalidedDataCount(ADC_Module* ADCx)获取无效数据的总数。
源码注释
name    ADC_GetFIFOInvalidedDataCount.
fun     Get the total counts of invalided data .
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
return    The the total counts of invalided data .This value is between 0 to 12.
FlagStatus ADC_GetFIFOFlagStatus(ADC_Module* ADCx, uint16_t ADC_FIFOFLAG)检查 FIFO 模式下指定的 ADC 标志是否置位。
源码注释
name    ADC_GetFIFOFlagStatus.
fun     Checks whether the specified ADC flag in fifo mode is set or not.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FIFOFLAG :
          - ADC_FIFO_FLAG_RERR
          - ADC_FIFO_FLAG_WERR
          - ADC_FIFO_FLAG_FULL
          - ADC_FIFO_FLAG_EMPTY
          - ADC_FIFO_FLAG_HALF_FULL
          - ADC_FIFO_FLAG_NOT_EMPTY
return    The new state of ADC_FIFOFLAG (SET or RESET).
void ADC_ClearFIFOFlag(ADC_Module* ADCx, uint16_t ADC_FIFO_FLAG)清除指定 ADC 的 FIFO 状态位。
源码注释
name    ADC_ClearFIFOFlag.
fun     Clears FIFO status bit of the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FIFO_FLAG :
          - ADC_FIFO_FLAG_RERR
          - ADC_FIFO_FLAG_WERR
          - ADC_FIFO_FLAG_FULL
          - ADC_FIFO_FLAG_EMPTY
          - ADC_FIFO_FLAG_HALF_FULL
          - ADC_FIFO_FLAG_NOT_EMPTY
return    none.
void ADC_ConfigFIFOWaterLevel(ADC_Module* ADCx, uint32_t FIFO_Level)配置指定 ADC 的 FIFO 水位。
源码注释
name    ADC_ConfigFIFOWaterLevel.
fun     Configures the specified ADC FIFO water level .
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   FIFO_Level : This parameter must be between 1 to 10.
return    none.
void ADC_ConfigFIFOInt(ADC_Module* ADCx, uint16_t ADC_FIFO_IT, FunctionalState Cmd)使能或关闭 FIFO 模式下指定的 ADC 中断。
源码注释
name    ADC_ConfigFIFOInt.
fun     Enables or disables the specified ADC interrupts in FIFO mode.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FIFO_IT :
          - ADC_FIFO_INT_RERR
          - ADC_FIFO_INT_WERR
          - ADC_FIFO_INT_FULL
          - ADC_FIFO_INT_EMPTY
          - ADC_FIFO_INT_HALF_FULL
          - ADC_FIFO_INT_NOT_EMPTY
param   Cmd :
          - ENABLE
          - DISABLE
return    none.
void ADC_ClearFIFOIntPendingBit(ADC_Module* ADCx, uint16_t ADC_FIFO_IT)清除指定 ADC 的 FIFO 中断挂起位。
源码注释
name    ADC_ClearFIFOIntPendingBit.
fun     Clears FIFO interrupt pending bits of the specified ADC.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param   ADC_FIFO_IT :
          - ADC_FIFO_INT_RERR
          - ADC_FIFO_INT_WERR
          - ADC_FIFO_INT_FULL
          - ADC_FIFO_INT_EMPTY
          - ADC_FIFO_INT_HALF_FULL
          - ADC_FIFO_INT_NOT_EMPTY
return    none.
void ADC_ConfigRegularExtLineTrigSource(ADC_Module* ADCx, uint32_t ADC_trigger)为规则通道配置 ADC 外部线触发源。
源码注释
name   ADC_ConfigRegularExtLineTrigSource.
fun    Configurate ADC external line trigger source for regular channel.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param  ADC_trigger :
          specifies the external line trigger source be configured.
          - ADC_TRIG_EXTI_0
          - ADC_TRIG_EXTI_1
          - ADC_TRIG_EXTI_2
          - ADC_TRIG_EXTI_3
          - ADC_TRIG_EXTI_4
          - ADC_TRIG_EXTI_5
          - ADC_TRIG_EXTI_6
          - ADC_TRIG_EXTI_7
          - ADC_TRIG_EXTI_8
          - ADC_TRIG_EXTI_9
          - ADC_TRIG_EXTI_10
          - ADC_TRIG_EXTI_11
          - ADC_TRIG_EXTI_12
          - ADC_TRIG_EXTI_13
          - ADC_TRIG_EXTI_14
          - ADC_TRIG_EXTI_15
return none
void ADC_ConfigInjectedExtLineTrigSource(ADC_Module* ADCx, uint32_t ADC_trigger)为注入通道配置 ADC 外部线触发源。
源码注释
name   ADC_ConfigInjectedExtLineTrigSource.
fun    Configurate ADC external line trigger source for injected channel.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param  ADC_trigger :
          specifies the external line trigger source be configured.
          - ADC_TRIG_EXTI_0
          - ADC_TRIG_EXTI_1
          - ADC_TRIG_EXTI_2
          - ADC_TRIG_EXTI_3
          - ADC_TRIG_EXTI_4
          - ADC_TRIG_EXTI_5
          - ADC_TRIG_EXTI_6
          - ADC_TRIG_EXTI_7
          - ADC_TRIG_EXTI_8
          - ADC_TRIG_EXTI_9
          - ADC_TRIG_EXTI_10
          - ADC_TRIG_EXTI_11
          - ADC_TRIG_EXTI_12
          - ADC_TRIG_EXTI_13
          - ADC_TRIG_EXTI_14
          - ADC_TRIG_EXTI_15
return none
void ADC_ConfigADCPowerSupport(ADC_Module* ADCx, uint32_t ADC_PowerSupportSel)配置 ADC 供电方式,选择外部 MR 或内部 LDO。
源码注释
name   ADC_ConfigADCPowerSupport.
fun    Configurate ADC power support ,select the external MR or internal LDO.
param   ADCx :
          - ADC1
          - ADC2
          - ADC3
param  ADC_PowerSupportSel :
          - ADC_EXTERN_POWER_SUPPORT , select MR power support
          - ADC_INTERN_POWER_SUPPORT , select LDO power support
return none
void ADC_ConfigClk(ADC_CTRL3_CKMOD ADC_ClkMode, uint32_t RCC_ADCHCLKPrescaler)配置 ADCHCLK 预分频。
源码注释
name    ADC_ConfigClk.
fun     Configures the ADCHCLK prescaler.
param   ADC_ClkMode :
         - ADC_CTRL3_CKMOD_AHB
         - ADC_CTRL3_CKMOD_PLL
         - ADC_CTRL3_CKMOD_USBHSPLL
param   RCC_ADCPrescaler : specifies the ADC prescaler.
        When ADC_ClkMode = ADC_CTRL3_CKMOD_AHB: RCC_ADCPrescaler can be on of the following values:
         - RCC_ADCHCLK_DIV1
         - RCC_ADCHCLK_DIV2
         - RCC_ADCHCLK_DIV3
         - RCC_ADCHCLK_DIV4
         - RCC_ADCHCLK_DIV6
         - RCC_ADCHCLK_DIV8
         - RCC_ADCHCLK_DIV10
         - RCC_ADCHCLK_DIV12
         - RCC_ADCHCLK_DIV16
         - RCC_ADCHCLK_DIV32
        When ADC_ClkMode = ADC_CTRL3_CKMOD_PLL or ADC_CTRL3_CKMOD_USBHSPLL: RCC_ADCPrescaler can be on of the following values:
         - RCC_ADCPLLCLK_DIV1
         - RCC_ADCPLLCLK_DIV2
         - RCC_ADCPLLCLK_DIV3
         - RCC_ADCPLLCLK_DIV4
         - RCC_ADCPLLCLK_DIV6
         - RCC_ADCPLLCLK_DIV8
         - RCC_ADCPLLCLK_DIV10
         - RCC_ADCPLLCLK_DIV12
return    none.

5.1.3 Demo 示例说明

本节说明 ADC 的 12 个示例,覆盖 DMA 搬运、FIFO、过采样、温度传感器、差分输入、增益与偏移补偿、单次读取、模拟看门狗、外部线触发与多 ADC 同步等场景。

5.1.3.1 ADC1_DMA DMA 搬运规则转换结果

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC1_DMA/

配置系统与 ADC 时钟并把采样引脚设为模拟输入→初始化 DMA 通道以循环搬运转换结果→初始化 ADC 为独立连续单通道软件触发→等待就绪并完成单端校准→软件启动转换,结果在后台写入变量

项目 源码解读
功能 ADC1 采样并转换 PB1 引脚的模拟电压,转换结果通过 DMA1 通道 1 搬运到变量 ADCConvertedValue。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB1 设为模拟输入。
ADC1 独立模式、连续转换、单通道、软件触发、12 位右对齐,采样时间 13.5 个 ADCCLK。
DMA1 通道 1 循环模式、半字搬运,源地址为 ADC1 数据寄存器,一次搬运一个半字。
系统时钟 HSI+PLL 240 MHz,ADCHCLK 为 AHB 16 分频,ADC1M 计时时钟为 HSI 8 分频。
程序与数据路径 main 依次调用 RCC_Configuration、GPIO_Configuration、DMA_Config、ADC_Initial。
ADC_Initial 配置后等待 ADC_FLAG_RDY,再执行单端校准并等待校准完成。
软件启动一次规则转换后进入空循环,DMA 在后台把结果搬到 ADCConvertedValue。
主要 API ADC_Init、ADC_ConfigRegularChannel、ADC_Enable、ADC_CalibrationOperation、ADC_GetCalibrationStatus、ADC_SetDMATransferMode、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把变量 ADCConvertedValue 加入 watch 窗口。
改变 PB1 引脚电压,转换结果变量同步变化。
使用提示 系统采用 HSE 时钟时 RCC_ConfigAdc1mClk 可选 HSE 或 HSI,采用 HSI 时钟时只能选 HSI。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例用 DMA 在后台搬运 ADC1 的规则转换结果,CPU 只需配置一次即可持续观察 PB1 的电压采样值。

数据路径: PB1 模拟电压 → ADC1 规则通道 1 连续转换 → 数据寄存器 ADC1->DAT → DMA1 通道 1 循环搬运 → 变量 ADCConvertedValue

1. 配置 ADC 为独立连续单通道软件触发。 ADC_Initial 填写 ADC_InitType 后配置规则通道 1,采样引脚为 PB1。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_13_5);

ContinueConvEn = ENABLE 使转换连续进行,ADC_ConfigRegularChannel 把 PB1 对应的通道 9 放在序列秩 1 并设置采样时间。

2. 配置 DMA 通道循环搬运。 DMA_Config 把源地址指向 ADC1 数据寄存器,目标为变量地址,采用循环模式。

src/main.csrc/main.c · DMA_Config
    DMA_DeInit(DMA1_CH1);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)&ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 1;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.MemoryInc      = DMA_MEM_INC_DISABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MEM_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA1_CH1, &DMA_InitStructure);
    
    DMA_RequestRemap(DMA_REMAP_ADC1,DMA1_CH1,ENABLE);

DMA_REMAP_ADC1 把 ADC1 的转换请求映射到 DMA1 通道 1,DMA_MODE_CIRCULAR 使搬运自动重复。

3. 等待就绪并完成校准。 配置完成后必须确认 ADC 就绪再执行单端校准,校准未完成前不应启动转换。

src/main.csrc/main.c · ADC_Initial
    /* Enable ADC1 */
    ADC_Enable(ADC1, ENABLE);
    /*Check ADC Ready*/
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADC1 calibration */
    ADC_CalibrationOperation(ADC1,ADC_CALIBRATION_SINGLE_MODE);
    /* Check the end of ADC1 calibration */
    while (ADC_GetCalibrationStatus(ADC1,ADC_CALIBRATION_SINGLE_MODE))
        ;
    /* Enable ADC1 DMA */
    ADC_SetDMATransferMode(ADC1, ADC_MULTI_REG_DMA_EACH_ADC);

4. 软件启动并观察结果。 main 在配置完成后软件启动一次转换,转换由 DMA 持续搬运。

src/main.csrc/main.c · main
    /* ADC1 configuration -------------------------------------------------------*/
    ADC_Initial();
    
    /* Start ADC1 Software Conversion */
    ADC_EnableSoftwareStartConv(ADC1, ENABLE);

    while (1)
    {
    }

移植时把 PB1 换成目标引脚并更新通道宏,其余 DMA 与校准流程可以原样保留。

对应源码: src/main.c、inc/main.h

5.1.3.2 ADC1_FIFOMode ADC 的 FIFO 模式

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC1_FIFOMode/

配置系统与 ADC 时钟并把采样引脚设为模拟输入→初始化 ADC 并使能 FIFO 与水位→初始化 DMA 通道以突发方式批量搬运→等待就绪并完成单端校准→主循环重复软件触发,FIFO 满后成批写入数组

项目 源码解读
功能 ADC1 在 FIFO 模式下采样 PB1 的模拟电压,水位设为 6,DMA 以突发方式一次搬运 6 个半字到数组 ADCConvertedValue。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config、NVIC_Configuration;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB1 设为模拟输入。
ADC1 独立模式、单次转换、单通道、软件触发、12 位右对齐,FIFO 水位为 6 并使能 FIFO。
DMA1 通道 1 循环模式、突发长度 6、使能 DMA 突发,搬运 60 个半字。
系统时钟 HSI+PLL 240 MHz,ADCHCLK 为 AHB 16 分频。
程序与数据路径 main 依次调用 RCC_Configuration、GPIO_Configuration、NVIC_Configuration、DMA_Config、ADC_Initial,随后软件启动一次转换。
主循环等待 ADC_FLAG_EOC_ANY、清标志并再次软件触发。
每触发 6 次,FIFO 达标,DMA 一次把 6 个结果搬入数组。
主要 API ADC_ConfigFIFOWaterLevel、ADC_EnableFIFO、ADC_SetDMATransferMode、ADC_GetFlagStatus、ADC_ClearFlag、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把数组 ADCConvertedValue[60] 加入 watch 窗口。
单步每软件触发 6 次,数组中新增 6 个 PB1 电压采样值。
使用提示 不要打开调试窗口中的 ADC 外设视图或把 ADCx->DAT 加入 watch 窗口,否则会周期性读取数据影响 FIFO 测试。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例用 ADC 的 FIFO 配合 DMA 突发搬运,把多次单次转换的结果成批写入数组。

数据路径: PB1 模拟电压 → ADC1 单次转换写入 FIFO → FIFO 水位达到 6 → DMA 突发搬运 6 个半字 → 数组 ADCConvertedValue

1. 使能 FIFO 并设置水位。 ADC_Initial 在配置规则通道后使能 FIFO,并把水位设为 6。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_13_5);
    
    /* Config ADC1 FIFO waterlevel = 6 */
    ADC_ConfigFIFOWaterLevel(ADC1,6);
    /* Enable ADC1 FIFO */
    ADC_EnableFIFO(ADC1,ENABLE);

水位为 6 表示 FIFO 中积累 6 个转换结果后触发 DMA 搬运。

2. 配置 DMA 突发搬运。 DMA_Config 使用突发长度 6、使能突发,目标数组长度为 60。

src/main.csrc/main.c · DMA_Config
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = DMA_SIZE;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.MemoryInc      = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MEM_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_InitStructure.BurstLen      = DMA_BURST_LEN_6;
    DMA_InitStructure.BurstMode     = DMA_BURST_MODE_ALMOST;
    DMA_InitStructure.BurstCmd   = DMA_BURST_ENABLE;
    DMA_Init(DMA1_CH1, &DMA_InitStructure);

MemoryInc 使目标地址自增,DMA_BURST_LEN_6 与 FIFO 水位 6 相互对应。

3. 主循环重复触发。 单次转换模式下每次转换完成都需要重新触发。

src/main.csrc/main.c · main
    while (1)
    {
        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC_ANY))
        ADC_ClearFlag(ADC1,ADC_FLAG_EOC_ANY) ;
        ADC_EnableSoftwareStartConv(ADC1, ENABLE);

    }

每次检测到 ADC_FLAG_EOC_ANY 后清除标志并再次软件触发,配合 FIFO 与 DMA 形成批量采集。

对应源码: src/main.c、inc/main.h

5.1.3.3 ADC1_Oversampling ADC 过采样

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC1_Oversampling/

配置系统与 ADC 时钟并把两路采样引脚设为模拟输入→初始化 ADC 为双通道扫描并设置过采样倍数与范围→初始化 DMA 通道循环搬运结果→等待就绪并完成单端校准→软件启动转换,累加后的结果写入数组

项目 源码解读
功能 ADC1 在过采样 x2、无右移的条件下采样 PB0、PB1 的模拟电压,结果经 DMA 写入数组 ADCConvertedValue。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB0、PB1 设为模拟输入。
ADC1 独立模式、连续转换、双通道扫描、软件触发、12 位右对齐。
过采样倍数 x2、右移 0,作用范围为规则通道连续模式。
DMA1 通道 1 循环模式搬运 10 个半字,系统时钟 HSI+PLL 240 MHz。
程序与数据路径 ADC_Initial 先配置通道 8 与通道 9 两条规则通道,再设置过采样倍数与作用范围。
就绪与校准完成后再使能 DMA 搬运。
主循环软件启动一次后进入空循环,数组被循环刷新。
主要 API ADC_ConfigOverSamplingRatioAndShift、ADC_SetOverSamplingScope、ADC_ConfigRegularChannel、ADC_SetDMATransferMode、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把数组 ADCConvertedValue[10] 加入 watch 窗口。
改变 PB0、PB1 电压,结果同步变化,数据寄存器结果约为 Voltage24095/3.3。
使用提示 过采样倍数与右移需配合,不右移时结果值会放大对应倍数,读取端需按倍数换算。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例在规则通道上开启过采样,把每个采样点的多次转换累加后再交给 DMA。

数据路径: PB0、PB1 模拟电压 → ADC1 双通道扫描转换 → 每点过采样 x2 累加 → 数据寄存器 → DMA 搬运 10 个半字 → 数组 ADCConvertedValue

1. 配置两路规则通道并多通道使能。 序列长度为 2,对应 PB0 与 PB1。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 2;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel8 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_08_PB0, 1, ADC_SAMP_TIME_CYCLES_13_5);
    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 2, ADC_SAMP_TIME_CYCLES_13_5);

2. 设置过采样倍数与作用范围。 倍数为 x2、右移为 0,作用范围限定为规则通道连续模式。

src/main.csrc/main.c · ADC_Initial
    /* Enable ADC1 oversamping, x4 and no shift*/
    ADC_ConfigOverSamplingRatioAndShift(ADC1,ADC_OVERSAMPE_RATE_TIMES_2,ADC_OVERSAMPE_DATA_SHIFT_0);
    /* Config ADC1 oversamping, scope */
    ADC_SetOverSamplingScope(ADC1,ADC_OVERSAMPE_REGULAR_CONTINUED);

ADC_OVERSAMPE_REGULAR_CONTINUED 让过采样只作用于规则通道;右移为 0 时累加结果不被压缩。

3. DMA 搬运十点结果。 目标数组长度为 10,源为数据寄存器。

src/main.csrc/main.c · DMA_Config
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 10;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.MemoryInc      = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MEM_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA1_CH1, &DMA_InitStructure);

移植时可改用不同倍数与右移组合,只需同步调整读取端的换算系数。

对应源码: src/main.c、inc/main.h

5.1.3.4 ADC1_TEMP 内部温度传感器

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC1_TEMP/

配置系统与 ADC 时钟并把采样引脚设为模拟输入→初始化 ADC 并配置内部温度传感器通道→使能温度传感器与 DMA 搬运→等待就绪并完成单端校准→主循环读取码值并换算为温度后串口打印

项目 源码解读
功能 ADC1 采样并转换内部温度传感器通道 16 的模拟电压,再换算为温度值并通过串口打印。
源码组成 src/main.c:main、TempratureCalculate、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 采样引脚为 PB1,温度传感器与 Vrefint 使能。
ADC1 独立、连续、软件触发、12 位右对齐,采样时间 601.5 个 ADCCLK。
DMA1 通道 1 循环搬运一个半字,ADCHCLK 为 AHB 10 分频。
串口 PA9 打印,115200 波特率,系统时钟 HSI+PLL 240 MHz。
程序与数据路径 main 配置时钟、日志、DMA 与 ADC,使能温度传感器后软件启动转换。
等待 ADC_FLAG_EOC_ANY 后进入循环。
循环中调用 TempratureCalculate 把 ADCConvertedValue 换算为摄氏度并调用 log_debug 打印。
主要 API ADC_EnableTempSensorVrefint、ADC_ConfigRegularChannel、ADC_SetDMATransferMode、ADC_GetFlagStatus、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把变量 ADCConvertedValue、TempValue 加入 watch 窗口。
把串口工具接到 PA9,全速运行可看到温度接近常温 25 度并实时打印。
使用提示 换算系数来自数据手册,示例取 AVG_SLOPE 为 0.004,芯片校准值从信息区读取。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例用温度传感器作为 ADC 输入,并把原始码值换算为摄氏度后打印。

数据路径: 内部温度传感器 → ADC1 通道 16 → 原始码值 ADCConvertedValue → TempratureCalculate 换算 → 串口打印温度

1. 配置 ADC 与温度传感器通道。 采样通道为通道 16,采样时间取最长一档。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel16 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_16_Temperture_Sensor, 1, ADC_SAMP_TIME_CYCLES_601_5);

2. 使能温度传感器与 DMA 搬运。 温度传感器与 Vrefint 共用使能位,转换结果由 DMA 搬运。

src/main.csrc/main.c · ADC_Initial
    /* Enable Temper Sensor */
    ADC_EnableTempSensorVrefint(ENABLE);
    /* Enable ADC DMA */
    ADC_SetDMATransferMode(ADC1,ADC_MULTI_REG_DMA_EACH_ADC);

3. 换算温度值。 先从信息区读取芯片的传感器校准值,再按数据手册公式换算。

src/main.csrc/main.c · TempratureCalculate
    FLASH_iCacheCmd(FLASH_BANK1,FLASH_iCache_DIS);
    FLASH_iCacheRST(FLASH_BANK1);
    if(*(uint32_t *)0x1FFFC2A0 == 0x53545446)
    {
        /* Get the voltage value , temperature sensor under 3.3V and 25 celsius */
        VTS_value = (uint16_t)(*(uint32_t *)0x1FFFC710>>16);
        T_value = (uint16_t)(*(uint32_t *)0x1FFFC718);
    }
    else
    {
        Get_NVR(0x1FFFC130, (u8*)NVR_VTS, 8);
        VTS_value = (uint16_t)(NVR_VTS[0]>>16);
        T_value = 3000;
    }

    FLASH_iCacheCmd(FLASH_BANK1,FLASH_iCache_EN);
    /* Voltage value of temperature sensor */
    tempValue=TempAdVal*(3.3/4095);
    /* Get the temperature inside the chip */
    Temperate=(VTS_value-(tempValue*1000))/(AVG_SLOPE*1000)+T_value/100-1.25f;

4. 主循环打印温度。 每次换算后更新 TempValue 并打印,间隔 1 毫秒。

src/main.csrc/main.c · main
    while (1)
    {
        TempValue = TempratureCalculate(ADCConvertedValue);

        log_debug("\r\n Temperature = %.1f C\r\n",TempValue);
        
        systick_delay_ms(1);
    }

移植到其他芯片时,须同步替换信息区地址与 AVG_SLOPE 系数。

对应源码: src/main.c、inc/main.h

5.1.3.5 ADC_DifferentialMode ADC 差分模式

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC_DifferentialMode/

配置系统与 ADC 时钟并把差分引脚设为模拟输入→配置规则通道并把通道设为差分输入→等待就绪并完成差分校准→软件启动转换→主循环读取结果并换算两脚电压差

项目 源码解读
功能 ADC1 以差分模式转换 PA1、PA2 上的外部电压差,并在主循环中换算为 Vinp 减 Vinn 的电压值。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PA1、PA2 设为模拟输入。
ADC1 独立、连续转换、单通道、软件触发、12 位右对齐,采样时间 55.5 个 ADCCLK。
通道 1 配置为差分输入,并执行差分校准。
系统时钟 HSI+PLL 240 MHz,ADCHCLK 为 AHB 16 分频。
程序与数据路径 ADC_Initial 配置通道 1 为差分输入,等待就绪后执行差分校准。
主循环检测 ADC_FLAG_ENDC,清标志后读取结果。
结果按差分公式换算为电压差并存入 VINP_VINN_Value。
主要 API ADC_SetChannelSingleDiff、ADC_CalibrationOperation、ADC_GetFlagStatus、ADC_ClearFlag、ADC_GetDat、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把变量 ADCTempValue、VINP_VINN_Value 加入 watch 窗口。
把 PA1、PA2 接入外部电源,电压范围在 -3.3V 到 3.3V,改变电压时电压差变量同步变化。
使用提示 差分校准需与单端校准区分,差分输入必须用 ADC_CALIBRATION_DIFF_MODE。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例把一个通道配置为差分输入,并对结果做 12 位到电压差的换算。

数据路径: PA1、PA2 外部电压差 → ADC1 通道 1 差分转换 → 数据寄存器 → ADC_GetDat → 换算为 VINP_VINN_Value

1. 配置通道为差分输入。 单一通道,采样时间 55.5,随后把通道 1 设为差分。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_ConfigRegularChannel(ADC1, ADC_CH_1, 1, ADC_SAMP_TIME_CYCLES_55_5);

    /* Enable ADC1 channel 1 work on differential mode. */
    ADC_SetChannelSingleDiff(ADC1,ADC_CH_1,ADC_DIFFERENTIAL_ENDED);

ADC_DIFFERENTIAL_ENDED 让该通道以差分方式采样,正负端分别对应 PA1 与 PA2。

2. 执行差分校准。 差分模式的校准类型与单端不同。

src/main.csrc/main.c · ADC_Initial
    /* Start ADC1 differential calibration */
    ADC_CalibrationOperation(ADC1,ADC_CALIBRATION_DIFF_MODE);
    /* Check the end of ADC1 calibration */
    while (ADC_GetCalibrationStatus(ADC1,ADC_CALIBRATION_DIFF_MODE))
        ;

3. 读取结果并换算电压差。 主循环等待转换结束后读取数据寄存器并换算。

src/main.csrc/main.c · main
    while (1)
    {
        if(ADC_GetFlagStatus(ADC1,ADC_FLAG_ENDC) == SET)
        {
            ADC_ClearFlag(ADC1,ADC_FLAG_ENDC);
            ADCTempValue = ADC_GetDat(ADC1);
            /* Calcalate (Vinp - Vinn ) Value*/
            VINP_VINN_Value = (float)(((float)(ADCTempValue *2.0f /4095) - 1.0f) *3.3f);
        }
    }

换算把码值映射为 -3.3V 到 3.3V 的电压差;移植时按实际参考电压调整系数即可。

对应源码: src/main.c、inc/main.h

5.1.3.6 ADC_Gain_Offset ADC 增益与偏移

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC_Gain_Offset/

配置系统与 ADC 时钟并把采样引脚设为模拟输入→初始化 ADC 并配置规则通道→设置偏移寄存器与增益补偿系数→使能 DMA 并完成单端校准→软件启动转换,补偿后的结果写入变量

项目 源码解读
功能 ADC1 在开启增益补偿与偏移补偿的条件下采样 PB1 的模拟电压,结果经 DMA 写入变量 ADCConvertedValue。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB1 设为模拟输入。
ADC1 独立、连续、单通道、软件触发、12 位右对齐。
偏移寄存器 1 设置正向偏移 0x400 并使能饱和,增益补偿系数为 8192。
DMA1 通道 1 循环搬运一个半字,系统时钟 HSI+PLL 240 MHz。
程序与数据路径 ADC_Initial 配置规则通道后填写偏移结构体并设置增益补偿。
随后使能 DMA、等待就绪并完成单端校准。
软件启动一次转换后进入空循环,DMA 持续搬运补偿后的结果。
主要 API ADC_SetOffsetConfig、ADC_SetGainCompensation、ADC_ConfigRegularChannel、ADC_SetDMATransferMode、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把变量 ADCConvertedValue 加入 watch 窗口。
改变 PB1 电压,结果约为 Voltage24095/3.3 加 0x400。
使用提示 增益补偿系数为倍数乘以 4096,偏移数据须小于 0xfff。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例演示如何通过偏移与增益补偿对转换结果做线性变换。

数据路径: PB1 模拟电压 → ADC1 规则通道 9 转换 → 增益补偿与偏移叠加 → 数据寄存器 → DMA 搬运 → 变量 ADCConvertedValue

1. 配置 ADC 与规则通道。 单通道单次触发,采样引脚为 PB1。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_13_5);

2. 设置偏移与增益补偿。 偏移寄存器 1 设为正向 0x400 并开启饱和,增益系数为 8192。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 channel offset compensation configuration*/
    ADC_OffsetStructure.OffsetChannel   = ADC1_Channel_09_PB1;
    ADC_OffsetStructure.OffsetData      = OFFSET_VALUE;
    ADC_OffsetStructure.OffsetDirPositiveEn = ENABLE;
    ADC_OffsetStructure.OffsetSatenEn   = ENABLE;
    ADC_OffsetStructure.OffsetEn        = ENABLE;
    ADC_SetOffsetConfig(ADC1,ADC_REGESTER_OFFSET_1,&ADC_OffsetStructure);
    /* Config ADC1 gain compensation factor */
    ADC_SetGainCompensation(ADC1,GAIN_FACTOR);

偏移与增益的常量在文件开头定义,GAIN_FACTOR 为 4096 乘以倍数,OFFSET_VALUE 为 0x400。

src/main.csrc/main.c
#define GAIN_FACTOR             (4096*2)

#define OFFSET_VALUE            (0x400)

3. DMA 搬运补偿后的结果。 目标为变量地址,循环模式持续刷新。

src/main.csrc/main.c · DMA_Config
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)&ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 1;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.MemoryInc      = DMA_MEM_INC_DISABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MEM_DATA_WIDTH_HALFWORD;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA1_CH1, &DMA_InitStructure);

移植时按需要的线性关系调整 GAIN_FACTOR 与 OFFSET_VALUE 即可。

对应源码: src/main.c、inc/main.h

5.1.3.7 ADC_SingleRead ADC 单次读取

工程目录: projects/n32h49x_EVAL/examples/ADC/ADC_SingleRead/

配置系统与 ADC 时钟并把两路采样引脚设为模拟输入→初始化 ADC 为单次转换单通道→等待就绪并完成单端校准→每读取一路前重配通道并软件触发→等待转换结束后读取码值存入数组

项目 源码解读
功能 ADC1 以软件触发一次、采集一次的方式轮流采样 PA0、PA1 的模拟电压并存入数组。
源码组成 src/main.c:main、ADC_Initial、ADC_GetData、RCC_Configuration、GPIO_Configuration;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PA0、PA1 设为模拟输入。
ADC1 独立、单次转换、单通道、软件触发、12 位右对齐。
每次采集时临时设置采样时间为 239.5 个 ADCCLK,不使用 DMA 与中断。
系统时钟 HSI+PLL 240 MHz。
程序与数据路径 ADC_Initial 只做就绪确认与单端校准。
主循环调用 ADC_GetData 依次对通道 0 与通道 1 触发转换。
函数内等待 ADC_FLAG_ENDC 后清标志并读值,结果存入 ADC1ConvertedValue。
主要 API ADC_ConfigRegularChannel、ADC_EnableSoftwareStartConv、ADC_GetFlagStatus、ADC_ClearFlag、ADC_GetDat
验证方法 编译后进入调试模式,把数组 ADC1ConvertedValue 加入 watch 窗口。
改变 PA0、PA1 的电压,数组元素同步变化。
使用提示 每次读取前都会重配规则通道并清除 ENDC 与 STR 标志,适合引脚少、按需采集的场景。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例不依赖 DMA 与中断,用一个读取函数按需切换通道并采集。

数据路径: 目标通道模拟电压 → ADC_GetData 重配通道并触发 → 等待 ENDC → ADC_GetDat → 数组 ADC1ConvertedValue

1. 配置 ADC 为单次转换。 不使能连续转换,每次采集都需要软件触发。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADCx, &ADC_InitStructure);

2. 等待就绪并完成单端校准。 校准流程与其它示例一致,参数用传入的 ADC 实例。

src/main.csrc/main.c · ADC_Initial
    /* Enable ADCx */
    ADC_Enable(ADCx, ENABLE);
    /*Check ADC Ready*/
    while(ADC_GetFlagStatus(ADCx,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADCx calibration */
    ADC_CalibrationOperation(ADCx,ADC_CALIBRATION_SINGLE_MODE);
    /* Check the end of ADCx calibration */
    while (ADC_GetCalibrationStatus(ADCx,ADC_CALIBRATION_SINGLE_MODE))
        ;

3. 单次采集函数。 每次调用先重配通道,再软件触发并等待转换结束。

src/main.csrc/main.c · ADC_GetData
    ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_CYCLES_239_5);
    /* Start ADC Software Conversion */
    ADC_EnableSoftwareStartConv(ADCx, ENABLE);
    while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0){
    }
    ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
    ADC_ClearFlag(ADCx, ADC_FLAG_STR);
    dat=ADC_GetDat(ADCx);
    return dat;

读取前后清除 ENDC 与 STR 标志,保证下一次触发从干净状态开始。

4. 主循环轮流采集两路。 依次读取通道 0 与通道 1,结果写入数组。

src/main.csrc/main.c · main
    while (1)
    {
        ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_00_PA0);
        ADC1ConvertedValue[1]=ADC_GetData(ADC1,ADC1_Channel_01_PA1);
        
    }

移植时只需扩展数组下标与通道宏,即可采集更多引脚。

对应源码: src/main.c、inc/main.h

5.1.3.8 AnalogWDG_SimComp 用模拟看门狗模拟比较器

工程目录: projects/n32h49x_EVAL/examples/ADC/AnalogWDG_SimComp/

配置系统与 ADC 时钟并把两路输入设为模拟输入、两路输出设为推挽→初始化 ADC 为多通道并配置两组看门狗阈值→使能看门狗中断并软件启动转换→越限进入中断后按迟滞方向更新阈值→翻转对应输出引脚,循环检测

项目 源码解读
功能 用模拟看门狗 1 与看门狗 2 的阈值切换模拟比较器的迟滞与电平检测,输入越限时翻转 PB2 或 PB3。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
src/n32h49x_it.c:ADC1_2_IRQHandler 中断服务函数;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB0、PB1 设为模拟输入,PB2、PB3 设为推挽输出。
ADC1 独立、多通道、软件触发、12 位右对齐。
看门狗 1 监控通道 PB1、看门狗 2 监控通道 PB0,阈值初值高端 0x060F、低端 0。
使能 AWD1 与 AWD2 中断,NVIC 优先级分组 2。
程序与数据路径 ADC_Initial 配置两路通道、两组看门狗阈值与中断后软件启动连续转换。
中断中根据当前阈值判断迟滞方向,更新阈值并翻转对应引脚。
主循环仅累加计数变量。
主要 API ADC_ConfigAnalogWatchdogThresholds、ADC_ConfigAnalogWatchdog1SingleChannel、ADC_ConfigAnalogWatchdog1WorkChannelType、ADC_SetAnalogWatchdog23MonitChannels、ADC_SetAnalogWatchdog23IntConfig、ADC_ConfigInt
验证方法 编译下载后全速运行。
当 PB0 输入超过约 1.22V 时 PB2 翻转一次,PB1 输入超过约 1.22V 时 PB3 翻转一次。
使用提示 阈值需在中断里随翻转动态更新才能形成迟滞。
示例基于评估板 N32H497VEL7_STB V1.0,开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例通过在两档阈值之间来回切换,用模拟看门狗实现比较器的迟滞与电平检测。

数据路径: PB0、PB1 模拟电压 → ADC1 连续转换 → 看门狗阈值比较 → 越限触发 AWD1/AWD2 中断 → 更新阈值并翻转 PB2 或 PB3

1. 配置双通道与看门狗阈值。 序列长度为 2,两组看门狗分别监控 PB1 与 PB0。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 2;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_61_5);
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_08_PB0, 2, ADC_SAMP_TIME_CYCLES_61_5);

2. 配置监控通道与中断。 看门狗 1 用单通道接口,看门狗 2 用位掩码接口选择通道。

src/main.csrc/main.c · ADC_Initial
    /* Configure ADC_AWDG1 and ADC_AWDG2 high and low analog watchdog thresholds */
    ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG1, 0x060F, 0);
    ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG2, 0x060F, 0);
    /* Configure channelas the single analog watchdog1 guarded channel */
    ADC_ConfigAnalogWatchdog1SingleChannel(ADC1, ADC1_Channel_09_PB1);

    /* Enable analog watchdog 1 on one regular channel */
    ADC_ConfigAnalogWatchdog1WorkChannelType(ADC1, ADC_ANALOG_WTDG_SINGLEREG_ENABLE);
    /* Enable AWD1 interrupt ADC1*/
    ADC_ConfigInt(ADC1, ADC_INT_AWD1, ENABLE);

    ADC_SetAnalogWatchdog23MonitChannels(ADC1,ADC_AWDG2_EN_OFFSET,(1<<ADC1_Channel_08_PB0));
    ADC_SetAnalogWatchdog23IntConfig(ADC1,ADC_AWDG2_INTEN_OFFSET,(1<<ADC1_Channel_08_PB0));

3. 中断中更新阈值并翻转输出。 读取当前阈值决定迟滞方向,切换阈值后翻转对应引脚。

src/n32h49x_it.csrc/n32h49x_it.c · ADC1_2_IRQHandler
    if(ADC_GetIntStatus(ADC1,ADC_INT_AWD1) != RESET)
    {      
        if((ADC1->WDG1HIGH & 0x0FFF) != 0x0FFF)
          ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG1, 0x0FFF, 0x05EB);
        else
          ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG1, 0x060F, 0);
        
        GPIOB->POD ^= GPIO_PIN_2;
        
        /* Clear ADC1 AWD1 pending interrupt bit */
        ADC_ClearIntPendingBit(ADC1, ADC_INT_AWD1);
    }

阈值在 0x060F 与 0x0FFF 之间切换形成约 1.22V 的高端回差,移植时按目标电平调整这两个常量。

对应源码: src/main.c、src/n32h49x_it.c、inc/main.h

5.1.3.9 AnalogWatchdog ADC 模拟看门狗

工程目录: projects/n32h49x_EVAL/examples/ADC/AnalogWatchdog/

配置系统与 ADC 时钟并把采样引脚设为模拟输入→初始化 ADC 并配置两组看门狗阈值→使能看门狗通道监控与中断→等待就绪并完成校准后软件启动转换→越限进入中断,清标志并累加计数

项目 源码解读
功能 ADC1 连续转换 PB1 的模拟电压,越出模拟看门狗 1 或看门狗 2 的阈值范围时进入中断并累加计数。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
src/n32h49x_it.c:ADC1_2_IRQHandler 中断服务函数;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB1 设为模拟输入。
ADC1 独立、连续、单通道、软件触发、12 位右对齐,采样时间 61.5 个 ADCCLK。
看门狗 1 阈值高端 0x0B00、低端 0x0300,看门狗 2 阈值高端 0x0800、低端 0x0400。
看门狗 1 监控单通道,看门狗 2 监控通道 PB1,均使能中断。
程序与数据路径 ADC_Initial 配置看门狗阈值与中断后软件启动连续转换。
中断中分别判断 AWD1 与 AWD2 的来源,清除标志并累加 gCntAwdg。
主循环仅累加计数变量。
主要 API ADC_ConfigAnalogWatchdogThresholds、ADC_ConfigAnalogWatchdog1SingleChannel、ADC_ConfigAnalogWatchdog1WorkChannelType、ADC_SetAnalogWatchdog23MonitChannels、ADC_SetAnalogWatchdog23IntConfig、ADC_ConfigInt
验证方法 编译后进入调试模式,把变量 gCntAwdg 加入 watch 窗口。
改变 PB1 电压,越出任一看门狗阈值范围时发生一次中断,变量累加。
使用提示 看门狗 2 的状态标志通过 ADC_GetAnalogWatchdog23StatusFlag 判断、ADC_ClearAnalogWatchdog23StatusFlag 清除。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例用两组模拟看门狗监控同一通道,越限时进入中断做计数。

数据路径: PB1 模拟电压 → ADC1 连续转换 → 看门狗 1 与看门狗 2 阈值比较 → 越限触发中断 → 清标志并累加 gCntAwdg

1. 配置通道与看门狗阈值。 看门狗 1 与看门狗 2 使用不同的阈值窗口。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 regular channel12 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_61_5);
    /* Configure ADC_AWDG1 and ADC_AWDG2 high and low analog watchdog thresholds */
    ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG1, 0x0B00, 0x0300);
    ADC_ConfigAnalogWatchdogThresholds(ADC1,ADC_AWDG2, 0x0800, 0x0400);
    /* Configure channel12 as the single analog watchdog1 guarded channel */
    ADC_ConfigAnalogWatchdog1SingleChannel(ADC1, ADC1_Channel_09_PB1);

2. 使能看门狗监控与中断。 看门狗 1 监控规则单通道,看门狗 2 用位掩码选择通道。

src/main.csrc/main.c · ADC_Initial
    /* Enable analog watchdog 1 on one regular channel */
    ADC_ConfigAnalogWatchdog1WorkChannelType(ADC1, ADC_ANALOG_WTDG_SINGLEREG_ENABLE);
    /* Enable AWD1 interrupt */
    ADC_ConfigInt(ADC1, ADC_INT_AWD1, ENABLE);
    
    /* Enable analog watchdog 2  */
    ADC_SetAnalogWatchdog23MonitChannels(ADC1,ADC_AWDG2_EN_OFFSET,(1<<ADC1_Channel_09_PB1));
    ADC_SetAnalogWatchdog23IntConfig(ADC1,ADC_AWDG2_INTEN_OFFSET,(1<<ADC1_Channel_09_PB1));

3. 中断中清标志并累加。 两个看门狗分别判断来源,各自清除后累加同一计数变量。

src/n32h49x_it.csrc/n32h49x_it.c · ADC1_2_IRQHandler
    if(ADC_GetIntStatus(ADC1,ADC_INT_AWD1) != RESET)
    {
        /* Clear ADC1 AWD1 pending interrupt bit */
        ADC_ClearIntPendingBit(ADC1, ADC_INT_AWD1);
        gCntAwdg++;
    }
    else
    {
        /*no process */
    }
    
    if((ADC_GetAnalogWatchdog23IntConfig(ADC1,ADC_AWDG2_EN_OFFSET)&(1<<9)) != 0)
    {
        /* Clear ADC1 AWD2 pending interrupt bit */
        ADC_ClearAnalogWatchdog23StatusFlag(ADC1,ADC_AWDG2_STS_OFFSET,(1<<9));
        gCntAwdg++;
    }

移植时可把 gCntAwdg 换成实际的处理动作,阈值按目标电压范围重新标定。

对应源码: src/main.c、src/n32h49x_it.c、inc/main.h

5.1.3.10 ExtLinesTrigger 外部线触发

工程目录: projects/n32h49x_EVAL/examples/ADC/ExtLinesTrigger/

配置系统与 ADC 时钟并把采样引脚设为模拟输入、触发引脚设为输入→初始化 ADC 的规则与注入通道→把两路外部线分别配为事件上升沿并映射到引脚→规则结果经 DMA 搬运、注入结果经中断搬运→外部上升沿到达时触发对应通道采样

项目 源码解读
功能 ADC1 规则通道由 EXTI10 触发采样 PA1、PB1,注入通道由 EXTI11 触发采样 PC0、PC1,规则结果走 DMA、注入结果走中断。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、EXTI_Configuration、DMA_Config、NVIC_Configuration;
src/n32h49x_it.c:ADC1_2_IRQHandler 中断服务函数;
inc/main.h:触发线与触发器宏、函数声明;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PA1、PB1、PC0、PC1 设为模拟输入,PC10、PC11 设为输入下拉。
规则通道独立、扫描间断模式、外部线触发、12 位右对齐,间断通道数为 1。
注入序列长度 2、外部线触发,注入通道为 PC0、PC1。
EXTI10 与 EXTI11 均配置为事件模式、上升沿,DMA1 通道 1 循环搬运 64 个半字。
程序与数据路径 main 先配置时钟、NVIC、GPIO、EXTI 与 DMA,再配置 ADC。
PC10 上升沿触发规则通道采样并经 DMA 写入规则数组。
PC11 上升沿触发注入通道采样,注入结束中断把结果写入注入数组。
主要 API ADC_ConfigDiscModeChannelCount、ADC_EnableDiscMode、ADC_ConfigInjectedChannel、ADC_ConfigExternalTrigInjectedConv、ADC_ConfigRegularExtLineTrigSource、ADC_ConfigInjectedExtLineTrigSource
验证方法 编译后进入调试模式,把数组 ADC_RegularConvertedValueTab[64]、ADC_InjectedConvertedValueTab[32] 加入 watch 窗口。
给 PC10 上升沿触发规则采样,给 PC11 上升沿触发注入采样。
使用提示 规则与注入分别绑定不同的 EXTI 线,须先在 AFIO 中把引脚映射到 EXTI 线。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例把规则与注入通道分别绑定到两条外部线,由外部上升沿驱动采样。

数据路径: PC10 上升沿 → EXTI10 触发规则通道扫描 → DMA 写入规则数组;PC11 上升沿 → EXTI11 触发注入通道 → 注入结束中断写入注入数组

1. 配置规则与注入通道。 规则序列 2 个通道、注入序列 2 个通道,触发都来自外部线。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_EXT_INT0_15;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 2;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel1 9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_01_PA1, 1, ADC_SAMP_TIME_CYCLES_239_5);
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 2, ADC_SAMP_TIME_CYCLES_239_5);

2. 配置间断模式与注入通道。 规则通道使用扫描间断,注入通道配置外部触发。

src/main.csrc/main.c · ADC_Initial
    /* Regular discontinuous mode channel number configuration */
    ADC_ConfigDiscModeChannelCount(ADC1, 1);
    /* Enable regular discontinuous mode */
    ADC_EnableDiscMode(ADC1, ENABLE);
    
    /* Set injected sequencer length */
    ADC_ConfigInjectedSequencerLength(ADC1, 2);
    /* ADC1 injected channel configuration */
    ADC_ConfigInjectedChannel(ADC1, ADC1_Channel_10_PC0, 1, ADC_SAMP_TIME_CYCLES_239_5);
    ADC_ConfigInjectedChannel(ADC1, ADC1_Channel_11_PC1, 2, ADC_SAMP_TIME_CYCLES_239_5);
    /* ADC1 injected external trigger configuration */
    ADC_ConfigExternalTrigInjectedConv(ADC1, ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15);

3. 指定两路外部线来源。 规则与注入分别选择 EXTI10 与 EXTI11。

src/main.csrc/main.c · ADC_Initial
    ADC_ConfigRegularExtLineTrigSource(ADC1,Regular_ExtLine_TrigSource);
    ADC_ConfigInjectedExtLineTrigSource(ADC1,Injected_ExtLine_TrigSource);

4. 配置外部线为事件上升沿。 通过 GPIO_ConfigEXTILine 把引脚映射到 EXTI 线。

src/main.csrc/main.c · EXTI_Configuration
    EXTI_InitStruct(&EXTI_InitStructure) ;
    GPIO_ConfigEXTILine(REG_EXTI_LineSOURCE,REG_EXTI_PortSOURCE, REG_EXTI_PinSOURCE);
    /* EXTI line11 configuration -----------------------------------------------*/
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Event;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_Line    = REG_EXTI_LINE;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

5. 中断中读取注入结果。 注入转换结束中断把通道 1、通道 2 的结果写入注入数组。

src/n32h49x_it.csrc/n32h49x_it.c · ADC1_2_IRQHandler
    if(ADC_GetIntStatus(ADC1,ADC_INT_JENDC) != RESET)
    {
        /* Clear ADC1 JEOC pending interrupt bit */
        ADC_ClearIntPendingBit(ADC1, ADC_INT_JENDC);

        /* Get injected channel1 and channel2 converted value */
        ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionDat(ADC1, ADC_INJECT_DATA_OFFSET_1);
        ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionDat(ADC1, ADC_INJECT_DATA_OFFSET_2);

移植时更换 Regular_ExtLine_TrigSource 与 Injected_ExtLine_TrigSource 宏即可改用其它 EXTI 线。

对应源码: src/main.c、src/n32h49x_it.c、inc/main.h

5.1.3.11 RegSimul_DualMode 双 ADC 规则同步

工程目录: projects/n32h49x_EVAL/examples/ADC/RegSimul_DualMode/

配置系统与 ADC 时钟并把四路采样引脚设为模拟输入→把主从 ADC 都初始化为规则同步模式→初始化 DMA 通道以字为单位搬运同步结果→分别使能并校准主从 ADC→软件启动主 ADC,等待 DMA 搬满 16 次

项目 源码解读
功能 ADC1 与 ADC2 规则通道同步采样,ADC1 采样 PB0、PB1,ADC2 采样 PC0、PC1,同步结果经 DMA 写入数组。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PB0、PB1、PC0、PC1 设为模拟输入。
ADC1、ADC2 均配置为双 ADC 规则同步模式、连续扫描、软件触发、12 位右对齐。
DMA 以字搬运 16 个字,DMA 模式为限流 12 位。
主从 ADC 的 DMA 请求都由 ADC1 的通道承载,系统时钟 HSI+PLL 240 MHz。
程序与数据路径 main 配置时钟、GPIO、DMA 后调用 ADC_Initial。
ADC_Initial 依次初始化 ADC1、ADC2 并分别校准,使能 DMA 搬运。
软件启动 ADC1 转换后等待 DMA 传输完成标志。
主要 API ADC_Init、ADC_ConfigRegularChannel、ADC_CalibrationOperation、ADC_SetDMATransferMode、ADC_EnableSoftwareStartConv
验证方法 编译后进入调试模式,把数组 ADC_DualConvertedValueTab[16] 加入 watch 窗口。
全速运行前给 PB0、PB1、PC0、PC1 确定电压,运行后转换 16 次结果写入数组。
使用提示 转换虽连续,但 DMA 仅存储前 16 次数据。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例演示双 ADC 规则同步模式:主从 ADC 在同一时刻采样,结果合成一个字由 DMA 搬运。

数据路径: PB0、PB1 与 PC0、PC1 模拟电压 → ADC1、ADC2 规则同步转换 → 同步结果字 → DMA 搬运 16 次 → 数组 ADC_DualConvertedValueTab

1. 配置主 ADC 为规则同步模式。 主从 ADC 的工作模式必须一致。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_DUAL_REG_SIMULT;
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 2;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel1 and channel12 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_08_PB0, 1, ADC_SAMP_TIME_CYCLES_601_5);
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_09_PB1, 2, ADC_SAMP_TIME_CYCLES_601_5);

2. 配置从 ADC。 ADC2 采用同样的模式并配置自己的两路通道。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_DUAL_REG_SIMULT;
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_SOFTWARE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 2;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC2, &ADC_InitStructure);
    /* ADC2 regular channel10 and channel1 configuration */
    ADC_ConfigRegularChannel(ADC2, ADC2_Channel_10_PC0, 1, ADC_SAMP_TIME_CYCLES_601_5);
    ADC_ConfigRegularChannel(ADC2, ADC2_Channel_11_PC1, 2, ADC_SAMP_TIME_CYCLES_601_5);

3. 配置 DMA 以字搬运同步结果。 数据宽度为字,正常模式搬运 16 次。

src/main.csrc/main.c · DMA_Config
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)ADC_DualConvertedValueTab;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 16;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.MemoryInc      = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_WORD;
    DMA_InitStructure.MemDataSize    = DMA_MEM_DATA_WIDTH_WORD;
    DMA_InitStructure.CircularMode   = DMA_MODE_NORMAL;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA1_CH1, &DMA_InitStructure);

4. 启动转换并等待搬运完成。 只需对主 ADC 软件触发,从 ADC 随主 ADC 同步。

src/main.csrc/main.c · main
    /* Start ADC1 Software Conversion */
    ADC_EnableSoftwareStartConv(ADC1, ENABLE);
    /* Test on DMA1 channel1 transfer complete flag */
    while (!DMA_GetFlagStatus(DMA_FLAG_TC1, DMA1))
        ;
    /* Clear DMA1 channel1 transfer complete flag */
    DMA_ClearFlag(DMA_FLAG_TC1, DMA1);

移植时注意从 ADC 的转换结果由主 ADC 的数据寄存器统一读出,无需单独读取。

对应源码: src/main.c、inc/main.h

5.1.3.12 TIMTrigger_AutoInjection 定时器触发与自动注入

工程目录: projects/n32h49x_EVAL/examples/ADC/TIMTrigger_AutoInjection/

配置系统与 ADC 时钟并把采样引脚设为模拟输入、PC6 设为输出→初始化 ADC 的规则与注入通道并使能自动注入→配置 GTIM1 的 CC4 作为触发源→使能注入中断与 DMA 并启动定时器→每个 CC4 事件采样一次规则与注入通道,注入中断翻转输出

项目 源码解读
功能 GTIM1 的 CC4 事件触发 ADC1 规则采样 PA1,规则转换结束后自动注入采样 PB1,注入结果经中断写入数组并翻转 PC6。
源码组成 src/main.c:main、ADC_Initial、RCC_Configuration、GPIO_Configuration、TIM_Configuration、DMA_Config、NVIC_Configuration;
src/n32h49x_it.c:ADC1_2_IRQHandler 中断服务函数;
inc/main.h:函数声明与头文件包含;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PA1、PB1 设为模拟输入,PC6 设为推挽输出,PA3 复用为 GTIM1 CH4 输出。
ADC1 独立、单通道、GTIM1 CC4 触发、12 位右对齐,自动注入使能。
注入序列长度 1、注入通道为 PB1。
DMA1 通道 1 循环搬运 32 个半字规则结果,GTIM1 周期 1600、PWM1 模式。
程序与数据路径 main 依次配置时钟、NVIC、GPIO、TIM、DMA、ADC 后使能 GTIM1。
每个 CC4 事件触发一次规则转换,规则完成后自动注入。
注入结束中断读值并翻转 PC6。
主要 API ADC_EnableAutoInjectedConv、ADC_ConfigInjectedChannel、ADC_ConfigInt、ADC_GetInjectedConversionDat、ADC_SetDMATransferMode
验证方法 编译后进入调试模式,把数组 ADC_RegularConvertedValueTab[32]、ADC_InjectedConvertedValueTab[32] 加入 watch 窗口。
改变 PA1、PB1 电压,每个 CC4 事件转换一次,同时可在 PA3 看到 PWM 波形。
使用提示 自动注入与间断模式不能同时使用,本示例未启用间断模式。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1,硬件为全功能板 N32H497ZGL7_EVB V1.0。
核心代码解读与移植

示例用定时器的比较事件驱动规则转换,并让规则转换结束后自动注入一路通道。

数据路径: GTIM1 CC4 事件 → ADC1 规则采样 PA1 → 规则结束自动注入 PB1 → 注入结束中断读值 → 写入注入数组并翻转 PC6

1. 配置规则通道、注入通道与自动注入。 规则通道用 GTIM1 CC4 触发,注入序列长度 1。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_GTIM1_CC4;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_InitStructure.Resolution     = ADC_DATA_RES_12BIT;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel1 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_01_PA1, 1, ADC_SAMP_TIME_CYCLES_13_5);
    /* Set injected sequencer length */
    ADC_ConfigInjectedSequencerLength(ADC1, 1);
    /* ADC1 injected channel9 configuration */
    ADC_ConfigInjectedChannel(ADC1, ADC1_Channel_09_PB1, 1, ADC_SAMP_TIME_CYCLES_13_5);
    /* Enable automatic injected conversion start after regular one */
    ADC_EnableAutoInjectedConv(ADC1, ENABLE);

2. 使能注入中断与 DMA 搬运。 注入结束中断用于读值,规则结果由 DMA 搬运。

src/main.csrc/main.c · ADC_Initial
    /* Enable JEOC interrupt */
    ADC_ConfigInt(ADC1, ADC_INT_JENDC, ENABLE);
    
    /* Enable ADC1 */
    ADC_Enable(ADC1, ENABLE);
    /*Check ADC Ready*/
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADC1 calibration */
    ADC_CalibrationOperation(ADC1,ADC_CALIBRATION_SINGLE_MODE);
    /* Check the end of ADC1 calibration */
    while (ADC_GetCalibrationStatus(ADC1,ADC_CALIBRATION_SINGLE_MODE))
        ;
    /* Enable ADC1 DMA */
    ADC_SetDMATransferMode(ADC1, ADC_MULTI_REG_DMA_EACH_ADC);

3. 配置 GTIM1 提供 CC4 触发。 时基周期为 1600,CH4 使用 PWM1 模式产生触发事件。

src/main.csrc/main.c · TIM_Configuration
    PrescalerValue = (uint32_t)(SystemCoreClock / 16000000) - 1;
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period    = 1600;
    TIM_TimeBaseStructure.Prescaler = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv    = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_InitTimeBase(GTIM1, &TIM_TimeBaseStructure);

4. 注入中断读值并翻转输出。 中断读取注入结果,同时翻转 PC6 便于示波器观察。

src/n32h49x_it.csrc/n32h49x_it.c · ADC1_2_IRQHandler
void ADC1_2_IRQHandler(void)
{
    GPIO_SetBits(GPIOC, GPIO_PIN_6);
    if(ADC_GetIntStatus(ADC1,ADC_INT_JENDC) != RESET)
    {
        /* Clear ADC1 JEOC pending interrupt bit */
        ADC_ClearIntPendingBit(ADC1, ADC_INT_JENDC);

        /* Get injected channel1 converted value */
        ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionDat(ADC1, ADC_INJECT_DATA_OFFSET_1);
        /* Reset PC.06 pin */
        GPIO_ResetBits(GPIOC, GPIO_PIN_6);
        if (Index == 32)
        {
            Index = 0;
        }
    }
}

移植时把触发源改为其它定时器比较通道,并相应调整 ADC 的外部触发宏即可。

对应源码: src/main.c、src/n32h49x_it.c、inc/main.h

5.1.4 注意与排障

场景 检查与建议 来源
校准与操作顺序 执行任何 ADC 操作之前都必须先完成校准;
校准开始期间不能开启自动校准自动载入,否则会影响校准精度。
用户手册
序列寄存器与采样时间的写入时机 转换期间禁止更改 ADC_RSEQx 或 ADC_JSEQ 寄存器,只能在 ADC 空闲时更改;
通道选择位在采样期间必须保持不变。
用户手册
模拟看门狗阈值与分辨率 转换分辨率小于 12 位时,编程阈值的 LSB 必须保持清零,内部对完整的 12 位转换数据按左对齐比较;
看门狗 1 滤波功能仅在单通道上使用看门狗时有效。
用户手册
过采样重置模式的触发周期 重置模式下须确保注入触发周期超过过采样周期长度,否则过采样无法完成并阻塞正常序列器。 用户手册
多 ADC 同步的通道与停止转换 不要在多个 ADC 上转换相同的通道,两个 ADC 在同一通道上的采样时间不能重叠;
多 ADC 模式下不能使用停止转换功能,且仅需配置主 ADC。
用户手册
ADC 时钟与计时时钟 工作时钟源仅可配置 AHB_CLK,最高可到 240MHz;
ADC_1MCLK 计时时钟必须配置成 1MHz。
用户手册
差分输入的通道限制 部分通道内部固定为单端输入,不要将其配置为差分输入,具体请参考用户手册的 ADC 章节。 用户手册
国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计