5.1 ADC 使用说明

本章说明 N32G41x 标准外设库中 ADC 驱动的文件组成与 44 个公开函数,内容包括 ADC 的复位与初始化、规则通道与注入通道的转换控制、软硬件触发配置、多 ADC 协同、模拟看门狗、温度传感器与内部参考、过采样、偏移补偿、中断与标志管理以及 ADC 时钟配置,并说明 9 个示例工程。寄存器位定义、双 ADC 模式与采样时序请配合用户手册的“模拟/数字转换(ADC)”章节阅读,芯片已知问题以勘误手册为准。

5.1.1 相关文件

相对路径 作用
firmware/n32g41x_std_periph_driver/inc/n32g41x_adc.h 定义 ADC_InitType、ADC_OffsetType 结构体与工作模式、通道、采样时间、触发源、模拟看门狗、过采样、偏移等配置宏,并按 API 参考所列十一个区段声明 44 个公开函数
firmware/n32g41x_std_periph_driver/src/n32g41x_adc.c 实现上述 44 个函数:上下电与就绪查询,序列长度与通道排序写入,软件与外部触发启动,阈值与通道的模拟看门狗配置,过采样与偏移寄存器配置,以及标志与中断管理
projects/n32g41x_EVAL/examples/ADC/ ADC 示例根目录,含 ADC_Offset、ADC_SingleRead、ADC_TEMP、ADC1_DMA、ADC1_Oversampling、AnalogWatchdog、ExtLinesTrigger、RegSimul_DualMode、TIMTrigger_AutoInjection 9 个示例
projects/n32g41x_EVAL/examples/ADC/ADC1_DMA/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32g41x_EVAL/bsp/ 各示例共用的板级支持文件:评估板 LED 与按键定义、毫秒延时函数、串口日志接口

5.1.2 API 参考

搜索 API共 44 个函数

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

复位与初始化

ADC_DeInit、ADC_Init、ADC_InitStruct、ADC_Enable、ADC_EnableDMA

规则转换控制

ADC_EnableSoftwareStartConv、ADC_GetSoftwareStartConvStatus、ADC_StopRegularConv、ADC_ConfigRegularChannel、ADC_GetDat、ADC_GetMutiModeConversionDat、ADC_ConfigDiscModeChannelCount、ADC_EnableDiscMode

注入转换控制

ADC_EnableSoftwareStartInjectedConv、ADC_GetSoftwareStartInjectedConvCmdStatus、ADC_StopInjectedConv、ADC_ConfigInjectedChannel、ADC_ConfigInjectedSequencerLength、ADC_GetInjectedConversionDat、ADC_EnableAutoInjectedConv、ADC_EnableInjectedDiscMode

触发配置

ADC_SetRegularTriggerEdge、ADC_SetInjectTriggerEdge、ADC_ConfigExternalTrigInjectedConv、ADC_ConfigExternalTrigRegularConv、ADC_ConfigRegularExtLineTrigSource、ADC_ConfigInjectedExtLineTrigSource

多模式配置

ADC_SetMultiTwoSamplingDelay

模拟看门狗

ADC_ConfigAnalogWatchdogWorkChannelType、ADC_ConfigAnalogWatchdogThresholds、ADC_ConfigAnalogWatchdogSingleChannel

温度传感器与内部参考

ADC_EnableTempSensorVrefint、Reference_VoltageSelect

过采样配置

ADC_ConfigOverSamplingRatioAndShift、ADC_SetOverSamplingScope、ADC_EnableOverSamplingDiscont

偏移配置

ADC_SetOffsetConfig、ADC_GetOffsetConfig

中断与标志管理

ADC_GetFlagStatus、ADC_ClearFlag、ADC_ConfigInt、ADC_GetIntStatus、ADC_ClearIntPendingBit

时钟配置

ADC_ClockModeConfig

void ADC_DeInit(const ADC_Module *ADCx)将 ADCx 外设寄存器复位为默认复位值。
源码注释
name    ADC_DeInit.
fun     Reset the ADC registers.
param   ADCx :
          - ADC1
          - ADC2
return  none
void ADC_Init(ADC_Module *ADCx, const ADC_InitType *ADC_InitParam)按 ADC_InitParam 中的参数初始化 ADCx 外设。
源码注释
name    ADC_Init.
fun     Initializes the ADCx peripheral according to the specified parameters in the ADC_InitParam.
param   ADCx :
          - ADC1
          - ADC2
param   ADC_InitParam :
          - WorkMode
             - ADC_WORKMODE_INDEPENDENT
             - ADC_WORKMODE_DUAL_REG_INJECT_SIMULT
             - ADC_WORKMODE_DUAL_INJ_SIMULT
             - ADC_WORKMODE_DUAL_REG_SIMULT
             - ADC_WORKMODE_DUAL_INTERL
             - ADC_WORKMODE_DUAL_ALTER_TRIG
          - MultiChEn
             - ENABLE
             - DISABLE
          - ContinueConvEn
             - ENABLE
             - DISABLE
          - ExtTrigSelect
             - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO
             - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2
             - ADC_EXT_TRIG_REG_CONV_ATIM1_CC1
             - ADC_EXT_TRIG_REG_CONV_ATIM1_CC2
             - ADC_EXT_TRIG_REG_CONV_ATIM1_CC3
             - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4
             - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO
             - ADC_EXT_TRIG_REG_CONV_ATIM2_CC1
             - ADC_EXT_TRIG_REG_CONV_ATIM2_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM1_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM1_CC2
             - ADC_EXT_TRIG_REG_CONV_GTIM1_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM2_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM2_CC1
             - ADC_EXT_TRIG_REG_CONV_GTIM2_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM3_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM3_CC1
             - ADC_EXT_TRIG_REG_CONV_GTIM3_CC2
             - ADC_EXT_TRIG_REG_CONV_GTIM3_CC4
             - ADC_EXT_TRIG_REG_CONV_GTIM4_TRGO
             - ADC_EXT_TRIG_REG_CONV_GTIM4_CC1
             - ADC_EXT_TRIG_REG_CONV_GTIM4_CC2
             - ADC_EXT_TRIG_REG_CONV_GTIM4_CC4
             - ADC_EXT_TRIG_REG_CONV_BTIM1_TRGO
             - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15
             - ADC_EXT_TRIG_REG_CONV_SOFTWARE
          - DatAlign
             - ADC_DAT_ALIGN_R
             - ADC_DAT_ALIGN_L
          - ChsNumber: This parameter must be between 1 to 16.
return  none
void ADC_InitStruct(ADC_InitType *ADC_InitStructure)为 ADC_InitType 的每个成员赋默认值。
源码注释
name    ADC_InitStruct.
fun     Fills all ADC_InitStructure member with default value.
param   ADC_InitStructure :
          - WorkMode
          - MultiChEn
          - ContinueConvEn
          - ExtTrigSelect
          - DatAlign
          - ChsNumber
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
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_EnableDMA(ADC_Module *ADCx, FunctionalState Cmd)使能或关闭指定 ADC 的 DMA 请求。
源码注释
name    ADC_EnableDMA.
fun     Enables or disables the specified ADC DMA request.
param   ADCx :
          - ADC1
          - ADC2
param   Cmd :
          - ENABLE
          - DISABLE
