5.8 DSMU 使用说明

本章说明 N32H49x 标准外设库中 DSMU 驱动的文件组成、36 个公开函数,以及 DSMU_DataFilter、DSMU_ADCFilter、DSMU_ExtADC 三个示例。Σ-Δ 调制、串行接口、通道时钟与滤波器等硬件细节请配合用户手册的“DSMU”章节阅读。

5.8.1 相关文件

相对路径 作用
firmware/n32h49x_std_periph_driver/inc/n32h49x_dsmu.h 定义通道与滤波器的初始化结构体、通道与滤波器选择、中断与标志等宏,并按通道、滤波器、转换、标志与中断区段声明 36 个公开函数
firmware/n32h49x_std_periph_driver/src/n32h49x_dsmu.c 实现上述 36 个函数:通道与滤波器的复位、初始化与使能,通道数据写入与偏移修改,规则/注入转换的启动与停止,标志与中断、DMA 配置
projects/n32h49x_EVAL/examples/DSMU/ DSMU 示例根目录,含 DSMU_DataFilter、DSMU_ADCFilter、DSMU_ExtADC 3 个示例
projects/n32h49x_EVAL/examples/DSMU/DSMU_ADCFilter/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32h49x_EVAL/bsp/ 三个示例共用的板级支持文件:日志初始化与打印串口重映射

5.8.2 API 参考

搜索 API共 36 个函数

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

复位与初始化

DSMU_DeInit、DSMU_InitChannelStruct、DSMU_InitFilterStruct、DSMU_ChannelInit、DSMU_ChannelDeInit

通道控制

DSMU_ChannelCkAbEnable、DSMU_ChannelCkAbDisable、DSMU_ChannelScdStart、DSMU_ChannelScdStop、DSMU_ChannelGetAwdValue、DSMU_ChannelModifyOffset、DSMU_ChannelWriteData

滤波器初始化与通道配置

DSMU_FilterInit、DSMU_FilterEnable、DSMU_FilterConfigRegChannel、DSMU_FilterConfigInjChannel、DSMU_FilterGetRegularValue、DSMU_FilterGetInjectedValue

模拟看门狗与极值检测

DSMU_FilterAwdStart、DSMU_FilterAwdStop、DSMU_FilterExdStart、DSMU_FilterExdStop、DSMU_FilterGetExdMaxValue、DSMU_FilterGetExdMinValue、DSMU_FilterGetConvTimeValue

转换控制

DSMU_RegConvStart、DSMU_RegConvStop、DSMU_InjConvStart、DSMU_InjConvStop

标志、中断与 DMA

DSMU_GetFlagStatus、DSMU_ClearFlag、DSMU_GetAwdFlagStatus、DSMU_ClearAwdFlag、DSMU_ConfigInt、DSMU_ConfigRegChDMA、DSMU_ConfigInjChDMA

void DSMU_DeInit(void)将 DSMU 反初始化。
源码注释
name   DSMU_DeInit.
fun    Deinitialize the DSMU.
param  none.
return none.
void DSMU_InitChannelStruct(DSMU_Channel_InitType* DSMU_ChannelInitStruct)将 DSMU 通道初始化结构体设置为默认值。
源码注释
name   DSMU_InitChannelStruct.
fun    Set the initialize structure of DSMU channel to default value.
param  DSMU_ChannelyInitStruct
          - OutputClock:
             - Activation
             - Selection
             - Divider
          - Input:
             - Multiplexer
             - DataPacking
             - Pins
          - SerialInterface
             - Type
             - SpiClock
          - Awd:
             - FilterOrder
             - Oversampling
          - Offset
          - RightBitShift
return none.
void DSMU_InitFilterStruct(DSMU_Filter_InitType* DSMU_FilterInitStruct)将 DSMU 滤波器初始化结构体设置为默认值。
源码注释
name   DSMU_InitFilterStruct.
fun    Set the initialize structure of DSMU filter to default value.
param  DSMU_FilterInitStruct
          - RegularParam:
             - DmaMode
             - FastMode
             - Trigger
          - InjectedParam:
             - ScanMode
             - DmaMode
             - Trigger
             - ExtTrigger
          - FilterParam:
             - SincOrder
             - Oversampling
             - IntOversampling
return none.
ErrorStatus DSMU_ChannelInit(DSMU_Channel_Submodule* DSMU_Channely, DSMU_Channel_InitType* DSMU_ChannelInitStruct)按指定参数初始化 DSMU 通道。
源码注释
name   DSMU_ChannelInit.
fun    Initialize the DSMU channel according to the specified parameters
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
param  DSMU_ChannelyInitStruct
          - OutputClock:
             - Activation:
                - DISABLE
                - ENABLE
             - Selection:
                - DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM
                - DSMU_CHANNEL_OUTPUT_CLOCK_AUDIO
             - Divider:
                - This parameter must be a number between Min_Data = 2 and Max_Data = 256.
          - Input:
             - Multiplexer:
                - DSMU_CHANNEL_EXTERNAL_INPUTS
                - DSMU_CHANNEL_ADC_OUTPUT
                - DSMU_CHANNEL_INTERNAL_REGISTER
             - DataPacking:
                - DSMU_CHANNEL_STANDARD_MODE
                - DSMU_CHANNEL_INTERLEAVED_MODE
                - DSMU_CHANNEL_DUAL_MODE
             - Pins:
                - DSMU_CHANNEL_SAME_CHANNEL_PINS
                - DSMU_CHANNEL_FOLLOWING_CHANNEL_PINS
          - SerialInterface:
             - Type:
                - DSMU_CHANNEL_SPI_RISING
                - DSMU_CHANNEL_SPI_FALLING
                - DSMU_CHANNEL_MANCHESTER_RISING
                - DSMU_CHANNEL_MANCHESTER_FALLING
             - SpiClock:
                - DSMU_CHANNEL_SPI_CLOCK_EXTERNAL
                - DSMU_CHANNEL_SPI_CLOCK_INTERNAL
                - DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING
                - DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING
          - Awd:
             - FilterOrder:
                - DSMU_AWD_FASTSINC_ORDER
                - DSMU_AWD_SINC1_ORDER
                - DSMU_AWD_SINC2_ORDER
                - DSMU_AWD_SINC3_ORDER
             - Oversampling:
                - This parameter must be a number between Min_Data = 1 and Max_Data = 32.
          - Offset:
             - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607.
          - RightBitShift:
             - This parameter must be a number between Min_Data = 0 and Max_Data = 31.
