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 参考
以下 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。
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 数据寄存器,目标为变量地址,采用循环模式。
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 就绪再执行单端校准,校准未完成前不应启动转换。
/* 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 持续搬运。
/* 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。
/* 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。
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. 主循环重复触发。 单次转换模式下每次转换完成都需要重新触发。
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。
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,作用范围限定为规则通道连续模式。
/* 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,源为数据寄存器。
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,采样时间取最长一档。
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 搬运。
/* Enable Temper Sensor */
ADC_EnableTempSensorVrefint(ENABLE);
/* Enable ADC DMA */
ADC_SetDMATransferMode(ADC1,ADC_MULTI_REG_DMA_EACH_ADC);
3. 换算温度值。 先从信息区读取芯片的传感器校准值,再按数据手册公式换算。
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 毫秒。
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 设为差分。
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. 执行差分校准。 差分模式的校准类型与单端不同。
/* 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. 读取结果并换算电压差。 主循环等待转换结束后读取数据寄存器并换算。
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。
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。
/* 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。
#define GAIN_FACTOR (4096*2)
#define OFFSET_VALUE (0x400)
3. DMA 搬运补偿后的结果。 目标为变量地址,循环模式持续刷新。
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 为单次转换。 不使能连续转换,每次采集都需要软件触发。
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 实例。
/* 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. 单次采集函数。 每次调用先重配通道,再软件触发并等待转换结束。
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,结果写入数组。
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。
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 用位掩码接口选择通道。
/* 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. 中断中更新阈值并翻转输出。 读取当前阈值决定迟滞方向,切换阈值后翻转对应引脚。
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 使用不同的阈值窗口。
/* 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 用位掩码选择通道。
/* 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. 中断中清标志并累加。 两个看门狗分别判断来源,各自清除后累加同一计数变量。
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 个通道,触发都来自外部线。
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. 配置间断模式与注入通道。 规则通道使用扫描间断,注入通道配置外部触发。
/* 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。
ADC_ConfigRegularExtLineTrigSource(ADC1,Regular_ExtLine_TrigSource);
ADC_ConfigInjectedExtLineTrigSource(ADC1,Injected_ExtLine_TrigSource);
4. 配置外部线为事件上升沿。 通过 GPIO_ConfigEXTILine 把引脚映射到 EXTI 线。
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 的结果写入注入数组。
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 的工作模式必须一致。
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 采用同样的模式并配置自己的两路通道。
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 次。
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 同步。
/* 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。
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 搬运。
/* 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 模式产生触发事件。
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 便于示波器观察。
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 章节。 | 用户手册 |