return  none
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
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus ADC_GetSoftwareStartConvStatus(const ADC_Module *ADCx)获取指定 ADC 规则通道软件启动转换的状态。
源码注释
name    ADC_GetSoftwareStartConvStatus.
fun     Gets the selected ADC Software start conversion Status.
param   ADCx :
          - ADC1
          - ADC2
return The new state of ADC software start conversion (SET or RESET).
void ADC_StopRegularConv(ADC_Module *ADCx)停止 ADC 规则组通道转换。
源码注释
name    ADC_StopRegularConv.
fun     Stop ADC group regular channels conversion.
param   ADCx :
          - ADC1
          - ADC2
return  none
void ADC_ConfigRegularChannel(ADC_Module *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)配置所选规则通道在序列中的序号与采样时间。
源码注释
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
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
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_4
          - ADC_SAMP_TIME_CYCLES_6
          - ADC_SAMP_TIME_CYCLES_8
          - ADC_SAMP_TIME_CYCLES_14
          - ADC_SAMP_TIME_CYCLES_29
          - ADC_SAMP_TIME_CYCLES_42
          - ADC_SAMP_TIME_CYCLES_56
          - ADC_SAMP_TIME_CYCLES_72
          - ADC_SAMP_TIME_CYCLES_88
          - ADC_SAMP_TIME_CYCLES_120
          - ADC_SAMP_TIME_CYCLES_182
          - ADC_SAMP_TIME_CYCLES_240
          - ADC_SAMP_TIME_CYCLES_300
          - ADC_SAMP_TIME_CYCLES_400
          - ADC_SAMP_TIME_CYCLES_480
          - ADC_SAMP_TIME_CYCLES_600
return  none
uint16_t ADC_GetDat(const ADC_Module *ADCx)获取规则通道最后一次转换的结果。
源码注释
name    ADC_GetDat.
fun     Get the last ADCx conversion result data for regular channel
param   ADCx :
          - ADC1
          - ADC2
return  The Data conversion value.
uint32_t ADC_GetMutiModeConversionDat(void)获取多 ADC 模式下最后一次转换的结果。
源码注释
name    ADC_GetMutiModeConversionDat.
fun     Get the last ADC conversion result data in dual-ADC mode.
return  The Data conversion value in dual-ADC mode.
void ADC_ConfigDiscModeChannelCount(ADC_Module *ADCx, uint8_t Number)配置规则通道间断模式下每次转换的通道个数。
源码注释
name    ADC_ConfigDiscModeChannelCount.
fun     Configures the discontinuous numbers for the selected ADC regular
        group channels.
param   ADCx :
          - ADC1
          - ADC2
param   Number : specifies the discontinuous mode regular channel
        count value. This number must be range from 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
param   Cmd :
          - ENABLE
          - DISABLE
return  none
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
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(const ADC_Module *ADCx)获取指定 ADC 注入通道软件启动转换的状态。
源码注释
name    ADC_GetSoftwareStartInjectedConvCmdStatus.
fun     Gets the selected ADC Software start injected conversion Status.
param   ADCx :
          - ADC1
          - ADC2
return The new state of ADC software start injected conversion (SET or RESET).
void ADC_StopInjectedConv(ADC_Module *ADCx)停止 ADC 注入组通道转换。
源码注释
name    ADC_StopInjectedConv.
fun     Stop ADC group injected channels conversion.
param   ADCx :
          - ADC1
          - ADC2
return  none
void ADC_ConfigInjectedChannel(ADC_Module *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)配置所选注入通道在序列中的序号与采样时间。
源码注释
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
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
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_4
          - ADC_SAMP_TIME_CYCLES_6
          - ADC_SAMP_TIME_CYCLES_8
          - ADC_SAMP_TIME_CYCLES_14
          - ADC_SAMP_TIME_CYCLES_29
          - ADC_SAMP_TIME_CYCLES_42
          - ADC_SAMP_TIME_CYCLES_56
          - ADC_SAMP_TIME_CYCLES_72
          - ADC_SAMP_TIME_CYCLES_88
          - ADC_SAMP_TIME_CYCLES_120
          - ADC_SAMP_TIME_CYCLES_182
          - ADC_SAMP_TIME_CYCLES_240
          - ADC_SAMP_TIME_CYCLES_300
          - ADC_SAMP_TIME_CYCLES_400
          - ADC_SAMP_TIME_CYCLES_480
          - ADC_SAMP_TIME_CYCLES_600
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
param   Length : The sequencer length. This parameter must be a number between 1 to 4.
return  none
uint16_t ADC_GetInjectedConversionDat(const ADC_Module *ADCx, uint8_t ADC_InjectedChannelOffset)获取注入通道的转换结果。
源码注释
name    ADC_GetInjectedConversionDat.
fun     Get the ADC injected channel conversion result.
param   ADCx :
          - ADC1
          - ADC2
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 data is range 0 - 0xFFFF.
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
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
param   Cmd :
          - ENABLE
          - DISABLE
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
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
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_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
param   ADC_ExternalTrigInjecConv :
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO2
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC1
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC2
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC3
          - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC4
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC1
          - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM1_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM1_CC2
          - ADC_EXT_TRIG_INJ_CONV_GTIM1_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM2_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM2_CC1
          - ADC_EXT_TRIG_INJ_CONV_GTIM2_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_CC1
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_CC2
          - ADC_EXT_TRIG_INJ_CONV_GTIM3_CC4
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_TRGO
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_CC1
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_CC2
          - ADC_EXT_TRIG_INJ_CONV_GTIM4_CC4
          - ADC_EXT_TRIG_INJ_CONV_BTIM1_TRGO
          - 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
param   ADC_ExternalTrigRegularConv :
          - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO
          - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2
          - ADC_EXT_TRIG_REG_CONV_ATIM1_CC1
          - ADC_EXT_TRIG_REG_CONV_ATIM1_CC2
          - ADC_EXT_TRIG_REG_CONV_ATIM1_CC3
          - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4
          - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO
          - ADC_EXT_TRIG_REG_CONV_ATIM2_CC1
          - ADC_EXT_TRIG_REG_CONV_ATIM2_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM1_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM1_CC2
          - ADC_EXT_TRIG_REG_CONV_GTIM1_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM2_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM2_CC1
          - ADC_EXT_TRIG_REG_CONV_GTIM2_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM3_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM3_CC1
          - ADC_EXT_TRIG_REG_CONV_GTIM3_CC2
          - ADC_EXT_TRIG_REG_CONV_GTIM3_CC4
          - ADC_EXT_TRIG_REG_CONV_GTIM4_TRGO
          - ADC_EXT_TRIG_REG_CONV_GTIM4_CC1
          - ADC_EXT_TRIG_REG_CONV_GTIM4_CC2
          - ADC_EXT_TRIG_REG_CONV_GTIM4_CC4
          - ADC_EXT_TRIG_REG_CONV_BTIM1_TRGO
          - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15
          - ADC_EXT_TRIG_REG_CONV_SOFTWARE