return ErrorStatus:
          - SUCCESS
          - ERROR
void DSMU_ChannelDeInit(DSMU_Channel_Submodule* DSMU_Channely)将 DSMU 通道反初始化。
源码注释
name   DSMU_ChannelDeInit.
fun    Deinitialize the DSMU channel
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
return None.
void DSMU_ChannelCkAbEnable(DSMU_Channel_Submodule* DSMU_Channely)使能时钟丢失检测。
源码注释
name   DSMU_ChannelCkAbEnable.
fun    Enable clock absence detection
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
return none
void DSMU_ChannelCkAbDisable(DSMU_Channel_Submodule* DSMU_Channely)关闭时钟丢失检测。
源码注释
name   DSMU_ChannelCkAbDisable.
fun    Disable clock absence detection
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
return  none
void DSMU_ChannelScdStart(DSMU_Channel_Submodule* DSMU_Channely,uint32_t Threshold, uint32_t BreakSignal)启动短路检测并指定输出的断开信号。
源码注释
name   DSMU_ChannelScdStart.
fun    This function allows to start short circuit detection and assignment break signal.
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
param  Threshold Short circuit detector threshold.
              - This parameter must be a number between Min_Data = 0 and Max_Data = 255.
param  BreakSignal Break signals assigned to short circuit event.
          - DSMU_NO_BREAK_SIGNAL
          - DSMU_BREAK_SIGNAL_0
          - DSMU_BREAK_SIGNAL_1
          - DSMU_BREAK_SIGNAL_2
          - DSMU_BREAK_SIGNAL_3
return none
note   Same mode has to be used for all channels
void DSMU_ChannelScdStop(DSMU_Channel_Submodule* DSMU_Channely)停止短路检测。
源码注释
name   DSMU_ChannelScdStop.
fun    This function allows to stop short circuit detection.
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
return  none
int16_t DSMU_ChannelGetAwdValue(const DSMU_Channel_Submodule* DSMU_Channely)获取当前通道的模拟看门狗值。
源码注释
name   DSMU_ChannelGetAwdValue.
fun    This function allows to get analog watchdog value for current channel.
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
return Channel analog watchdog value.
void DSMU_ChannelModifyOffset(DSMU_Channel_Submodule* DSMU_Channely, int32_t Offset)修改通道偏移值。
源码注释
name   DSMU_ChannelModifyOffset.
fun    This function allows to modify channel offset value.
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
param  Offset DFSDM channel offset.
              - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607.
return none.
void DSMU_ChannelWriteData(DSMU_Channel_Submodule* DSMU_Channely,uint32_t data)向输入数据寄存器写入数据。
源码注释
name   DSMU_ChannelWriteData.
fun    This function allows to write data into input data register.
param  DSMU_Channely
          - DSMU_Channel0
          - DSMU_Channel1
          - DSMU_Channel2
          - DSMU_Channel3
          - DSMU_Channel4
          - DSMU_Channel5
          - DSMU_Channel6
          - DSMU_Channel7
param  data New data write by CPU.
return none.
ErrorStatus DSMU_FilterInit(DSMU_Filter_Submodule* DSMU_Filterx, DSMU_Filter_InitType* DSMU_FilterInitStruct)按指定参数初始化 DSMU 滤波器。
源码注释
name   DSMU_FilterInit.
fun    Initialize the DSMU filter according to the specified parameters
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  DSMU_FilterInitStruct
          - RegularParam:
             - DmaMode:
                - DISABLE
                - ENABLE
             - FastMode:
                - DISABLE
                - ENABLE
             - Trigger:
                - DSMU_FILTER_SW_TRIGGER
                - DSMU_FILTER_SYNC_TRIGGER
          - InjectedParam:
             - ScanMode:
                - DISABLE
                - ENABLE
             - DmaMode:
                - DISABLE
                - ENABLE
             - Trigger:
                - DSMU_FILTER_SW_TRIGGER
                - DSMU_FILTER_SYNC_TRIGGER
                - DSMU_FILTER_EXT_TRIGGER
             - ExtTrigger:
                - DSMU_FILTER_EXT_TRIG_ATIM1_TRGO
                - DSMU_FILTER_EXT_TRIG_ATIM2_TRGO
                - DSMU_FILTER_EXT_TRIG_ATIM3_TRGO
                - DSMU_FILTER_EXT_TRIG_ATIM4_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMB1_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMB2_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMB3_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMA1_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMA2_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMA3_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMA4_TRGO
                - DSMU_FILTER_EXT_TRIG_GTIMA5_TRGO
                - DSMU_FILTER_EXT_TRIG_ATIM1_TRGO2
                - DSMU_FILTER_EXT_TRIG_ATIM3_TRGO2
                - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG1
                - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG2
                - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG3
                - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG4
                - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG1
                - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG2
                - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG3
                - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG4
                - DSMU_FILTER_EXT_TRIG_EXTI6
                - DSMU_FILTER_EXT_TRIG_EXTI7
                - DSMU_FILTER_EXT_TRIG_EXTI8
                - DSMU_FILTER_EXT_TRIG_EXTI9
                - DSMU_FILTER_EXT_TRIG_EXTI10
                - DSMU_FILTER_EXT_TRIG_EXTI11
                - DSMU_FILTER_EXT_TRIG_EXTI12
                - DSMU_FILTER_EXT_TRIG_EXTI13
                - DSMU_FILTER_EXT_TRIG_EXTI14
                - DSMU_FILTER_EXT_TRIG_EXTI15
          - FilterParam:
             - SincOrder:
                - DSMU_FILTER_FASTSINC_ORDER
                - DSMU_FILTER_SINC1_ORDER
                - DSMU_FILTER_SINC2_ORDER
                - DSMU_FILTER_SINC3_ORDER
                - DSMU_FILTER_SINC4_ORDER
                - DSMU_FILTER_SINC5_ORDER
             - Oversampling:
                - This parameter must be a number between Min_Data = 1 and Max_Data = 1024.
             - IntOversampling:
                - This parameter must be a number between Min_Data = 1 and Max_Data = 256.
return  ErrorStatus.
          - SUCCESS
          - ERROR
void DSMU_FilterEnable(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd)使能或关闭 DSMU 滤波器。
源码注释
name   DSMU_FilterEnable.
fun    Enable or Disable the DSMU filter.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   Cmd :
          - ENABLE
          - DISABLE
