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 参考
以下 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 倍过采样。
/* 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;
/* 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 后启动规则转换。
/* 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,模拟输入信号,并累加输入计数。
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 个后置位标志并累加测试次数。
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。
/* 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 并配置为连续转换。
/* 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;
/* Enable regular channel in continuous mode */
DSMU_FilterConfigRegChannel(DSMU_Filter0,DSMU_CHANNEL_SELECT_1,DSMU_CONTINUOUS_CONV_ON);
3. 主循环读回 ADC 并重新启动转换。 每次 ADC_FLAG_ENDC 置位就读出数据、清除标志并在缓冲未满时再次启动软件转换。
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 逐个取出滤波结果,达到输出长度后关闭滤波器并置位标志。
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. 用宏定义滤波参数与输出长度。 头文件区域给出滤波器阶数、过采样倍数、输出数据长度以及存放结果的数组与标志。
/* 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 配为复用输入接收串行数据。
/* 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 并配置为连续转换,最后软件启动规则转换。
/* 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;
/* Regular channel parameter */
FilterCfg.RegularParam.DmaMode = ENABLE;
FilterCfg.RegularParam.FastMode = DISABLE;
FilterCfg.RegularParam.Trigger = DSMU_FILTER_SW_TRIGGER;
/* 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 与滤波器。
/* 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);
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 读取结果时不应再通过软件读取同一数据寄存器,并须在中断中清除相应状态标志。 |
用户手册 |