return  none
void ADC_ConfigRegularExtLineTrigSource(ADC_Module *ADCx, uint32_t ADC_trigger)配置规则通道的 ADC 外部线触发源。
源码注释
name   ADC_ConfigRegularExtLineTrigSource.
fun    Configure ADC external line trigger source for regular channel.
param   ADCx :
          - ADC1
          - ADC2
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    Configure ADC external line trigger source for injected channel.
param   ADCx :
          - ADC1
          - ADC2
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_SetMultiTwoSamplingDelay(ADC_Module *ADCx, uint32_t MultiTwoSamplingDelay)设置双 ADC 模式两个采样阶段之间的延时。
源码注释
name    ADC_SetMultiTwoSamplingDelay.
fun     Set ADC multimode delay between 2 sampling phases.
param   ADCx :
          - ADC1
          - ADC2
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
void ADC_ConfigAnalogWatchdogWorkChannelType(ADC_Module *ADCx, uint32_t ADC_AnalogWatchdog)在单一或全部规则、注入通道上使能或关闭模拟看门狗。
源码注释
name    ADC_ConfigAnalogWatchdogWorkChannelType.
fun     Enables or disables the analog watchdog on single/all regular or injected channels.
param   ADCx :
          - ADC1
          - ADC2
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_ConfigAnalogWatchdogThresholds(ADC_Module *ADCx, uint16_t HighThreshold, uint16_t LowThreshold)配置模拟看门狗的高、低阈值。
源码注释
name    ADC_ConfigAnalogWatchdogThresholds.
fun     Configures the high and low thresholds of the analog watchdog .
param   ADCx :
          - ADC1
          - ADC2
param   HighThreshold : the ADC analog watchdog high threshold value.
          - This parameter must be a 12bit value.
param   LowThreshold : the ADC analog watchdog low threshold value.
          - This parameter must be a 12bit value.
return  none
void ADC_ConfigAnalogWatchdogSingleChannel(ADC_Module *ADCx, uint8_t ADC_Channel)配置模拟看门狗监视的单一通道。
源码注释
name    ADC_ConfigAnalogWatchdogSingleChannel.
fun     Configures the analog watchdog guarded on single channel.
param   ADCx :
          - ADC1
          - ADC2
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
return  none.
void ADC_EnableTempSensorVrefint(FunctionalState Cmd)使能或关闭 ADC 的温度传感器与内部参考电压通道。
源码注释
name    ADC_EnableTempSensorVrefint.
fun     Enables or disables the temperature sensor and Vrefint channel of ADC1
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void Reference_VoltageSelect(uint32_t Ref_Type)选择参考电压。
源码注释
name    Reference_VoltageSelect
fun     Selects the reference voltage.
param   Ref_Type:  Select reference voltage of ADC.
         - ADC_VREFSEL_VDDA            Select VDDA as reference voltage
         - ADC_VREFSEL_VREFP           Select VREF+ as reference voltage
         - ADC_VREFSEL_VREFBUFF_2_4V   Select VREFBUFF_2.4V as reference voltage
         - ADC_VREFSEL_OFF             All three switching transistors of VREFP are turned off
return  none
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
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
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)使能或关闭过采样间断模式。
源码注释
name    ADC_EnableOverSamplingDiscont.
fun     Set ADC oversampling discontinuous mode (triggered mode).
param   ADCx :
          - ADC1
          - ADC2
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void ADC_SetOffsetConfig(ADC_Module *ADCx, uint8_t ADC_Offset, const ADC_OffsetType *ADC_OffsetStruct)设置指定通道的转换偏移。
源码注释
name    ADC_SetOffsetConfig.
fun     Set the specified channel conversion offset configuration.
param   ADCx :
          - ADC1
          - ADC2
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 0x11. means CH0 - CH17.
          - 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(const 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
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 0x11. means CH0 - CH17.
          - 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
FlagStatus ADC_GetFlagStatus(const 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
param   ADC_FLAG :
          - ADC_FLAG_ENDC
          - ADC_FLAG_EOC_ANY
          - ADC_FLAG_JENDC
          - ADC_FLAG_JEOC_ANY
          - ADC_FLAG_AWDG
          - ADC_FLAG_OVERRUN
          - ADC_FLAG_RDY
          - ADC_FLAG_PDRDY
          - ADC_FLAG_EOSAMP
          - ADC_FLAG_TCFLAG
          - ADC_FLAG_STR
          - ADC_FLAG_JSTR
          - ADC_FLAG_VREFRDY
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
param   ADC_FLAG :
          - ADC_FLAG_ENDC
          - ADC_FLAG_EOC_ANY
          - ADC_FLAG_JENDC
          - ADC_FLAG_JEOC_ANY
          - ADC_FLAG_AWDG
          - ADC_FLAG_OVERRUN
          - 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
param   ADC_IT :
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWDG
          - ADC_INT_OVERRUN
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP

param   Cmd :
          - ENABLE
          - DISABLE
return    none.
INTStatus ADC_GetIntStatus(const 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
param   ADC_IT : specifies the ADC interrupt source to check.
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWDG
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP
          - ADC_INT_OVERRUN
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
param   ADC_IT :
          - ADC_INT_ENDC
          - ADC_INT_ENDCA
          - ADC_INT_JENDC
          - ADC_INT_JENDCA
          - ADC_INT_AWDG
          - ADC_INT_OVERRUN
          - ADC_INT_RDY
          - ADC_INT_PDRDY
          - ADC_INT_EOSAMP
return    none.
void ADC_ClockModeConfig(uint32_t RCC_ADCCLKprescaler)配置 ADCCLK 的分频。
源码注释
name    ADC_ClockModeConfig
fun     Configures the ADCCLK prescaler.
param   RCC_ADCCLKprescaler:
         - RCC_ADCSYSCLK_DIV1     ADC clock = SYSCLK
         - RCC_ADCSYSCLK_DIV2     ADC clock = SYSCLK/2
         - RCC_ADCSYSCLK_DIV3     ADC clock = SYSCLK/3
         - RCC_ADCSYSCLK_DIV4     ADC clock = SYSCLK/4
         - RCC_ADCSYSCLK_DIV5     ADC clock = SYSCLK/5
         - RCC_ADCSYSCLK_DIV6     ADC clock = SYSCLK/6
         - RCC_ADCSYSCLK_DIV8     ADC clock = SYSCLK/8
         - RCC_ADCSYSCLK_DIV10    ADC clock = SYSCLK/10
         - RCC_ADCSYSCLK_DIV12    ADC clock = SYSCLK/12
         - RCC_ADCSYSCLK_DIV16    ADC clock = SYSCLK/16
         - RCC_ADCSYSCLK_DIV32    ADC clock = SYSCLK/32
         - RCC_ADCSYSCLK_DIV64    ADC clock = SYSCLK/64
return  none

5.1.3 Demo 示例说明

本节按示例目录名字母序说明 9 个 ADC 示例,覆盖单通道读取、DMA 采集、内部温度传感器、过采样、模拟看门狗、外部线触发、双 ADC 同步与定时器自动注入。

5.1.3.1 ADC_Offset 偏移补偿

工程目录: projects/n32g41x_EVAL/examples/ADC/ADC_Offset/

PB1 模拟输入→ADC1 规则通道 9 连续转换→偏移寄存器 1 在结果上叠加 0x400→结果饱和到 0x000~0xFFF→DMA 循环搬运到内存

项目 源码解读
功能 在 ADC1 规则通道 9(PB1)的转换结果上叠加正偏移 0x400,并使能饱和,演示偏移补偿寄存器的用法。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:通道、端口与引脚宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 单通道、连续转换、软件触发,采样时间为 ADC_SAMP_TIME_CYCLES_240;
偏移寄存器选 ADC_REGESTER_OFFSET_1,OffsetData 取 OFFSET_VALUE(0x400),OffsetDirPositiveEn 与 OffsetSatenEn 均使能;
DMA 通道 1 循环模式,半字传输,缓冲区大小 1。
程序与数据路径 main 依次调用 RCC_Configuration、GPIO_Configuration、DMA_Config、ADC_Initial,最后 ADC_EnableSoftwareStartConv 启动连续转换;
转换结果写入 ADC1->DAT,由 DMA 循环搬到内存变量 ADCConvertedValue,读到的值即原始结果加 0x400。
主要 API ADC_InitStruct、ADC_Init、ADC_ConfigRegularChannel、ADC_SetOffsetConfig、ADC_Enable、ADC_GetFlagStatus、ADC_EnableDMA、ADC_EnableSoftwareStartConv
验证方法 在 PB1 上加已知电压,用 Keil 或 IAR 的变量观察窗口查看 ADCConvertedValue,其值应等于原始采样结果加 0x400;
若相加后超出 12 位量程则被饱和到 0xFFF。
使用提示 偏移寄存器在过采样使能时不生效,OFFSCHxEN 位会被忽略;
正偏移只在结果上加值,负偏移(OffsetDirPositiveEn 置 DISABLE)才做减法。
核心代码解读与移植

示例让 PB1 上的电压经 ADC1 通道 9 连续转换,再由偏移寄存器 1 在转换结果上叠加固定偏移。

数据路径: PB1 电压 → ADC_ConfigRegularChannel 选定通道 9 → ADC_SetOffsetConfig 写入偏移寄存器 1 → 每次结果加 0x400 并饱和 → DMA 循环写入 ADCConvertedValue

1. 单通道连续转换的初始化。 ADC_Initial 先把结构体填为默认值,再按独立模式、单通道、连续转换、软件触发逐项赋值。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADC1 configuration ------------------------------------------------------*/
    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_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel configuration */
    ADC_ConfigRegularChannel(ADC1, ADC_CH_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);

2. 写入偏移寄存器 1 的补偿参数。 偏移寄存器绑定通道、偏移量、方向与是否饱和四个字段,一次写入。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 channel offset compensation configuration
     * Offset register 1 monitors ADC_CH_CHANNEL (PB1)
     * Positive direction offset: result = ADC_raw + OFFSET_VALUE
     * Saturation enabled: clamp result to 0x000~0xFFF range
     */
    ADC_OffsetStructure.OffsetChannel      = ADC_CH_CHANNEL;
    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);

四个偏移寄存器(ADC_REGESTER_OFFSET_1 至 ADC_REGESTER_OFFSET_4)分别对应 ADC_OFFSET1 至 ADC_OFFSET4,每个寄存器只能绑定一个通道。

3. 使能 ADC 并等待就绪,再打开 DMA 请求。 上下电与就绪检查完成后才使能 DMA,保证转换数据被搬运时外设已准备好。

src/main.csrc/main.c · ADC_Initial
    /* Enable ADC1 */
    ADC_Enable(ADC1, ENABLE);
    /* Check ADC Ready */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY) == RESET)
        ;
    /* Enable ADC1 DMA */
    ADC_EnableDMA(ADC1, ENABLE);