return None.
void DSMU_FilterConfigRegChannel(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t ChannelSelect,uint32_t ContinuousMode)选择规则通道并配置规则转换的连续模式。
源码注释
name   DSMU_FilterConfigRegChannel.
fun    This function allows to select regular channel and
       config continuous mode for regular conversion.
param  DSMU_Filterx:
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  ChannelSelect:
          - DSMU_CHANNEL_SELECT_0
          - DSMU_CHANNEL_SELECT_1
          - DSMU_CHANNEL_SELECT_2
          - DSMU_CHANNEL_SELECT_3
          - DSMU_CHANNEL_SELECT_4
          - DSMU_CHANNEL_SELECT_5
          - DSMU_CHANNEL_SELECT_6
          - DSMU_CHANNEL_SELECT_7
param  ContinuousMode Enable/disable continuous mode for regular conversion.
          - DSMU_CONTINUOUS_CONV_OFF
          - DSMU_CONTINUOUS_CONV_ON
return  none
void DSMU_FilterConfigInjChannel(DSMU_Filter_Submodule* DSMU_Filterx,uint32_t ChannelSelect)选择注入转换使用的通道。
源码注释
name   DSMU_FilterConfigInjChannel.
fun    This function allows to select channels for injected conversion.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  ChannelSelect:
          - DSMU_CHANNEL_SELECT_0
          - DSMU_CHANNEL_SELECT_1
          - DSMU_CHANNEL_SELECT_2
          - DSMU_CHANNEL_SELECT_3
          - DSMU_CHANNEL_SELECT_4
          - DSMU_CHANNEL_SELECT_5
          - DSMU_CHANNEL_SELECT_6
          - DSMU_CHANNEL_SELECT_7
return  none
int32_t DSMU_FilterGetRegularValue(const DSMU_Filter_Submodule* DSMU_Filterx, uint32_t* Channel)获取规则转换结果。
源码注释
name   DSMU_FilterGetRegularValue.
fun    This function allows to get regular conversion value.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Channel Corresponding channel number of regular conversion.
return Regular conversion value
int32_t DSMU_FilterGetInjectedValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel)获取注入转换结果。
源码注释
name   DSMU_FilterGetInjectedValue.
fun    This function allows to get injected conversion value.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Channel Corresponding channel number of injected conversion.
return Injected conversion value
void DSMU_FilterAwdStart(DSMU_Filter_Submodule* DSMU_Filterx, DSMU_Filter_AwdParamType* awdParam)启动滤波器模拟看门狗。
源码注释
name   DSMU_FilterAwdStart.
fun    This function allows to start filter analog watchdog.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  awdParam DSMU filter analog watchdog parameters.
          - DataSource:
            - DSMU_FILTER_AWD_FILTER_DATA
            - DSMU_FILTER_AWD_CHANNEL_DATA
          - ChannelSelect:
            - DSMU_CHANNEL_SELECT_0
            - DSMU_CHANNEL_SELECT_1
            - DSMU_CHANNEL_SELECT_2
            - DSMU_CHANNEL_SELECT_3
            - DSMU_CHANNEL_SELECT_4
            - DSMU_CHANNEL_SELECT_5
            - DSMU_CHANNEL_SELECT_6
            - DSMU_CHANNEL_SELECT_7
          - HighThreshold:
             - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607.
          - LowThreshold:
             - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607.
          - HighBreakSignal:
            - DSMU_NO_BREAK_SIGNAL
            - DSMU_BREAK_SIGNAL_0
            - DSMU_BREAK_SIGNAL_1
            - DSMU_BREAK_SIGNAL_2
            - DSMU_BREAK_SIGNAL_3
          - LowBreakSignal:
            - DSMU_NO_BREAK_SIGNAL
            - DSMU_BREAK_SIGNAL_0
            - DSMU_BREAK_SIGNAL_1
            - DSMU_BREAK_SIGNAL_2
            - DSMU_BREAK_SIGNAL_3
return  none
void DSMU_FilterAwdStop(DSMU_Filter_Submodule* DSMU_Filterx)停止滤波器模拟看门狗。
源码注释
name   DSMU_FilterAwdStop.
fun    This function allows to stop filter analog watchdog.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
return  none
void DSMU_FilterExdStart(DSMU_Filter_Submodule* DSMU_Filterx,uint32_t ChannelSelect)启动极值检测功能。
源码注释
name   DSMU_FilterExdStart.
fun    This function allows to start extreme detector feature.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  ChannelSelect:
          - DSMU_CHANNEL_SELECT_0
          - DSMU_CHANNEL_SELECT_1
          - DSMU_CHANNEL_SELECT_2
          - DSMU_CHANNEL_SELECT_3
          - DSMU_CHANNEL_SELECT_4
          - DSMU_CHANNEL_SELECT_5
          - DSMU_CHANNEL_SELECT_6
          - DSMU_CHANNEL_SELECT_7
return  none
void DSMU_FilterExdStop(DSMU_Filter_Submodule* DSMU_Filterx)停止极值检测功能。
源码注释
name   DSMU_FilterExdStop.
fun    This function allows to stop extreme detector feature.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
return  none
int32_t DSMU_FilterGetExdMaxValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel)获取极值检测的最大值。
源码注释
name   DSMU_FilterGetExdMaxValue.
fun    This function allows to get extreme detector maximum value.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Channel Corresponding channel.
return Extreme detector maximum value
          - This value is between Min_Data = -8388608 and Max_Data = 8388607.
int32_t DSMU_FilterGetExdMinValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel)获取极值检测的最小值。
源码注释
name   DSMU_FilterGetExdMinValue.
fun    This function allows to get extreme detector minimum value.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Channel Corresponding channel.
return Extreme detector minimum value
          - This value is between Min_Data = -8388608 and Max_Data = 8388607.
uint32_t DSMU_FilterGetConvTimeValue(const DSMU_Filter_Submodule* DSMU_Filterx)获取转换时间值。
源码注释
name   DSMU_FilterGetConvTimeValue.
fun    This function allows to get conversion time value.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
return Conversion time value
note   To get time in second, this value has to be divided by DSMU clock frequency.
void DSMU_RegConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger)真正启动规则转换。
源码注释
name   DSMU_RegConvStart.
fun    This function allows to really start regular conversion.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Trigger
          - DSMU_FILTER_SW_TRIGGER
          - DSMU_FILTER_SYNC_TRIGGER
return None
void DSMU_RegConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger)真正停止规则转换。
源码注释
name   DSMU_RegConvStop.
fun    This function allows to really stop regular conversion.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Trigger
          - DSMU_FILTER_SW_TRIGGER
          - DSMU_FILTER_SYNC_TRIGGER
