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 参考
以下 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 先把结构体填为默认值,再按独立模式、单通道、连续转换、软件触发逐项赋值。
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 的补偿参数。 偏移寄存器绑定通道、偏移量、方向与是否饱和四个字段,一次写入。
/* 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,保证转换数据被搬运时外设已准备好。
/* 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 会反复转换同一通道。
/* 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,每次启动只转换一次。
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 把配置、启动、查询与读取串在一起,调用一次完成一个通道的采样。
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 的通道参数上区分。
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 周期以保证建立完全。
/* 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 位采样值折算成电压,再读出出厂校准值,最后按斜率换算温度。
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 持续搬运,主循环只需读取最新值并输出。
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. 连续转换模式初始化。 扫描位关闭、连续位打开,转换由软件触发后自行持续。
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 就绪后使能,避免数据尚未就绪就开始搬运。
/* 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,内存地址固定为单个变量,循环模式下缓冲区自动重复。
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 位。
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. 设置过采样倍数、移位与作用范围。 两倍过采样且不右移,作用范围取连续规则转换。
/* 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 个半字并开启地址自增。 缓冲区比通道多,用于观察连续多次过采样结果的变化。
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. 配置阈值、监视通道与中断使能。 高、低阈值一次写入,再用单一通道模式指定被监视的通道。
/* 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。
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. 中断服务中清除标志并计数。 先判断中断来源,再清挂起位,最后累加计数。
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 线。
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。
/* 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。
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 后按偏移读取注入结果寄存器,并做环形写入。
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 先按双模式初始化,再排两个规则通道。
/* 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 保持一致,否则同步无法建立。
/* 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 发出。
/* 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 位字承载两路结果,因此传输宽度取字。
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 传输完成。 正常模式下搬运完设定字数后置起传输完成标志,主程序查询并清除该标志。
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。
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,使能自动注入后规则转换结束会自动触发一次注入转换。
/* 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 触发源。
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,读取注入结果后复位,用引脚电平变化指示注入转换发生。
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 相关条目。