4. 启动连续转换。 main 在初始化完成后调用一次软件启动,连续模式下 ADC 会反复转换同一通道。

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

对应源码: src/main.c

5.1.3.2 ADC_SingleRead 单通道读取

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

PA0、PA1 模拟输入→主循环轮流切换 ADC1 规则通道 0 与通道 1→软件启动并轮询 ENDC→读取 DAT 存入数组

项目 源码解读
功能 用查询方式逐个通道读取电压,不使用 DMA,把通道 0(PA0)与通道 1(PA1)的结果存入数组。
源码组成 src/main.c:ADC_Initial、ADC_GetData、main、RCC_Configuration、GPIO_Configuration;
inc/main.h:通道、端口与引脚宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 单通道、单次转换(ContinueConvEn 为 DISABLE)、软件触发,采样时间为 ADC_SAMP_TIME_CYCLES_240;
ADC_GetData 每次读取前重设通道,因此不需要扫描模式。
程序与数据路径 main 先 ADC_Initial(ADC1),再在 while(1) 中调用 ADC_GetData 读取通道 0 与通道 1,结果存入 ADC1ConvertedValue[0] 与 ADC1ConvertedValue[1];
ADC_GetData 内部配置通道、软件启动、轮询 ADC_FLAG_ENDC、清除 ENDC 与 STR 后读取 ADC_GetDat。
主要 API ADC_InitStruct、ADC_Init、ADC_Enable、ADC_GetFlagStatus、ADC_ConfigRegularChannel、ADC_EnableSoftwareStartConv、ADC_ClearFlag、ADC_GetDat
验证方法 在 PA0、PA1 上加不同电压,用变量观察窗口查看 ADC1ConvertedValue 两个元素,其值应分别对应两路电压;
数据对齐为右对齐。
使用提示 单次转换模式下每读取一个新通道都要重新配置规则通道再启动;
读取前清除 ADC_FLAG_STR 可避免上一次的状态影响判断。
核心代码解读与移植

示例用查询方式逐个通道读取电压,不使用 DMA,主循环反复刷新两个通道的结果。

数据路径: PA0、PA1 电压 → ADC_ConfigRegularChannel 切换通道 → ADC_EnableSoftwareStartConv 启动 → 轮询 ADC_FLAG_ENDC → ADC_GetDat 读回 → 存入 ADC1ConvertedValue

1. 单次转换模式初始化。 与连续转换示例相比,这里 ContinueConvEn 为 DISABLE,每次启动只转换一次。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADCx configuration ------------------------------------------------------*/
    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_Init(ADCx, &ADC_InitStructure);

    /* Enable ADCx */
    ADC_Enable(ADCx, ENABLE);
    /* Check ADC Ready */
    while(ADC_GetFlagStatus(ADCx, ADC_FLAG_RDY) == RESET)
        ;

2. 每次读取都重设通道并等待转换结束。 ADC_GetData 把配置、启动、查询与读取串在一起,调用一次完成一个通道的采样。