return None
void DSMU_InjConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger, uint32_t TiggerEdge)真正启动注入转换。
源码注释
name   DSMU_InjConvStart.
fun    This function allows to really start injected conversion.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Trigger
          - DSMU_FILTER_SW_TRIGGER
          - DSMU_FILTER_SYNC_TRIGGER
          - DSMU_FILTER_EXT_TRIGGER
param  TiggerEdge
          - DSMU_FILTER_EXT_TRIG_DISABLE
          - DSMU_FILTER_EXT_TRIG_RISING_EDGE
          - DSMU_FILTER_EXT_TRIG_FALLING_EDGE
          - DSMU_FILTER_EXT_TRIG_BOTH_EDGES
return None
void DSMU_InjConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger)真正停止注入转换。
源码注释
name   DSMU_InjConvStop.
fun    This function allows to really stop injected conversion.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param  Trigger
          - DSMU_FILTER_SW_TRIGGER
          - DSMU_FILTER_SYNC_TRIGGER
          - DSMU_FILTER_EXT_TRIGGER
return None
FlagStatus DSMU_GetFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_IntFlag)检查指定的 DSMU 标志是否置位。
源码注释
name   DSMU_GetFlagStatus.
fun    Checks whether the DSMU flag has set or not.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   DSMU_Flag:
          This parameter must be one of the following:
          - DSMU_FLAG_SHORT_CIRCUIT_CH0
          - DSMU_FLAG_SHORT_CIRCUIT_CH1
          - DSMU_FLAG_SHORT_CIRCUIT_CH2
          - DSMU_FLAG_SHORT_CIRCUIT_CH3
          - DSMU_FLAG_SHORT_CIRCUIT_CH4
          - DSMU_FLAG_SHORT_CIRCUIT_CH5
          - DSMU_FLAG_SHORT_CIRCUIT_CH6
          - DSMU_FLAG_SHORT_CIRCUIT_CH7
          - DSMU_FLAG_CLOCK_ABSENCE_CH0
          - DSMU_FLAG_CLOCK_ABSENCE_CH1
          - DSMU_FLAG_CLOCK_ABSENCE_CH2
          - DSMU_FLAG_CLOCK_ABSENCE_CH3
          - DSMU_FLAG_CLOCK_ABSENCE_CH4
          - DSMU_FLAG_CLOCK_ABSENCE_CH5
          - DSMU_FLAG_CLOCK_ABSENCE_CH6
          - DSMU_FLAG_CLOCK_ABSENCE_CH7
          - DSMU_FLAG_REGULAR_ACTIVE
          - DSMU_FLAG_INJECT_ACTIVE
          - DSMU_FLAG_ANALOG_WATCHDOG
          - DSMU_FLAG_REGULAR_OVERRUN
          - DSMU_FLAG_INJECT_OVERRUN
          - DSMU_FLAG_REGULAR_END
          - DSMU_FLAG_INJECT_END
return FlagStatus:
          - SET
          - RESET
note: DSMU_FLAG_SHORT_CIRCUIT_CH0~7 and DSMU_FLAG_CLOCK_ABSENCE_CH0~7 only exist in DSMU_Filter0->FLTSTS.
void DSMU_ClearFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_IntFlagClear)清除指定 DSMU 的标志。
源码注释
name   DSMU_ClearFlag.
fun    Clears flags of the specified DSMU.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   DSMU_FlagClear :
          This parameter must be one of the following:
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH1
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH2
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH3
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH4
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH5
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH6
          - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH7
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH1
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH2
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH3
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH4
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH5
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH6
          - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH7
          - DSMU_CLEAR_FLAG_REGULAR_OVERRUN
          - DSMU_CLEAR_FLAG_INJECT_OVERRUN
return    none.
note: DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0~7 and DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0~7 only exist in DSMU_Filter0->FLTINTCLR.
FlagStatus DSMU_GetAwdFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_AwdFlag)检查 DSMU 模拟看门狗标志是否置位。
源码注释
name   DSMU_GetAwdFlagStatus.
fun    Checks whether the DSMU analog watchdog flag has set or not.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   DSMU_AwdFlag :
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH0
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH1
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH2
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH3
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH4
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH5
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH6
          - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH7
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH0
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH1
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH2
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH3
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH4
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH5
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH6
          - DSMU_AWD_FLAG_LOW_THRESHOLD_CH7
return FlagStatus:
          - SET
          - RESET
void DSMU_ClearAwdFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_AwdFlagClear)清除指定 DSMU 的模拟看门狗标志。
源码注释
name   DSMU_ClearAwdFlag.
fun    Clears analog watch dog flag of the specified DSMU.
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   DSMU_AwdFlagClear :
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH0
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH1
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH2
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH3
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH4
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH5
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH6
          - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH7
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH0
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH1
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH2
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH3
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH4
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH5
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH6
          - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH7
return    none.
void DSMU_ConfigInt(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_Int, FunctionalState Cmd)使能或关闭中断。
源码注释
name   DSMU_ConfigInt
fun    Enables or disables interrupt
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   DSMU_Int:
          This parameter must be one of the following:
          - DSMU_INT_CLOCK_ABSENCE
          - DSMU_INT_SHORT_CIRCUIT
          - DSMU_INT_ANALOG_WATCHDOG
          - DSMU_INT_REGULAR_OVERRUN
          - DSMU_INT_INJECT_OVERRUN
          - DSMU_INT_REGULAR_END
          - DSMU_INT_INJECT_END
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note: DSMU_INT_CLOCK_ABSENCE and DSMU_INT_SHORT_CIRCUIT only exist in DSMU_Filter0->FLTCTRL2.
void DSMU_ConfigRegChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd)使能或关闭规则通道 DMA。
源码注释
name    DSMU_ConfigRegChDMA
fun     Enables or disables regular channel DMA
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void DSMU_ConfigInjChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd)使能或关闭注入通道 DMA。
源码注释
name    DSMU_ConfigInjChDMA
fun     Enables or disables injected channel DMA
param  DSMU_Filterx
          - DSMU_Filter0
          - DSMU_Filter1
          - DSMU_Filter2
          - DSMU_Filter3
param   Cmd :
          - ENABLE
          - DISABLE
return  none

5.8.3 Demo 示例说明

本节说明 DSMU 的 3 个示例:DSMU_DataFilter 用 CPU 写数据寄存器模拟输入并对比滤波前后的抖动,DSMU_ADCFilter 对内部 ADC2 的采样数据做滤波与过采样,DSMU_ExtADC 对外接 Σ-Δ ADC 的串行数据做滤波。