src/main.csrc/main.c · ADC_GetData
    ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_CYCLES_240);
    /* 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;

3. 主循环轮流读取两个通道。 两个通道共用同一份初始化,只在 ADC_GetData 的通道参数上区分。

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

对应源码: src/main.c

5.1.3.3 ADC_TEMP 内部温度传感器

工程目录: projects/n32g41x_EVAL/examples/ADC/ADC_TEMP/

使能内部温度传感器通道→ADC1 通道 17 以 600 周期采样→DMA 搬运转换值→按出厂校准值换算温度→串口打印

项目 源码解读
功能 采样芯片内部温度传感器,按出厂校准值换算并打印温度,演示内部通道与较长采样时间的用法。
源码组成 src/main.c:ADC_Initial、TempratureCalculate、main、RCC_Configuration、DMA_Config;
inc/main.h:引脚与日志配置宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 单通道、连续转换,通道选 ADC1_Channel_17_Temperture_Sensor,采样时间为 ADC_SAMP_TIME_CYCLES_600;
调温前先 ADC_EnableTempSensorVrefint(ENABLE);
参考电压 VREF_VALUE 默认 3.3,若板上 VDDA 为 5 V 则改 4.7 并切换 VTS_ADDR;
DMA 循环模式,缓冲区大小 1。
程序与数据路径 main 依次初始化时钟、日志、DMA 与 ADC,启动转换并等待 ENDC,随后在 while(1) 中把 ADCConvertedValue 交给 TempratureCalculate,再通过 log_debug 打印温度。
主要 API ADC_ConfigRegularChannel、ADC_EnableTempSensorVrefint、ADC_EnableDMA、ADC_Enable、ADC_GetFlagStatus、ADC_EnableSoftwareStartConv
验证方法 通过 PA9 以 115200、8 位、无校验、1 位停止位输出日志,串口应周期打印形如 Temperature = 25.0 C 的温度值;
改变环境温度时数值随之变化。
使用提示 温度传感器的理想采样时间不小于 17.1 us,示例取 600 周期;
换算需要芯片出厂时写入的校准值,只有在采样时间足够长时读数才稳定。
核心代码解读与移植

示例采样芯片内部温度传感器,并按出厂校准值与温度斜率换算温度。

数据路径: 温度传感器 → ADC1 通道 17 → ADC_EnableTempSensorVrefint 使能 → DMA 搬到 ADCConvertedValue → TempratureCalculate 按 VTS_ADDR 与 AVG_SLOPE 换算 → 串口输出

1. 选择内部温度传感器通道并加大采样时间。 内部通道接在 ADC1 通道 17 上,采样时间取 600 周期以保证建立完全。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 regular channel16 configuration (internal temperature sensor) */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_17_Temperture_Sensor, 1, ADC_SAMP_TIME_CYCLES_600);
    /* Enable Temperature Sensor */
    ADC_EnableTempSensorVrefint(ENABLE);
    /* Enable ADC1 DMA */
    ADC_EnableDMA(ADC1, ENABLE);
    /* Enable ADC1 */
    ADC_Enable(ADC1, ENABLE);

2. 由采样值换算电压与温度。 先把 12 位采样值折算成电压,再读出出厂校准值,最后按斜率换算温度。

src/main.csrc/main.c · TempratureCalculate
    float Temperate,tempValue,VTS;
    uint32_t TSValue;

    /* Voltage value of temperature sensor */
    tempValue=TempAdVal*(VREF_VALUE/4095);

    TSValue= (((*(uint32_t*)(VTS_ADDR)) & 0x0000FFFF));

    VTS =  TSValue /1000.0f;

    /* Get the temperature inside the chip */
    Temperate= ((VTS - tempValue)/AVG_SLOPE) + 25;

AVG_SLOPE 取 0.0041,即每摄氏度对应的电压变化;校准值为 25 ℃ 时温度传感器对应的电压,单位为毫伏。

3. 主循环换算并打印。 转换由 DMA 持续搬运,主循环只需读取最新值并输出。

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);
    }

对应源码: src/main.c

5.1.3.4 ADC1_DMA 循环采集

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

PB1 模拟输入→ADC1 通道 9 连续转换→DMA 通道 1 循环搬运→内存变量实时刷新

项目 源码解读
功能 让 ADC1 连续转换并在每次结束时由 DMA 把结果搬到内存,CPU 不参与搬数。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:通道、端口与引脚宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 单通道、连续转换、软件触发,采样时间为 ADC_SAMP_TIME_CYCLES_240;
DMA 通道 1 循环模式,外设到内存,半字传输,缓冲区大小 1,内存不自增。
程序与数据路径 main 依次初始化时钟、GPIO、DMA 与 ADC,再用 ADC_EnableSoftwareStartConv 启动连续转换;
此后 ADC 每完成一次转换就发出 DMA 请求,把 ADC1->DAT 写入 ADCConvertedValue。
主要 API ADC_InitStruct、ADC_Init、ADC_ConfigRegularChannel、ADC_Enable、ADC_GetFlagStatus、ADC_EnableDMA、ADC_EnableSoftwareStartConv
验证方法 在 PB1 上加随时间变化的电压,用变量观察窗口查看 ADCConvertedValue,其值应随输入连续变化而不需要 CPU 读取。
使用提示 使能顺序为先 ADC_Enable 并等待 ADC_FLAG_RDY,再 ADC_EnableDMA;
循环模式让 DMA 缓冲区在每次搬运后自动重装,适合持续采集。
核心代码解读与移植

示例让 ADC1 连续转换,并用 DMA 循环把结果搬到内存变量,无需 CPU 干预。

数据路径: PB1 电压 → ADC_ConfigRegularChannel 通道 9 → ADC_EnableSoftwareStartConv 启动 → 每次转换结束触发 DMA → ADCConvertedValue 更新

1. 连续转换模式初始化。 扫描位关闭、连续位打开,转换由软件触发后自行持续。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADC1 configuration ------------------------------------------------------*/
    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_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC_CH_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);

2. 先使能、查就绪,再打开 DMA。 DMA 请求在 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)
        ;
    /* Enable ADC1 DMA */
    ADC_EnableDMA(ADC1, ENABLE);

3. DMA 通道 1 循环搬运半个字。 外设地址固定为 ADC1->DAT,内存地址固定为单个变量,循环模式下缓冲区自动重复。

src/main.csrc/main.c · DMA_Config
    DMA_DeInit(DMA_CH1);
    DMA_StructInit(&DMA_InitStructure);
    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.DMA_MemoryInc  = DMA_MEM_INC_DISABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA_CH1, &DMA_InitStructure);

    DMA_RequestRemap(DMA_REMAP_ADC1, DMA, DMA_CH1, ENABLE);

    /* Enable DMA channel1 */
    DMA_EnableChannel(DMA_CH1, ENABLE);

对应源码: src/main.c

5.1.3.5 ADC1_Oversampling 过采样

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

PB0、PB1 模拟输入→ADC1 通道 8 与通道 9 扫描→结果做 2 倍过采样不右移→DMA 循环写入 10 个半字

项目 源码解读
功能 对两个规则通道开启 2 倍过采样,用 DMA 观察过采样后的数据。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:通道、端口与引脚宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 多通道扫描、连续转换,ChsNumber 为 2;
过采样倍数取 ADC_OVERSAMPE_RATE_TIMES_2,右移位取 ADC_OVERSAMPE_DATA_SHIFT_0,作用范围取 ADC_OVERSAMPE_REGULAR_CONTINUED;
DMA 通道 1 循环模式,内存自增,缓冲区大小 10。
程序与数据路径 main 依次初始化时钟、GPIO、DMA 与 ADC,启动转换后两个通道的过采样结果由 DMA 连续写入 ADCConvertedValue[10]。
主要 API ADC_ConfigRegularChannel、ADC_ConfigOverSamplingRatioAndShift、ADC_SetOverSamplingScope、ADC_Enable、ADC_GetFlagStatus、ADC_EnableDMA、ADC_EnableSoftwareStartConv
验证方法 分别在 PB0、PB1 上加电压,用变量观察窗口查看 ADCConvertedValue,其数值等于对应电压按 2 倍过采样、不右移得到的 12 位结果。
使用提示 过采样不右移时结果可超出 12 位,需按倍数自行还原;
过采样使能后偏移补偿不生效,也不支持数据对齐。
核心代码解读与移植

示例对两个规则通道开启 2 倍过采样,用 DMA 连续观察过采样后的数据。

数据路径: PB0、PB1 电压 → 两通道规则序列 → ADC_ConfigOverSamplingRatioAndShift 设 2 倍 → ADC_SetOverSamplingScope 作用于连续规则转换 → DMA 写入 ADCConvertedValue[10]

1. 多通道扫描模式初始化。 扫描位打开、通道数设为 2,两个通道分别排在序列第 1、2 位。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    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_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel configuration */
    ADC_ConfigRegularChannel(ADC1, ADC_CH1_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);
    ADC_ConfigRegularChannel(ADC1, ADC_CH2_CHANNEL, 2, ADC_SAMP_TIME_CYCLES_240);

2. 设置过采样倍数、移位与作用范围。 两倍过采样且不右移,作用范围取连续规则转换。

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

3. DMA 搬运 10 个半字并开启地址自增。 缓冲区比通道多,用于观察连续多次过采样结果的变化。

src/main.csrc/main.c · DMA_Config
    DMA_DeInit(DMA_CH1);
    DMA_StructInit(&DMA_InitStructure);
    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.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA_CH1, &DMA_InitStructure);

对应源码: src/main.c

5.1.3.6 AnalogWatchdog 模拟看门狗

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

PB1 模拟输入→ADC1 通道 9 转换→结果与高低阈值比较→越限触发 AWD 中断→中断服务计数递增

项目 源码解读
功能 用模拟看门狗监视单一规则通道,转换结果超出阈值时产生中断并计数。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
inc/main.h:通道、端口与引脚宏;
src/n32g41x_it.c:ADC1_IRQHandler 与 gCntAwdg 定义;
inc/n32g41x_it.h:中断声明;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 单通道、连续转换,采样时间为 ADC_SAMP_TIME_CYCLES_240;
高阈值为 0x0B00、低阈值为 0x0300,监视类型为 ADC_ANALOG_WTDG_SINGLEREG_ENABLE;
中断使能 ADC_INT_AWDG;
NVIC 优先级组 2,ADC1_IRQn 抢占与子优先级均为 0。
程序与数据路径 main 依次初始化时钟、GPIO、NVIC 与 ADC,启动连续转换后进入 while(1) 递增 gCnt;
转换结果越限时进入 ADC1_IRQHandler,清除 ADC_INT_AWDG 挂起位并递增 gCntAwdg。
主要 API ADC_ConfigRegularChannel、ADC_ConfigAnalogWatchdogThresholds、ADC_ConfigAnalogWatchdogSingleChannel、ADC_ConfigAnalogWatchdogWorkChannelType、ADC_ConfigInt、ADC_GetIntStatus、ADC_ClearIntPendingBit
验证方法 在 PB1 上把电压调到阈值区间之外,用变量观察窗口查看 gCntAwdg 持续增长;
电压在区间内时该计数不再增加。
使用提示 阈值比较发生在数据对齐之前,高、低阈值都按未移位的结果比较;
ADC_ConfigAnalogWatchdogSingleChannel 只在单一通道模式下有意义。
核心代码解读与移植

示例用模拟看门狗监视单一规则通道,越限时由 ADC1_IRQHandler 记录次数。

数据路径: PB1 电压 → 通道 9 → ADC_ConfigAnalogWatchdogThresholds 设阈值 → ADC_ConfigAnalogWatchdogSingleChannel 选定通道 → ADC_ConfigInt 使能 ADC_INT_AWDG → 中断计数

1. 配置阈值、监视通道与中断使能。 高、低阈值一次写入,再用单一通道模式指定被监视的通道。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 regular channel9 configuration */
    ADC_ConfigRegularChannel(ADC1, ADC_CH_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);
    /* Configure high and low analog watchdog thresholds */
    ADC_ConfigAnalogWatchdogThresholds(ADC1, 0x0B00, 0x0300);
    /* Configure channel as the single analog watchdog guarded channel */
    ADC_ConfigAnalogWatchdogSingleChannel(ADC1, ADC_CH_CHANNEL);
    /* Enable analog watchdog on one regular channel */
    ADC_ConfigAnalogWatchdogWorkChannelType(ADC1, ADC_ANALOG_WTDG_SINGLEREG_ENABLE);
    /* Enable AWD interrupt */
    ADC_ConfigInt(ADC1, ADC_INT_AWDG, ENABLE);

2. 在 NVIC 中打开 ADC1 中断。 只有先配置中断控制器并打开对应通道,看门狗中断才能进入 CPU。

src/main.csrc/main.c · NVIC_Configuration
    NVIC_InitType NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel                   = ADC1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

3. 中断服务中清除标志并计数。 先判断中断来源,再清挂起位,最后累加计数。

src/n32g41x_it.csrc/n32g41x_it.c · ADC1_IRQHandler
    if(ADC_GetIntStatus(ADC1, ADC_INT_AWDG) != RESET)
    {
        /* Clear ADC1 AWD pending interrupt bit */
        ADC_ClearIntPendingBit(ADC1, ADC_INT_AWDG);
        gCntAwdg++;
    }

对应源码: src/main.c、src/n32g41x_it.c

5.1.3.7 ExtLinesTrigger 外部线触发

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

PA12、PA11 上升沿→EXTI 事件触发→ADC1 规则组与注入组转换→JENDC 中断读取注入结果→DMA 搬运规则结果

项目 源码解读
功能 用两条外部 EXTI 线分别触发规则组与注入组转换,规则结果走 DMA、注入结果在中断里读取。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、EXTI_Configuration、DMA_Config、NVIC_Configuration;
inc/main.h:通道与 EXTI 触发引脚宏;
src/n32g41x_it.c:ADC1_IRQHandler 与 Index 定义;
inc/n32g41x_it.h:中断声明;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 规则组为 PA0、PA1,注入组为 PA2、PA3,序列长度均为 2;
ContinueConvEn 为 DISABLE,规则触发源取 ADC_EXT_TRIG_REG_CONV_EXT_INT0_15,注入触发源取 ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15;
PA12 经 EXTI 线 10、PA11 经 EXTI 线 11,均为事件模式、上升沿;
DMA 循环模式,缓冲区大小 64。
程序与数据路径 main 依次初始化时钟、NVIC、GPIO、EXTI、DMA 与 ADC;
规则结果由 DMA 写入 ADC_RegularConvertedValueTab[64],每次注入组转换结束进入 ADC1_IRQHandler,读取两个注入数据写入 ADC_InjectedConvertedValueTab[32]。
主要 API ADC_ConfigRegularChannel、ADC_ConfigInjectedChannel、ADC_ConfigInjectedSequencerLength、ADC_ConfigExternalTrigInjectedConv、ADC_ConfigRegularExtLineTrigSource、ADC_ConfigInjectedExtLineTrigSource、ADC_ConfigInt、ADC_GetInjectedConversionDat
验证方法 用信号源在 PA12、PA11 上给出上升沿,规则结果应在 ADC_RegularConvertedValueTab 中更新,注入结果应在 ADC_InjectedConvertedValueTab 中成对出现。
使用提示 注入结果寄存器只读,只能通过 ADC_GetInjectedConversionDat 按偏移读取;
外部线触发需要先用 ADC_ConfigRegularExtLineTrigSource 与 ADC_ConfigInjectedExtLineTrigSource 把 EXTI 线映射到 ADC 触发。
核心代码解读与移植