5.8.3.1 DSMU_DataFilter CPU 写入数据的滤波

工程目录: projects/n32h49x_EVAL/examples/DSMU/DSMU_DataFilter/

初始化打印串口并配置 DSMU 时钟→把通道 0 配为 CPU 直接写入、滤波器 0 配为 Sinc2 滤波与 16 倍过采样→主循环向通道 0 数据寄存器循环写入带抖动的输入数据→规则转换结束中断把滤波结果存入输出缓冲→缓冲满后统计输入与输出的抖动→串口打印抖动并判定测试是否通过

项目 源码解读
功能 演示 DSMU 的基本用法:用 CPU 直接写数据寄存器的方式产生带抖动的输入信号,经滤波器 0 的 Sinc2、16 倍过采样处理后,统计并对比滤波前后的信号抖动。
源码组成 src/main.c:main、DSMU_Configuration、输入数据表 DataOffset 与抖动统计;
src/n32h49x_it.c:DSMU_FLT0_IRQHandler 中断服务函数;
inc/main.h:包含头文件与宏定义;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 通道 0 的 Multiplexer 为 DSMU_CHANNEL_INTERNAL_REGISTER,由 CPU 写数据寄存器输入;
滤波器 0 为 DSMU_FILTER_SINC2_ORDER、16 倍滤波器过采样、积分器旁路,规则通道连续转换并使能 DSMU_INT_REGULAR_END。
DSMU 滤波时钟分频为 RCC_DSMU_FLT_DIV2,系统时钟为 HSI+PLL、240 MHz。
程序与数据路径 main 配置 DSMU 并统计输入数据的最大正负抖动后进入循环:每次把 BASE_DATA+DataOffset[...] 写入通道 0;
规则转换结束中断把 DSMU_FilterGetRegularValue 的结果存入 DataOut,缓冲满 16 个后置位 flag_data;
main 在标志置位后统计输出抖动,跑满 TEST_CYCLE 后打印输入与输出抖动并给出 test OK 或 test fail。
主要 API DSMU_ChannelInit、DSMU_FilterInit、DSMU_FilterConfigRegChannel、DSMU_ChannelWriteData、DSMU_ConfigInt、DSMU_RegConvStart、DSMU_FilterGetRegularValue
验证方法 复位运行后串口打印 DSMU data filter demo!;
测试结束后打印输入数据的 +N/-N 抖动与滤波后输出数据的抖动;
输出抖动小于输入抖动时打印 DSMU data filter test OK!,否则打印 DSMU test fail:x!。
使用提示 数据经滤波器与积分器处理后会放大,DSMU_Configuration 会先检查 BASE_DATA 是否会导致溢出;
输入数据的绝对值须小于 MAX_DATA_OFFSET。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把 CPU 写入的数据经过滤波器 0 的 Sinc2 与 16 倍过采样处理,并在规则转换结束中断里收集结果,用抖动对比验证滤波效果。

数据路径: CPU 写入 DSMU_Channel0 的数据寄存器 → 滤波器 0 的 Sinc2、16 倍过采样 → 规则转换结束中断 → DSMU_FilterGetRegularValue 取出结果存入 DataOut → 主循环统计滤波前后的抖动

1. 配置通道与滤波器参数。 DSMU_Configuration 填入 ChCfg 与 FilterCfg,通道选择 CPU 直接输入,滤波器选择 Sinc2 与 16 倍过采样。

src/main.csrc/main.c · DSMU_Configuration
    /* Clock output parameter */
    ChCfg.OutputClock.Activation    = DISABLE;
    ChCfg.OutputClock.Selection     = DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM;
    ChCfg.OutputClock.Divider       = 1;

    /* Input channel parameter */
    ChCfg.Input.Multiplexer = DSMU_CHANNEL_INTERNAL_REGISTER;
    ChCfg.Input.DataPacking = DSMU_CHANNEL_STANDARD_MODE;
    ChCfg.Input.Pins        = DSMU_CHANNEL_SAME_CHANNEL_PINS;
src/main.csrc/main.c · DSMU_Configuration
    /* Filter function parameter */
    FilterCfg.FilterParam.SincOrder = FILTER_ORDER;
    FilterCfg.FilterParam.Oversampling = FILTER_OVERSAMPLE;
    FilterCfg.FilterParam.IntOversampling = INTEGRATOR_OVERSAMPLE;

    /* Config current filter */
    DSMU_FilterInit(DSMU_Filter0, &FilterCfg );

积分器过采样为 1 时旁路积分器,RightBitShift 取滤波器与积分器的总过采样位数,用于把累加结果还原为有符号数据。

2. 使能连续转换与结束中断并启动。 规则通道配置为连续模式,使能规则转换结束中断,配置 NVIC 后启动规则转换。

src/main.csrc/main.c · DSMU_Configuration
    /* Enable regular channel in continuous mode */
    DSMU_FilterConfigRegChannel(DSMU_Filter0,DSMU_CHANNEL_SELECT_0,DSMU_CONTINUOUS_CONV_ON);
    
    /* Enable regular conversion end interrupt  */
    DSMU_ConfigInt(DSMU_Filter0,DSMU_INT_REGULAR_END, ENABLE);

    /* NVIC configuration */
    NVIC_Cfg.NVIC_IRQChannel = DSMU_FLT0_IRQn;
    NVIC_Cfg.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_Cfg.NVIC_IRQChannelSubPriority = 0;
    NVIC_Cfg.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_Cfg);
    
    /* Start regular conversion*/
    DSMU_RegConvStart(DSMU_Filter0, DSMU_FILTER_SW_TRIGGER);

3. 主循环写入带抖动的输入数据。 每轮把基准值与偏移量之和写入通道 0,模拟输入信号,并累加输入计数。