示例用两条 EXTI 线同时触发规则组与注入组转换,两种结果分别由 DMA 和中断处理。

数据路径: PA12、PA11 上升沿 → EXTI 事件 → ADC 外部触发 → 规则结果 DMA 写入 ADC_RegularConvertedValueTab → JENDC 中断读取注入值到 ADC_InjectedConvertedValueTab

1. 规则组通道与外部线触发。 规则序列排两个通道,触发源选 ADC_EXT_TRIG_REG_CONV_EXT_INT0_15 后由软件外部线再指定具体 EXTI 线。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    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_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_00_PA0, 1, ADC_SAMP_TIME_CYCLES_240);
    ADC_ConfigRegularChannel(ADC1, ADC1_Channel_01_PA1, 2, ADC_SAMP_TIME_CYCLES_240);

2. 注入组通道、触发源与中断。 注入序列长度、通道、外部触发源依次配置,最后把两条 EXTI 线映射到 ADC。

src/main.csrc/main.c · ADC_Initial
    /* Set injected sequencer length */
    ADC_ConfigInjectedSequencerLength(ADC1, 2);
    /* ADC1 injected channel configuration */
    ADC_ConfigInjectedChannel(ADC1, ADC1_Channel_02_PA2, 1, ADC_SAMP_TIME_CYCLES_240);
    ADC_ConfigInjectedChannel(ADC1, ADC1_Channel_03_PA3, 2, ADC_SAMP_TIME_CYCLES_240);
    /* ADC1 injected external trigger configuration */
    ADC_ConfigExternalTrigInjectedConv(ADC1, ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15);

    /* Enable JENDC interrupt */
    ADC_ConfigInt(ADC1, ADC_INT_JENDC, ENABLE);

    ADC_ConfigRegularExtLineTrigSource(ADC1, Regular_ExtLine_TrigSource);
    ADC_ConfigInjectedExtLineTrigSource(ADC1, Injected_ExtLine_TrigSource);

3. 把两条 EXTI 线配成事件模式上升沿。 EXTI 线先与 GPIO 引脚关联,再设为事件模式,事件不进入 CPU 而是直接触发 ADC。

src/main.csrc/main.c · EXTI_Configuration
    EXTI_InitStruct(&EXTI_InitStructure);
    GPIO_ConfigEXTILine(REG_EXTI_PortSOURCE, REG_EXTI_PinSOURCE);
    /* EXTI line10 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);

    GPIO_ConfigEXTILine(INJ_EXTI_PortSOURCE, INJ_EXTI_PinSOURCE);
    /* EXTI line11 configuration -----------------------------------------------*/
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Event;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_Line    = INJ_EXTI_LINE;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

4. 中断服务中读取两个注入数据。 清除 JENDC 后按偏移读取注入结果寄存器,并做环形写入。

src/n32g41x_it.csrc/n32g41x_it.c · ADC1_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);

        if (Index == 32)
        {
            Index = 0;
        }
    }

对应源码: src/main.c、src/n32g41x_it.c

5.1.3.8 RegSimul_DualMode 规则同步双模式

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

PB0、PB1 与 PA4、PA5 模拟输入→ADC1 与 ADC2 规则同步模式→两路结果拼成一个 32 位字→DMA 搬运 16 个字

项目 源码解读
功能 让 ADC1 与 ADC2 工作在规则同步模式,两个通道的结果拼成一个 32 位字由 DMA 搬运。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、DMA_Config;
inc/main.h:两个 ADC 的通道、端口与引脚宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 ADC1 与 ADC2 的 WorkMode 都取 ADC_WORKMODE_DUAL_REG_SIMULT,MultiChEn 与 ContinueConvEn 都使能,ChsNumber 为 2,采样时间为 ADC_SAMP_TIME_CYCLES_600;
DMA 通道 1 正常模式,字传输,缓冲区大小 16。
程序与数据路径 main 依次初始化时钟、GPIO、DMA 与 ADC,启动软件转换后等待 DMA 传输完成标志 DMA_FLAG_TC1 并清除;
每一对同步转换结果写入 ADC_DualConvertedValueTab 的一个 32 位单元,低 16 位为 ADC1、高 16 位为 ADC2。
主要 API ADC_InitStruct、ADC_Init、ADC_ConfigRegularChannel、ADC_Enable、ADC_GetFlagStatus、ADC_EnableDMA、ADC_EnableSoftwareStartConv
验证方法 分别在两组引脚上加电压,用变量观察窗口查看 ADC_DualConvertedValueTab,每个 32 位字的低、高 16 位应分别对应 ADC1 与 ADC2 的通道。
使用提示 从 ADC 的工作模式位必须与主 ADC 一致,改变通道配置会导致双 ADC 重启与同步丢失,配置前应先关闭双 ADC;
DMA 只搬运低 16 位,高 16 位需按字读取。
核心代码解读与移植

示例让 ADC1 与 ADC2 工作在规则同步模式,两个结果拼成一个 32 位字由 DMA 搬运。

数据路径: ADC1、ADC2 通道 → ADC_WORKMODE_DUAL_REG_SIMULT → 同步转换 → DMA 以字搬运 → ADC_DualConvertedValueTab[16]

1. ADC1 配置为规则同步模式。 主 ADC 先按双模式初始化,再排两个规则通道。

src/main.csrc/main.c · ADC_Initial
    /* ADC1 configuration ------------------------------------------------------*/
    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_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel configuration */
    ADC_ConfigRegularChannel(ADC1, ADC1_CH1_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_600);
    ADC_ConfigRegularChannel(ADC1, ADC1_CH2_CHANNEL, 2, ADC_SAMP_TIME_CYCLES_600);

2. ADC2 用相同模式配置。 从 ADC 的模式位与主 ADC 保持一致,否则同步无法建立。

src/main.csrc/main.c · ADC_Initial
    /* ADC2 configuration ------------------------------------------------------*/
    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_Init(ADC2, &ADC_InitStructure);
    /* ADC2 regular channel configuration */
    ADC_ConfigRegularChannel(ADC2, ADC2_CH1_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_600);
    ADC_ConfigRegularChannel(ADC2, ADC2_CH2_CHANNEL, 2, ADC_SAMP_TIME_CYCLES_600);

3. 依次使能两个 ADC 并查就绪,再打开 DMA。 两个 ADC 都要使能并等待就绪,DMA 请求由主 ADC 发出。

src/main.csrc/main.c · ADC_Initial
    /* Enable ADC1 ADC2 */
    ADC_Enable(ADC1, ENABLE);
    ADC_Enable(ADC2, ENABLE);
    /* Check ADC1 Ready */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY) == RESET)
        ;
    /* Check ADC2 Ready */
    while(ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY) == RESET)
        ;
    /* Enable ADC1 DMA */
    ADC_EnableDMA(ADC1, ENABLE);

4. DMA 以字为单位、正常模式搬运 16 个字。 同步模式下一个 32 位字承载两路结果,因此传输宽度取字。

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.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_Word;
    DMA_InitStructure.CircularMode   = DMA_MODE_NORMAL;

5. 主循环等待 DMA 传输完成。 正常模式下搬运完设定字数后置起传输完成标志,主程序查询并清除该标志。

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

对应源码: src/main.c

5.1.3.9 TIMTrigger_AutoInjection 定时器触发自动注入

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

GTIM1 CH4 比较事件→ADC1 规则通道转换→规则结束后自动注入通道→JENDC 中断读取注入值→翻转 PC6 指示

项目 源码解读
功能 由 GTIM1 的 CH4 比较事件触发规则转换,规则转换结束后自动注入一个通道,并在中断里读取注入值。
源码组成 src/main.c:ADC_Initial、main、RCC_Configuration、GPIO_Configuration、TIM_Configuration、DMA_Config、NVIC_Configuration;
inc/main.h:通道、触发与引脚宏;
src/n32g41x_it.c:ADC1_IRQHandler 与 Index 定义;
inc/n32g41x_it.h:中断声明;
readme.txt:功能与环境说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 规则通道为 PA1、注入通道为 PB1,规则序列长度与注入序列长度均为 1;
MultiChEn 与 ContinueConvEn 均为 DISABLE,规则触发源取 ADC_EXT_TRIG_REG_CONV_GTIM1_CC4;
ADC_EnableAutoInjectedConv 使能,ADC_INT_JENDC 使能;
GTIM1 预分频到 16 MHz,周期 1600,CH1、CH4 为 PWM1 模式,脉宽 800;
DMA 循环模式,缓冲区大小 32。
程序与数据路径 main 依次初始化时钟、NVIC、GPIO、GTIM1、DMA 与 ADC,最后 TIM_Enable(GTIM1, ENABLE) 启动定时器;
规则结果由 DMA 写入 ADC_RegularConvertedValueTab[32],每次自动注入结束进入 ADC1_IRQHandler,翻转 PC6 并读取注入值到 ADC_InjectedConvertedValueTab[32]。
主要 API ADC_ConfigRegularChannel、ADC_ConfigInjectedSequencerLength、ADC_ConfigInjectedChannel、ADC_EnableAutoInjectedConv、ADC_ConfigInt、ADC_GetInjectedConversionDat、ADC_EnableDMA
验证方法 运行后用示波器观察 PA3 上 GTIM1 CH4 的 PWM 输出,并用查看窗口确认 ADC_RegularConvertedValueTab 与 ADC_InjectedConvertedValueTab 同步更新;
每次注入中断时 PC6 会输出一个脉冲。
使用提示 自动注入与规则组间断模式不能同时使用;
注入序列需要单独配置长度,ADC_ConfigInjectedChannel 的参数为该通道在注入序列中的序号。
核心代码解读与移植

示例由 GTIM1 的 CH4 事件触发规则转换,规则转换结束后自动注入一个通道。

数据路径: GTIM1 CH4 事件 → ADC 规则触发 → 规则转换完成 → 自动注入通道 → JENDC 中断读取注入值并翻转 PC6

1. 规则组由 GTIM1_CC4 触发、单通道单次。 规则序列只排一个通道,触发源选定时器通道 4。

src/main.csrc/main.c · ADC_Initial
    ADC_InitStruct(&ADC_InitStructure);
    /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIG_REG_CONV_GTIM1_CC4;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel configuration */
    ADC_ConfigRegularChannel(ADC1, ADC_REG_CH_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);

2. 配置自动注入并打开 JENDC 中断。 注入序列长度为 1,使能自动注入后规则转换结束会自动触发一次注入转换。

src/main.csrc/main.c · ADC_Initial
    /* Set injected sequencer length */
    ADC_ConfigInjectedSequencerLength(ADC1, 1);
    /* ADC1 injected channel configuration */
    ADC_ConfigInjectedChannel(ADC1, ADC_INJ_CH_CHANNEL, 1, ADC_SAMP_TIME_CYCLES_240);
    /* Enable automatic injected conversion start after regular one */
    ADC_EnableAutoInjectedConv(ADC1, ENABLE);

    /* Enable JENDC interrupt */
    ADC_ConfigInt(ADC1, ADC_INT_JENDC, ENABLE);

3. 配置 GTIM1 时基与 CH1、CH4 的 PWM1 输出。 定时器把时钟分频到 16 MHz,周期 1600,两个通道脉宽 800,其中 CH4 作为 ADC 触发源。

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);

    /* PWM1 Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = Pluse_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;
    TIM_InitOc1(GTIM1, &TIM_OCInitStructure);
    TIM_ConfigOc1Preload(GTIM1, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel4 */
    TIM_InitOc4(GTIM1, &TIM_OCInitStructure);
    TIM_ConfigOc4Preload(GTIM1, TIM_OC_PRE_LOAD_ENABLE);

    TIM_ConfigArPreload(GTIM1, ENABLE);

4. 中断中读取注入值并翻转 PC6。 进入中断先置位 PC6,读取注入结果后复位,用引脚电平变化指示注入转换发生。

src/n32g41x_it.csrc/n32g41x_it.c · ADC1_IRQHandler
    GPIO_SetBits(GPIO_TOGGLE_PORT, GPIO_TOGGLE_PIN);
    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 toggle pin */
        GPIO_ResetBits(GPIO_TOGGLE_PORT, GPIO_TOGGLE_PIN);
        if (Index == 32)
        {
            Index = 0;
        }
    }

对应源码: src/main.c、src/n32g41x_it.c

5.1.4 注意与排障

场景 检查与建议 来源
ADCCLK 超过上限 ADC 时钟最高 36 MHz,用 ADC_ClockModeConfig 选择 1、2、3、4、5、6、8、10、12、16、32、64 中的分频,系统时钟较高时选更大分频,保证 ADCCLK 不超过 36 MHz。 用户手册
转换过程中修改序列 ADC_RSEQx、ADC_JSEQ 只能在 ADC 空闲时修改;
转换进行中改写序列会打乱通道顺序,须先停止转换再配置。
用户手册
间断模式与自动注入冲突 规则组与注入组只能有一组使用间断模式;
自动注入与间断模式不能同时使用,需要间断转换时应关闭自动注入。
用户手册
过采样与偏移补偿 使能过采样后偏移补偿不生效,OFFSCHxEN 被忽略;
过采样也不支持数据对齐,二者不能与过采样同时使用。
用户手册
双 ADC 主从配置 从 ADC 的工作模式位必须与主 ADC 一致;
改变通道配置会引起双 ADC 重启与同步丢失,应先关闭双 ADC 再修改配置。
用户手册
同步模式下同通道采样窗 同步模式中两个 ADC 对同一通道采样时,采样窗不得重叠,否则结果不可信;
应错开采样时间或改用其它模式。
用户手册
温度传感器精度 温度传感器的理想采样时间不小于 17.1 us,最大误差约 3 ℃,更适合观察温度变化趋势而非测量绝对温度;
可使用较长的采样时间档位减小误差。
用户手册

N32G412、N32G415 系列勘误手册 V1.0.0(2026.6.30)的勘误列表只列出一行 A 版芯片条目,勘误链接列为空,未列出 ADC 相关条目。

国民技术开发套件文档中心

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

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