src/main.csrc/main.c · main
    while(1)
    {
        /* Input data by writting register */
        DSMU_ChannelWriteData(DSMU_Channel0,(uint32_t)(BASE_DATA+DataOffset[InputNum%INPUT_BUF_SIZE]));
        InputNum++;

DataOffset[] 数组决定输入抖动的幅度与分布,BASE_DATA 为输入基准值;更换仿真波形时只改这张数组。

4. 中断服务函数收集滤波结果。 DSMU_FLT0_IRQHandler 在规则转换结束时取结果,缓冲满 16 个后置位标志并累加测试次数。

src/n32h49x_it.csrc/n32h49x_it.c · DSMU_FLT0_IRQHandler
    if(DSMU_GetFlagStatus(DSMU_Filter0, DSMU_FLAG_REGULAR_END) == SET)
    {
        DataOut[cnt] = DSMU_FilterGetRegularValue(DSMU_Filter0, &ch);

        cnt++;
        if(cnt < OutputBufSize)
        {
            return;
        }
        else
        {
            cnt = 0;
            TestCycle++;
            flag_data = 1;
        }
    }

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

5.8.3.2 DSMU_ADCFilter ADC 采样数据滤波

工程目录: projects/n32h49x_EVAL/examples/DSMU/DSMU_ADCFilter/

初始化打印串口、DSMU 与 ADC2 时钟→把 ADC2 通道 17 接入 DSMU、滤波器 0 配为 Sinc2 与 16 倍过采样→启动 ADC2 规则转换并反复软件触发→每次转换结束读回数据并送入 DSMU 滤波→规则转换结束中断收集滤波结果→缓冲满后关闭滤波器并打印 ADC 与滤波数据的范围

项目 源码解读
功能 演示 DSMU 对 MCU 内置 ADC 采样数据的滤波与过采样:ADC2 通道 17(PH3)的转换结果作为 DSMU 输入,经滤波器 0 的 Sinc2、16 倍过采样与 4 倍积分器过采样处理后输出,对比滤波前后的数据范围。
源码组成 src/main.c:main、DSMU_Configuration、ADC2_Initial、ADC_GPIO_Configuration、GetDataRange;
src/n32h49x_it.c:DSMU_FLT0_IRQHandler 中断服务函数;
inc/main.h:包含头文件与宏定义;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 ADC2 通道 17(PH3)为模拟输入,采样时间为 ADC_SAMP_TIME_CYCLES_28_5,转换模式为 ADC_WORKMODE_INDEPENDENT、12 位分辨率;
DSMU 通道 1 的 Multiplexer 为 DSMU_CHANNEL_ADC_OUTPUT;
滤波器 0 为 DSMU_FILTER_SINC2_ORDER、16 倍滤波器过采样、4 倍积分器过采样,规则通道连续转换并使能 DSMU_INT_REGULAR_END。
系统时钟为 HSI+PLL、240 MHz。
程序与数据路径 main 配置 DSMU 与 ADC2 后使能 ADC2 软件启动;
循环中每次 ADC_FLAG_ENDC 置位就读出 ADC_GetDat、清除标志并再次启动转换,同时把结果记入 ADC_Data;
规则转换结束中断把 DSMU_FilterGetRegularValue 的结果存入 DataOut,缓冲满 32 个后关闭滤波器并置位 flag_data;
main 退出循环后停止 ADC,并打印 ADC 采样与滤波数据的范围。
主要 API DSMU_ChannelInit、DSMU_FilterInit、DSMU_FilterConfigRegChannel、DSMU_ConfigInt、DSMU_RegConvStart、DSMU_FilterGetRegularValue、DSMU_FilterEnable、ADC_SetAdcDSMUChannel、ADC_EnableAdcDSMU
验证方法 先连接跳线 J18,复位运行后串口打印 DSMU ADC data filter test start!;
测试结束后打印滤波前 ADC 采样数量与范围、滤波后数据范围;
滤波后数据的极差应小于 ADC 采样的极差,最后打印 ADC data filter by DSMU test finish!。
使用提示 DSMU 滤波会大幅降低最终数据的采样率;
DSMU 仅支持对 1 个 ADC 规则通道进行数据滤波,ADC_SetAdcDSMUChannel 无法区分多个 ADC 通道。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例让 ADC2 的规则转换结果自动进入 DSMU 通道 1,由滤波器 0 完成 Sinc2 与多倍过采样,再把滤波前后的数据范围作对比。

数据路径: ADC2 通道 17(PH3)转换 → ADC_SetAdcDSMUChannel 把该通道接入 DSMU → DSMU 通道 1(DSMU_CHANNEL_ADC_OUTPUT)→ 滤波器 0 的 Sinc2、16 倍过采样与 4 倍积分器过采样 → 规则转换结束中断 → DSMU_FilterGetRegularValue 结果存入 DataOut → 主循环打印滤波前后范围

1. ADC2 校准并把通道接入 DSMU。 ADC2_Initial 使能 ADC2、等待就绪、执行单端校准,再把通道 17 配置为规则通道并接入 DSMU。

src/main.csrc/main.c · ADC2_Initial
    /* Enable ADCx */
    ADC_Enable(ADC2, ENABLE);
    /*Check ADC Ready*/
    while(ADC_GetFlagStatus(ADC2,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADCx calibration */
    ADC_CalibrationOperation(ADC2, ADC_CALIBRATION_SINGLE_MODE);
    /* Check the end of ADCx calibration */
    while (ADC_GetCalibrationStatus(ADC2, ADC_CALIBRATION_SINGLE_MODE))
        ;
    
    /* ADC channel configuration */
    ADC_ConfigRegularChannel(ADC2, ADC2_Channel_17_PH3, 1, ADC_SAMP_TIME_CYCLES_28_5);
    ADC_SetAdcDSMUChannel(ADC2, ADC2_Channel_17_PH3,ENABLE);
    ADC_EnableAdcDSMU(ADC2, ENABLE);

DSMU 的数据源改为 DSMU_CHANNEL_ADC_OUTPUT 后,ADC2 的转换结果由硬件送入通道 1,无需 CPU 搬运。

2. 配置通道输入源与规则通道。 通道 1 选择 ADC 输出作为输入,规则通道选择通道 1 并配置为连续转换。

src/main.csrc/main.c · DSMU_Configuration
    /* Input channel parameter */
    ChCfg.Input.Multiplexer = DSMU_CHANNEL_ADC_OUTPUT;
    ChCfg.Input.DataPacking = DSMU_CHANNEL_STANDARD_MODE;
    ChCfg.Input.Pins        = DSMU_CHANNEL_SAME_CHANNEL_PINS;
src/main.csrc/main.c · DSMU_Configuration
    /* Enable regular channel in continuous mode */
    DSMU_FilterConfigRegChannel(DSMU_Filter0,DSMU_CHANNEL_SELECT_1,DSMU_CONTINUOUS_CONV_ON);

3. 主循环读回 ADC 并重新启动转换。 每次 ADC_FLAG_ENDC 置位就读出数据、清除标志并在缓冲未满时再次启动软件转换。

src/main.csrc/main.c · main
    while(1)
    {
        /* If DSMU output data buffer is full, break loop */
        if(flag_data)
        {
            break;
        }
        
        /* Get an ADC data, and start conversion again */
        if(ADC_GetFlagStatus(ADC2, ADC_FLAG_ENDC) == SET)
        {
            ADC_ClearFlag(ADC2, ADC_FLAG_ENDC);
            ADC_ClearFlag(ADC2, ADC_FLAG_STR);
            
            ADC_Data[ADC_DataCnt] = ADC_GetDat(ADC2);
            ADC_DataCnt++;
            if(ADC_DataCnt >= ADC_DATA_LENGTH)
            {
                break;
            }
            
            ADC_EnableSoftwareStartConv(ADC2, ENABLE);
        }
    }

4. 中断收集结果并在满缓冲时关闭滤波器。 DSMU_FLT0_IRQHandler 逐个取出滤波结果,达到输出长度后关闭滤波器并置位标志。

src/n32h49x_it.csrc/n32h49x_it.c · DSMU_FLT0_IRQHandler
    if(DSMU_GetFlagStatus(DSMU_Filter0, DSMU_FLAG_REGULAR_END) == SET)
    {
        if(DataOutCnt < OutputBufSize)
        {
            DataOut[DataOutCnt] = (uint16_t)DSMU_FilterGetRegularValue(DSMU_Filter0, &ch);
            DataOutCnt++;
        }
        
        if(DataOutCnt >= OutputBufSize)
        {
            DSMU_FilterEnable(DSMU_Filter0,DISABLE);
            flag_data = 1;
        }
    }

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

5.8.3.3 DSMU_ExtADC 外接 ADC 数据滤波

工程目录: projects/n32h49x_EVAL/examples/DSMU/DSMU_ExtADC/

初始化打印串口、DMA 与 DSMU 时钟→把 PD3 配为时钟输出、PD7 配为串行数据输入→通道 4 采集外接 Σ-Δ ADC 数据、滤波器 0 用 Sinc3 过采样→DMA 从滤波器数据寄存器搬运结果→传输完成中断关闭 DMA 与滤波器→串口打印 128 个滤波结果

项目 源码解读
功能 演示 DSMU 对外接 Σ-Δ ADC(NSI1306M25)串行数据的数据处理:PD3 输出 DSMU 时钟,PD7 采集 ADC 的串行数据,经滤波器 0 的 Sinc3、32 倍过采样处理后由 DMA 搬运,串口打印 128 个滤波结果。
源码组成 src/main.c:main、DSMU_Configuration、DSMU_GPIO_Configuration、DSMU_DMA_Read_Config;
src/n32h49x_it.c:DMA1_Channel1_IRQHandler 中断服务函数;
inc/main.h:包含头文件与宏定义;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 通道 4 的 Multiplexer 为 DSMU_CHANNEL_EXTERNAL_INPUTS,串行接口为 DSMU_CHANNEL_SPI_FALLING 且使用内部 SPI 时钟;
输出时钟选择 DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM、分频值为 12(PD3-CKOUT,20 MHz);
滤波器 0 为 DSMU_FILTER_SINC3_ORDER、32 倍滤波器过采样、积分器旁路。
系统时钟为 HSI+PLL、240 MHz;
DMA1 通道 1 从 DSMU_Filter0->FLTRDATA 搬运 128 个字。
程序与数据路径 main 初始化日志、DMA 与 GPIO 后配置 DSMU,并启动规则转换与 DMA;
DMA1 通道 1 一次搬运 128 个字,传输完成中断关闭 DMA 与滤波器并置位 flag_data;
main 在 flag_data 置位后逐个打印 DataOut(取 DSMU_FLTXRDAT_RDAT 后右移 8 位按十进制输出),最后打印测试结束提示;
规则通道由软件触发、连续转换。
主要 API DSMU_ChannelInit、DSMU_FilterInit、DSMU_FilterConfigRegChannel、DSMU_RegConvStart、DSMU_FilterEnable、DMA_Init、DMA_RequestRemap、DMA_EnableChannel
验证方法 全功能板上须把 J26 的 GND 与 VIN+ 通过跳线连接到其他 GND;
复位运行后串口打印 DSMU External Sigma-Delta ADC data filter test start!;
DMA 搬满 128 个字后串口输出 Filter data: 及 128 个滤波结果,最后打印 External Sigma-Delta ADC data filter by DSMU test finish!。
使用提示 通过 DSMU 滤波会大幅降低最终数据的采样率;
外接 ADC 的串行数据线接在 PD7-DATIN4,采样时序须与示例的 SPI 下降沿配置一致。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用 DSMU 从外接 Σ-Δ ADC 采集串行数据,经 Sinc3 滤波后由 DMA 一次搬出一整块结果,避免逐次软件读取。

数据路径: PD3 输出的 DSMU 时钟与 PD7 上的串行数据 → DSMU 通道 4(DSMU_CHANNEL_EXTERNAL_INPUTS,SPI 下降沿)→ 滤波器 0 的 Sinc3、32 倍过采样 → 规则通道连续转换 → DMA1 通道 1 从 DSMU_Filter0->FLTRDATA 搬运 128 个字 → 传输完成中断关闭 DMA 与滤波器 → 串口打印结果

1. 用宏定义滤波参数与输出长度。 头文件区域给出滤波器阶数、过采样倍数、输出数据长度以及存放结果的数组与标志。

src/main.csrc/main.c
/* Filter paramter for AD7402 15bit output:
    Data bits=3*log2(32)=15bits,
    and addtional 1 sign bit    */
#define FILTER_ORDER            (DSMU_FILTER_SINC3_ORDER)
#define FILTER_OVERSAMPLE       (32)    //must be 2^x
#define INTEGRATOR_OVERSAMPLE   (1)     //must be 2^x

/* Data offset define to get 16-bit sign data */
#define FILTER_DATA_OFFSET      (0)

/* DSMU output data size */
#define FILTER_DATA_LENGTH      (128)

/* Data after DMSU  filter */
int32_t DataOut[FILTER_DATA_LENGTH] = {0};
uint32_t DataOutCnt = 0;

uint32_t OutputBufSize = FILTER_DATA_LENGTH;

uint32_t flag_data = 0; /* Output data buf full */

FILTER_OVERSAMPLE 与 INTEGRATOR_OVERSAMPLE 须为 2 的幂;Sinc3 与 32 倍过采样对应 15 位有效数据,再加 1 位符号位。

2. 配置 DSMU 的时钟输出与串行输入引脚。 DSMU_GPIO_Configuration 把 PD3 配为复用推挽输出 DSMU 时钟,把 PD7 配为复用输入接收串行数据。

src/main.csrc/main.c · DSMU_GPIO_Configuration
    /* Configure PD3 as alternate output fuction DSMU_CKOUT */
    GPIO_InitStructure.Pin            = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Pull      = GPIO_NO_PULL;
    GPIO_InitStructure.GPIO_Current   = GPIO_DC_2mA;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF_DSMU_CKOUT_PD3;
    GPIO_InitPeripheral(GPIOD, &GPIO_InitStructure );
    
    /* Configure PD7 as input mode with alternate fuction DSMU_DATIN4 */
    GPIO_InitStructure.Pin            = GPIO_PIN_7;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_INPUT;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF_DSMU_DATIN4_PD7;
    GPIO_InitPeripheral(GPIOD, &GPIO_InitStructure );

3. 配置通道与滤波器并启动转换。 通道 4 选择外部输入并使用内部 SPI 时钟,滤波器使能规则通道 DMA 并配置为连续转换,最后软件启动规则转换。

src/main.csrc/main.c · DSMU_Configuration
    /* Clock output parameter */
    ChCfg.OutputClock.Activation    = ENABLE;
    ChCfg.OutputClock.Selection     = DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM;
    ChCfg.OutputClock.Divider       = 12;

    /* Input channel parameter */
    ChCfg.Input.Multiplexer = DSMU_CHANNEL_EXTERNAL_INPUTS;
    ChCfg.Input.DataPacking = DSMU_CHANNEL_STANDARD_MODE;
    ChCfg.Input.Pins        = DSMU_CHANNEL_SAME_CHANNEL_PINS;
src/main.csrc/main.c · DSMU_Configuration
    /* Regular channel parameter */
    FilterCfg.RegularParam.DmaMode = ENABLE;
    FilterCfg.RegularParam.FastMode = DISABLE;
    FilterCfg.RegularParam.Trigger = DSMU_FILTER_SW_TRIGGER;
src/main.csrc/main.c · DSMU_Configuration
    /* Enable regular channel in continuous mode */
    DSMU_FilterConfigRegChannel(DSMU_Filter0,DSMU_CHANNEL_SELECT_4,DSMU_CONTINUOUS_CONV_ON);
    
    /* Start regular conversion*/
    DSMU_RegConvStart(DSMU_Filter0, DSMU_FILTER_SW_TRIGGER);

4. 用 DMA 搬运结果并在完成时收尾。 DSMU_DMA_Read_Config 把 DMA1 通道 1 的源设为滤波器数据寄存器,传输完成中断关闭 DMA 与滤波器。

src/main.csrc/main.c · DSMU_DMA_Read_Config
    /* Reset DMA1 channel 1*/
    DMA_DeInit(DMA1_CH1);
    /* Selcect DMA request as DSMU filter 0 */
    DMA_RequestRemap(DMA_REMAP_DSMU_FILT0,DMA1_CH1,ENABLE);
    
    /* Config channel 0 */
    DMA_Cfg.PeriphAddr     = (uint32_t)(&(DSMU_Filter0->FLTRDATA));
    DMA_Cfg.MemAddr        = (uint32_t)DstAddr;
    DMA_Cfg.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_Cfg.BufSize        = DataLen;
    DMA_Cfg.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_Cfg.MemoryInc      = DMA_MEM_INC_ENABLE;
    DMA_Cfg.PeriphDataSize = DMA_PERIPH_DATA_WIDTH_WORD;
    DMA_Cfg.MemDataSize    = DMA_MEM_DATA_WIDTH_WORD;
    DMA_Cfg.CircularMode   = DMA_MODE_NORMAL;
    DMA_Cfg.Priority       = DMA_PRIORITY_HIGH;
    DMA_Cfg.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Cfg.BurstCmd   = DMA_BURST_DISABLE;
    DMA_Cfg.BurstMode     = DMA_BURST_MODE_ALMOST;
    DMA_Cfg.BurstLen      = DMA_BURST_LEN_SINGLE;
    DMA_Init(DMA1_CH1, &DMA_Cfg);

    DMA_ConfigInt(DMA1_CH1,DMA_INT_TXC,ENABLE);
    DMA_EnableChannel(DMA1_CH1, ENABLE);
src/n32h49x_it.csrc/n32h49x_it.c · DMA1_Channel1_IRQHandler
    if (DMA_GetIntStatus(DMA_INT_TXC1, DMA1) != RESET)
    {
       /* Clear  pending bit */
        DMA_ClrIntPendingBit(DMA_INT_TXC1, DMA1);
        
        /* Disable DMA */
        DMA_EnableChannel(DMA1_CH1,DISABLE);
        
        /* Disable filter */
        DSMU_FilterEnable(DSMU_Filter0, DISABLE);
        
        flag_data = 1;
    }

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

5.8.4 注意与排障

场景 检查与建议 来源
使能与停机限制 进入 STOP 模式前须先关闭 DSMU;
DSMUEN、时钟输出源与分频位只能在 DSMUEN=0 时写入。
用户手册
配置写入时机 通道的输入复用、数据打包、串行时钟、位偏移与 AWD 滤波等位只能在通道使能位 CHEN=0 时写入;
滤波器的触发、扫描、DMA 与滤波阶数、过采样等位只能在滤波器使能位 DFLTEN=0 时写入。
用户手册
外部触发与串行时钟 外部触发信号宽度须不小于 1 个 DSMU 时钟周期;
SPI 时钟范围为 0~20 MHz 且须小于 f_DSMU_CLK/4,Manchester 编码时钟范围为 0~10 MHz 且须小于 f_DSMU_CLK/6。
用户手册
双通道与引脚选择 双模式仅适用于偶数通道,奇数通道被写保护;
标准模式下选择 PDM 到两个 DATIN 时,偶数通道须与紧随其后的奇数通道配对使用。
用户手册
转换启动与通道使能 规则转换只能由软件启动,且同一时刻只允许一路规则转换和一路注入转换;
对未使能通道发起的转换不会结束。
用户手册
模拟看门狗与 DMA AWDFOSR=0 时旁路 AWD 滤波器,此时应在较高输入速率下配置,AWD 阈值在 AWDFSEL=1 时只使用高 16 位;
使用 DMA 读取结果时不应再通过软件读取同一数据寄存器,并须在中断中清除相应状态标志。
用户手册
国民技术开发套件文档中心

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

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