arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/etm/etm.h
2025-03-24 14:30:56 +08:00

1007 lines
34 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
*
* @brief ETM 驱动头文件.
*
******************************************************************************/
#ifndef ETM_H_
#define ETM_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "common.h"
/******************************************************************************
* ETM 返回值定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_ERR_SUCCESS 0 /*!< 返回成功 */
#define ETM_ERR_INVALID_PARAM 1 /*!< 返回无效参数 */
/*! @} */
/******************************************************************************
* ETM 通道号定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_CHANNEL_CHANNEL0 0 /*!< 通道0 */
#define ETM_CHANNEL_CHANNEL1 1 /*!< 通道1 */
#define ETM_CHANNEL_CHANNEL2 2 /*!< 通道2 */
#define ETM_CHANNEL_CHANNEL3 3 /*!< 通道3 */
#define ETM_CHANNEL_CHANNEL4 4 /*!< 通道4 */
#define ETM_CHANNEL_CHANNEL5 5 /*!< 通道5 */
#define ETM_CHANNELPAIR0 0 /*!< 通道对0:ch0 & ch1 */
#define ETM_CHANNELPAIR1 2 /*!< 通道对1:ch2 & ch3 */
#define ETM_CHANNELPAIR2 4 /*!< 通道对2:ch4 & ch5 */
/*! @} */
/******************************************************************************
* ETM PWM模式定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_PWMMODE_EDGEALLIGNED 1 /*!< 边沿对齐PWM */
#define ETM_PWMMODE_CENTERALLIGNED 2 /*!< 中央对齐PWM */
#define ETM_PWMMODE_COMBINE 3 /*!< 联合PWM */
/*! @} */
/******************************************************************************
* ETM 初始化值定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_MOD_INIT (20000-1) /*!< MOD 初始化值 */
#define ETM_C0V_INIT 1000 /*!< C0V 初始化值 */
#define ETM_C1V_INIT 1000 /*!< C1V 初始化值 */
#define ETM_C2V_INIT 1000 /*!< C2V 初始化值 */
#define ETM_C3V_INIT 1000 /*!< C3V 初始化值 */
#define ETM_C4V_INIT 1000 /*!< C4V 初始化值 */
#define ETM_C5V_INIT 1000 /*!< C5V 初始化值 */
/*! @} */
/******************************************************************************
* ETM 联合模式位定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_COMBINE_FAULTEN_MASK 0x40 /*!< 故障控制使能 */
#define ETM_COMBINE_SYNCEN_MASK 0x20 /*!< 同步使能 */
#define ETM_COMBINE_DTEN_MASK 0x10 /*!< 死区时间使能 */
#define ETM_COMBINE_DECAP_MASK 0x08 /*!< 双边沿捕获状态位 */
#define ETM_COMBINE_DECAPEN_MASK 0x04 /*!< 双边沿捕获使能位 */
#define ETM_COMBINE_COMP_MASK 0x02 /*!< 通道互补使能 */
#define ETM_COMBINE_COMBINE_MASK 0x01 /*!< 通道组合使能 */
/*! @} */
/******************************************************************************
* ETM 时钟源及分频系数定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_CLOCK_NOCLOCK 0 /*!< 禁用计数器 */
#define ETM_CLOCK_SYSTEMCLOCK 1 /*!< 系统时钟 */
#define ETM_CLOCK_FIXEDFREQCLOCK 2 /*!< 固定频率时钟 */
#define ETM_CLOCK_EXTERNALCLOCK 3 /*!< 外接时钟 */
/* 时钟分频系数 */
#define ETM_CLOCK_PS_DIV1 0 /*!< 1分频 */
#define ETM_CLOCK_PS_DIV2 1 /*!< 2分频 */
#define ETM_CLOCK_PS_DIV4 2 /*!< 4分频 */
#define ETM_CLOCK_PS_DIV8 3 /*!< 8分频 */
#define ETM_CLOCK_PS_DIV16 4 /*!< 16分频 */
#define ETM_CLOCK_PS_DIV32 5 /*!< 32分频 */
#define ETM_CLOCK_PS_DIV64 6 /*!< 64分频 */
#define ETM_CLOCK_PS_DIV128 7 /*!< 128分频 */
/*! @} */
/******************************************************************************
* ETM 死区时间预分频值
*
*//*! @死区时间预分频值
* @{
*******************************************************************************/
/* */
#define ETM_DEADETME_DTPS_DIV1 0 /*!< 1分频 */
#define ETM_DEADETME_DTPS_DIV4 2 /*!< 4分频 */
#define ETM_DEADETME_DTPS_DIV16 3 /*!< 16分频 */
/*! @} */
/******************************************************************************
* ETM 输出模式定义
*
*//*!
* @{
*******************************************************************************/
/* output mode */
#define ETM_OUTPUT_TOGGLE 1 /*!< 匹配时切换输出 */
#define ETM_OUTPUT_CLEAR 2 /*!< 匹配时清零输出 */
#define ETM_OUTPUT_SET 3 /*!< 匹配时置位输出 */
/*! @} */
/******************************************************************************
* ETM 输入捕捉边沿定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_INPUTCAPTURE_RISINGEDGE 1 /*!< 上升沿 */
#define ETM_INPUTCAPTURE_FALLINGEDGE 2 /*!< 下降沿 */
#define ETM_INPUTCAPTURE_BOTHEDGE 3 /*!< 双边沿 */
#define ETM_INPUTCAPTURE_DUALEDGE_NOEDGE 0 /*!< 无 */
#define ETM_INPUTCAPTURE_DUALEDGE_RISINGEDGE 1 /*!< 上升沿 */
#define ETM_INPUTCAPTURE_DUALEDGE_FALLInGEDGE 2 /*!< 下降沿 */
#define ETM_INPUTCAPTURE_DUALEDGE_BOTHEDGE 3 /*!< 双边沿 */
/*! @} */
/******************************************************************************
* ETM 双沿捕捉模式定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_INPUTCAPTURE_DUALEDGE_ONESHOT 4 /*!< 单次捕捉模式 */
#define ETM_INPUTCAPTURE_DUALEDGE_CONTINUOUS 5 /*!< 持续捕捉模式 */
/*! @} */
/******************************************************************************
* ETM 边沿PWM模式定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_PWM_HIGHTRUEPULSE 1 /*!< 高真脉冲 */
#define ETM_PWM_LOWTRUEPULSE 2 /*!< 低真脉冲 */
/*! @} */
/******************************************************************************
* ETM 同步触发源定义
*
*//*!
* @{
*******************************************************************************/
#define ETM_SYNC_TRIGGER_SOFTWARE 1 /*!< 软件同步 */
#define ETM_SYNC_TRIGGER_TRIGGER2 2 /*!< 硬件触发2同步, SIM_SOPT[ETMSYNC] */
#define ETM_SYNC_TRIGGER_TRIGGER1 3 /*!< 硬件触发1同步, ETM0CH0 */
#define ETM_SYNC_TRIGGER_TRIGGER0 4 /*!< 硬件触发0同步, ACMP0 */
/*! @} */
/******************************************************************************
* ETM 软件输出控制值
*
*//*!
* @{
*******************************************************************************/
#define ETM_SWOCTRL_HIGH 1 /*!< 软件输出高电平 */
#define ETM_SWOCTRL_LOW 0 /*!< 软件输出低电平 */
/*! @} */
/******************************************************************************
* ETM 通道极性设置
*
*//*!
* @{
*******************************************************************************/
#define ETM_POLARITY_HIGHACTIVE 0 /*!< 通道极性高电平有效 */
#define ETM_POLARITY_LOWACTIVE 1 /*!< 通道极性低电平有效 */
/*! @} */
/******************************************************************************
******************************************************************************/
/*! @brief ETM_CALLBACK ETM回调类型定义 */
typedef void (*ETM_CallbackPtr)(void);
/*! @} */
/******************************************************************************
* ETM 参数配置结构体.
*
*//*!
* @{
*******************************************************************************/
/*!
* @brief ETM 参数配置结构体.
*
*/
typedef struct
{
uint8_t clk_source; /*!< 时钟源 */
uint8_t prescaler; /*!< 时钟分频系数 */
uint8_t sc; /*!< 状态和控制 */
uint16_t modulo; /*!< 计数模值 */
uint16_t cnt; /*!< 计数值 */
uint16_t cntin; /*!< 计数初始值 */
uint8_t mode; /*!< 特性模式选择 */
uint8_t sync; /*!< 同步模式 */
uint8_t outinit; /*!< 通道输出初始配置 */
uint8_t outmask; /*!< 输出屏蔽 */
uint32_t combine; /*!< 通道联合 */
uint16_t deadETMe; /*!< 死区时间插入控制 */
uint8_t exttrig; /*!< 外部触发 */
uint8_t pol; /*!< 通道极性 */
uint16_t filter; /*!< 输入滤波控制 */
uint8_t fms; /*!< 故障模式状态 */
uint16_t fltctrl; /*!< 故障控制 */
uint8_t fltpol; /*!< 故障输入极性 */
uint16_t conf; /*!< ETM配置 */
uint32_t synconf; /*!< 同步配置 */
uint8_t invctrl; /*!< 反相控制 */
uint16_t swoctrl; /*!< 软件输出控制 */
uint16_t pwmload; /*!< PWM装载 */
} ETM_ConfigType, *ETM_ConfigPtr;
/*! @} */
/******************************************************************************
* ETM 通道配置结构体.
*
*//*!
* @{
*******************************************************************************/
/*!
* @brief ETM 通道配置结构体.
*
*/
typedef struct
{
uint8_t u8CnSC; /*!< ETM 通道状态和控制 */
uint16_t u16CnV; /*!< ETM 通道值控制 */
union
{
uint32_t u32dw;
struct
{
uint32_t bMode : 3; /*!< ETM模式选择: GPIO, 输入捕获, 输出比较, 边沿PWM, 中央对齐PWM,
* 联合PWM, 双边沿捕获
*/
uint32_t bEdge : 2; /*!< 边沿选择 */
uint32_t bOutCmp : 2; /*!< 翻转, 清零, 置位 */
uint32_t bPWMPol : 1; /*!< 高真脉冲, 低真脉冲 */
uint32_t bDualCapMode : 1; /*!< 双边沿捕捉模式: 单次, 连续模式 */
uint32_t bCHIE : 1; /*!< 使能通道中断 */
}bits;
}ctrl; /*!< ETM 通道特性控制 */
} ETM_ChParamsType;
/*! @} */
/*******************************************************************************/
/*!
* 内联函数
*/
/*******************************************************************************/
/*****************************************************************************//*!
*
* @brief 使能ETM定时器溢出中断.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_EnableOverflowInt(ETM_Type *pETM)
{
if(pETM->SC & ETM_SC_TOF_MASK)
{
pETM->SC &= ~ETM_SC_TOF_MASK;
}
pETM->SC |= ETM_SC_TOIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用ETM定时器溢出中断.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_DisableOverflowInt(ETM_Type *pETM)
{
pETM->SC &= ~ETM_SC_TOIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能通道中断.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
* @param[in] u8ETM_Channel 通道号.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_EnableChannelInt(ETM_Type *pETM, uint8_t u8ETM_Channel)
{
pETM->CONTROLS[u8ETM_Channel].CnSC |= ETM_CnSC_CHIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁止通道中断.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
* @param[in] u8ETM_Channel 通道号.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_DisableChannelInt(ETM_Type *pETM, uint8_t u8ETM_Channel)
{
pETM->CONTROLS[u8ETM_Channel].CnSC &= ~ETM_CnSC_CHIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 获取溢出标志位.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE uint8_t ETM_GetOverFlowFlag(ETM_Type *pETM)
{
return (pETM->SC & ETM_SC_TOF_MASK);
}
/*****************************************************************************//*!
*
* @brief 清除溢出标志位.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_ClrOverFlowFlag(ETM_Type *pETM)
{
if(pETM->SC & ETM_SC_TOF_MASK)
{
pETM->SC &= ~ETM_SC_TOF_MASK;
}
}
/*****************************************************************************//*!
*
* @brief 获取通道事件标志位.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
* @param[in] u8ETM_Channel 通道号.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE uint8_t ETM_GetChannelFlag(ETM_Type *pETM, uint8_t u8ETM_Channel)
{
return (pETM->CONTROLS[u8ETM_Channel].CnSC & ETM_CnSC_CHF_MASK);
}
/*****************************************************************************//*!
*
* @brief 清除通道事件标志位.
*
* @param[in] pETM 指向三个ETM定时器其中一个的基址.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_ClrChannelFlag(ETM_Type *pETM, uint8_t u8ETM_Channel)
{
pETM->CONTROLS[u8ETM_Channel].CnSC &= ~ETM_CnSC_CHF_MASK;
}
/*********************************************************************************//*!
*
* @brief 使能写保护功能.被写保护功能位不可写入(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_WriteProtectionEnable(ETM_Type *pETM)
{
pETM->FMS |= ETM_FMS_WPEN_MASK;
}
/*********************************************************************************//*!
*
* @brief 禁用写保护位.被写保护功能位可写(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_WriteProtectionDisable(ETM_Type *pETM)
{
if (pETM->FMS & ETM_FMS_WPEN_MASK)
{
pETM->MODE |= ETM_MODE_WPDIS_MASK;
}
}
/*****************************************************************************//*!
*
* @brief 置位 ETMEN 去使能ETM的一些特殊功能寄存器(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_SetETMEnhanced(ETM_Type *pETM)
{
if(pETM->MODE & ETM_MODE_WPDIS_MASK) /* 前提是没有进行写保护 */
{
pETM->MODE |= ETM_MODE_ETMEN_MASK;
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->MODE |= ETM_MODE_ETMEN_MASK;
ETM_WriteProtectionEnable(pETM);
}
}
/*****************************************************************************//*!
*
* @brief 清除 ETMEN 去禁用一些特殊功能寄存器, 只有一些基础模块可以使用(ETM2).
* @param[in] pETM ETM2.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_SetETMBasic(ETM_Type *pETM)
{
if(pETM->MODE & ETM_MODE_WPDIS_MASK) /* 前提是要没有进行写保护 */
{
pETM->MODE &= ~ETM_MODE_ETMEN_MASK;
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->MODE &= ~ETM_MODE_ETMEN_MASK;
ETM_WriteProtectionEnable(pETM);
}
}
/*****************************************************************************//*!
*
* @brief 设置 ETM 模值(ETM2).
*
* @param[in] pETM (ETM2).
* @param[in] u16ModValue 需要设置的16位模值.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_SetModValue(ETM_Type *pETM, uint16_t u16ModValue)
{
pETM->CNT = 0;
pETM->MOD = u16ModValue;
if(ETM2 == pETM)
{
if(pETM->MODE & ETM_MODE_ETMEN_MASK)
{
pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK;
}
else
{
}
}
else
{
}
}
/*****************************************************************************//*!
*
* @brief 设置 ETM 通道值(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u16ChannelValue 需要设置的16位通道值.
* @param[in] u8ETM_Channel 通道号.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_SetChannelValue(ETM_Type *pETM, uint8_t u8ETM_Channel, uint16_t u16ChannelValue)
{
pETM->CONTROLS[u8ETM_Channel].CnV = u16ChannelValue;
if(ETM2 == pETM)
{
if(pETM->MODE & ETM_MODE_ETMEN_MASK)
{
if(u8ETM_Channel < 2)
{
pETM->COMBINE |= ETM_COMBINE_SYNCEN0_MASK;
}
else if (u8ETM_Channel < 4)
{
pETM->COMBINE |= ETM_COMBINE_SYNCEN1_MASK;
}
else
{
pETM->COMBINE |= ETM_COMBINE_SYNCEN2_MASK;
}
pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK;
}
else
{
}
}
else
{
}
}
/*****************************************************************************//*!
*
* @brief 设置ETM的计数初始值(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u16CounterValue 需要设置的16位计数初始值.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_SetCounterInitValue(ETM_Type *pETM, uint16_t u16CounterValue)
{
pETM->CNTIN = u16CounterValue;
if(pETM->MODE & ETM_MODE_ETMEN_MASK)
{
pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK;
}
else
{
}
}
/*****************************************************************************//*!
*
* @brief 设置输出屏蔽寄存器的值(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u16ChMask 屏蔽的通道值6位对应ETM2的6个通道.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_MaskChannels(ETM_Type *pETM, uint16_t u16ChMask)
{
pETM->OUTMASK |= u16ChMask;
}
/*****************************************************************************//*!
*
* @brief 清除输出屏蔽寄存器的值(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u16ChMask 所要清除屏蔽的通道值6位对应ETM2的6个通道.
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void ETM_UnMaskChannels(ETM_Type *pETM, uint16_t u16ChMask)
{
pETM->OUTMASK &= ~u16ChMask;
}
/*********************************************************************************//*!
*
* @brief 设置 ETM 通道极性(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8ChsPolValue 所要设置的通道极性值6位对应ETM2的6个通道.
* 0为高电平有效1为低电平有效
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_SetChannelsPolarity(ETM_Type *pETM, uint8_t u8ChsPolValue)
{
pETM->POL = u8ChsPolValue;
}
/*********************************************************************************//*!
*
* @brief 获取 ETM 的通道极性值(ETM2).
*
* @param[in] pETM ETM2.
*
* @return 通道极性值.
*
*********************************************************************************/
__STATIC_INLINE uint8_t ETM_GetChannelsPolarity(ETM_Type *pETM)
{
return (pETM->POL);
}
/*********************************************************************************//*!
*
* @brief 设置增强PWM同步(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_EnableEnhancedSYNCMode(ETM_Type *pETM)
{
pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK;
}
/*********************************************************************************//*!
*
* @brief 设置传统PWM同步(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_DisableEnhancedSYNCMode(ETM_Type *pETM)
{
pETM->SYNCONF &= ~ETM_SYNCONF_SYNCMODE_MASK;
}
/*********************************************************************************//*!
*
* @brief 设置通道外部触发(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8TirggerSource 配置0-5这6个通道的触发
* 0禁止通道触发生产1使能通道触发生产
*
* @return none.
*
* @ Pass/ Fail criteria: none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_SetExternalTrigger(ETM_Type *pETM, uint8_t u8TirggerSource)
{
pETM->EXTTRIG = u8TirggerSource;
}
/*********************************************************************************//*!
*
* @brief 获取外部触发标志.
*
* @param[in] pETM ETM2.
*
* @return 通道触发标志.
*
*********************************************************************************/
__STATIC_INLINE uint8_t ETM_GetExternalTriggerFlag(ETM_Type *pETM)
{
return (pETM->EXTTRIG & ETM_EXTTRIG_TRIGF_MASK);
}
/*********************************************************************************//*!
*
* @brief 设置加载使能位(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_SetLoadEnable(ETM_Type *pETM)
{
pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK;
}
/*********************************************************************************//*!
*
* @brief 设置匹配过程中包括的通道.
*
* @param[in] pETM ETM2.
* @param[in] u8Matchchannel 匹配过程中所包括的通道.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_SetLoadMatchChannel(ETM_Type *pETM, uint8_t u8Matchchannel)
{
pETM->PWMLOAD |= u8Matchchannel;
}
/*********************************************************************************//*!
*
* @brief 禁用通道输入滤波器(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8ETM_Channel 通道号只有通道0-通道3包含.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_InputCaptureFilterClr(ETM_Type *pETM, uint8_t u8ETM_Channel)
{
pETM->FILTER &= ~(0x000F << (u8ETM_Channel << 2));
}
/*********************************************************************************//*!
*
* @brief 使能通道滤波器(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8ETM_Channel 通道号只有通道0-通道3包含.
* @param[in] u8FilterValue 滤波周期值:1~15, 0: 禁用通道滤波器.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_InputCaptureFilterSet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8FilterValue)
{
if (u8FilterValue)
{
pETM->FILTER |= (u8FilterValue << (u8ETM_Channel << 2));
}
else
{
ETM_InputCaptureFilterClr(pETM, u8ETM_Channel);
}
}
/*********************************************************************************//*!
*
* @brief 使能故障输入(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8FaultPin 故障输入通道号: 0~3.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinEnable(ETM_Type *pETM, uint8_t u8FaultPin)
{
if (pETM->MODE & ETM_MODE_WPDIS_MASK)
{
pETM->FLTCTRL |= (1 << u8FaultPin);
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->FLTCTRL |= (1 << u8FaultPin);
ETM_WriteProtectionEnable(pETM);
}
}
/*********************************************************************************//*!
*
* @brief 禁用故障输入(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8FaultPin 故障输入通道号: 0~3.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinDisable(ETM_Type *pETM, uint8_t u8FaultPin)
{
if (pETM->MODE & ETM_MODE_WPDIS_MASK)
{
pETM->FLTCTRL &= ~(1 << u8FaultPin);
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->FLTCTRL &= ~(1 << u8FaultPin);
ETM_WriteProtectionEnable(pETM);
}
}
/*********************************************************************************//*!
*
* @brief 使能故障输入滤波器(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8FaultPin 故障输入通道号: 0~3.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinFilterEnable(ETM_Type *pETM, uint8_t u8FaultPin)
{
if (pETM->MODE & ETM_MODE_WPDIS_MASK)
{
pETM->FLTCTRL |= (0x10 << u8FaultPin);
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->FLTCTRL |= (0x10 << u8FaultPin);
ETM_WriteProtectionEnable(pETM);
}
}
/*********************************************************************************//*!
*
* @brief 禁用故障输入滤波器(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8FaultPin 故障输入通道号: 0~3.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinFilterDisable(ETM_Type *pETM, uint8_t u8FaultPin)
{
if (pETM->MODE & ETM_MODE_WPDIS_MASK)
{
pETM->FLTCTRL &= ~(0x10 << u8FaultPin);
}
else
{
ETM_WriteProtectionDisable(pETM);
pETM->FLTCTRL &= ~(0x10 << u8FaultPin);
ETM_WriteProtectionEnable(pETM);
}
}
/*********************************************************************************//*!
*
* @brief 禁用所有的故障输入滤波器(ETM2).
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinFilterCDisableAll(ETM_Type *pETM)
{
pETM->FLTCTRL &= ~ETM_FLTCTRL_FFVAL_MASK;
}
/*********************************************************************************//*!
*
* @brief 设置故障输入滤波器值. 所有的故障通道都为这个值(ETM2).
*
* @param[in] pETM ETM2.
* @param[in] u8FilterValue 故障输入滤波器值: 1~15, 0 禁用滤波器.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE void ETM_FaultPinFilterSet(ETM_Type *pETM, uint8_t u8FilterValue)
{
if (u8FilterValue)
{
pETM->FLTCTRL |= ETM_FLTCTRL_FFVAL(u8FilterValue);
}
else
{
ETM_FaultPinFilterCDisableAll(pETM);
}
}
/*********************************************************************************//*!
*
* @brief 获取所有通道故障检测标志(ETM2)
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE uint8_t ETM_GetFaultDetectionLogicORFlag(ETM_Type *pETM)
{
return (pETM->FMS & ETM_FMS_FAULTF_MASK);
}
/*********************************************************************************//*!
*
* @brief 获取预期通道故障检测标志(ETM2)
*
* @param[in] pETM ETM2.
* @param[in] u8FaultPin 故障输入通道号: 0~3.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE uint8_t ETM_GetFaultDetectionFlag(ETM_Type *pETM, uint8_t u8FaultPin)
{
return (pETM->FMS & (1 << u8FaultPin));
}
/*********************************************************************************//*!
*
* @brief 获取“或”逻辑的故障输入(ETM2)
*
* @param[in] pETM ETM2.
*
* @return none.
*
*********************************************************************************/
__STATIC_INLINE uint8_t ETM_GetFaultInputsLogicORValue(ETM_Type *pETM)
{
return (pETM->FMS & ETM_FMS_FAULTIN_MASK);
}
/*! @} */
/******************************************************************************
******************************************************************************/
void ETM_ClockSet(ETM_Type *pETM, uint8_t u8ClockSource, uint8_t u8ClockPrescale);
void ETM_PWMInit(ETM_Type *pETM, uint8_t u8PWMModeSelect, uint8_t u8PWMEdgeSelect);
void ETM_InputCaptureInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CaptureMode);
void ETM_DualEdgeCaptureInit(ETM_Type *pETM, uint8_t u8ChannelPair, uint8_t u8CaptureMode,
uint8_t u8Channel_N_Edge, uint8_t u8Channel_Np1_Edge);
void ETM_OutputCompareInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CompareMode);
void ETM_SoftwareSync(ETM_Type *pETM);
void ETM_HardwareSync(ETM_Type *pETM, uint8_t u8TriggerN);
void ETM_HardwareSyncCombine(ETM_Type *pETM, uint8_t u8TriggerMask);
void ETM_GenerateTrig2(ETM_Type *pETM);
void ETM_PWMDeadETMeSet(ETM_Type *pETM, uint8_t u8PrescalerValue, uint8_t u8DeadETMeValue);
void ETM_OutputMaskSet(ETM_Type *pETM, uint8_t u8ETM_Channel);
void ETM_SWOutputControlSet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ChannelValue);
void ETM_SetDebugModeBehavior(ETM_Type *pETM, uint8_t u8DebugMode);
void ETM_SetTOFFrequency(ETM_Type *pETM, uint8_t u8TOFNUM);
void ETM_PolaritySet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ActiveValue);
void ETM_InvertChannel(ETM_Type *pETM, uint8_t u8ChannelPair);
void ETM_Init(ETM_Type *pETM, ETM_ConfigType *pConfig);
void ETM_DeInit(ETM_Type *pETM);
void ETM_ChannelInit(ETM_Type *pETM, uint8_t u8ETM_Channel, ETM_ChParamsType *pETM_ChParams);
void ETM_SetDutyCycleCombine(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8DutyCycle);
void ETM_SetCallback(ETM_Type *pETM, ETM_CallbackPtr pfnCallback);
void ETM_SyncConfigActivate(ETM_Type *pETM, uint32_t u32ConfigValue);
void ETM_SyncConfigDeactivate(ETM_Type * pETM, uint32_t u32ConfigValue);
uint8_t ETM_GetFaultDetectionLogicORFlag(ETM_Type *pETM);
uint8_t ETM_GetFaultDetectionFlag(ETM_Type *pETM, uint8_t u8FaultPin);
uint8_t ETM_GetFaultInputsLogicORValue(ETM_Type *pETM);
void ETM_WriteProtectionEnable(ETM_Type *pETM);
void ETM_WriteProtectionDisable(ETM_Type *pETM);
void ETM_FaultPinFilterCDisableAll(ETM_Type *pETM);
void ETM_FaultPinFilterSet(ETM_Type *pETM, uint8_t u8FilterValue);
void ETM_FaultPinFilterDisable(ETM_Type *pETM, uint8_t u8FaultPin);
void ETM_FaultPinFilterEnable(ETM_Type *pETM, uint8_t u8FaultPin);
void ETM_FaultPinEnable(ETM_Type *pETM, uint8_t u8FaultPin);
void ETM_FaultPinDisable(ETM_Type *pETM, uint8_t u8FaultPin);
void ETM_InputCaptureFilterClr(ETM_Type *pETM, uint8_t u8ETM_Channel);
void ETM_InputCaptureFilterSet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8FilterValue);
void ETM_SetLoadMatchChannel(ETM_Type *pETM, uint8_t u8Matchchannel);
void ETM_SetLoadEnable(ETM_Type *pETM);
uint8_t ETM_GetExternalTriggerFlag(ETM_Type *pETM);
void ETM_DisableEnhancedSYNCMode(ETM_Type *pETM);
void ETM_EnableEnhancedSYNCMode(ETM_Type *pETM);
uint8_t ETM_GetChannelsPolarity(ETM_Type *pETM);
void ETM_SetChannelsPolarity(ETM_Type *pETM, uint8_t u8ChsPolValue);
void ETM_UnMaskChannels(ETM_Type *pETM, uint16_t u16ChMask);
void ETM_MaskChannels(ETM_Type *pETM, uint16_t u16ChMask);
void ETM_SetCounterInitValue(ETM_Type *pETM, uint16_t u16CounterValue);
void ETM_SetChannelValue(ETM_Type *pETM, uint8_t u8ETM_Channel, uint16_t u16ChannelValue);
void ETM_SetModValue(ETM_Type *pETM, uint16_t u16ModValue);
void ETM_SetETMBasic(ETM_Type *pETM);
void ETM_SetETMEnhanced(ETM_Type *pETM);
void ETM_ClrChannelFlag(ETM_Type *pETM, uint8_t u8ETM_Channel);
uint8_t ETM_GetChannelFlag(ETM_Type *pETM, uint8_t u8ETM_Channel);
void ETM_ClrOverFlowFlag(ETM_Type *pETM);
uint8_t ETM_GetOverFlowFlag(ETM_Type *pETM);
void ETM_DisableChannelInt(ETM_Type *pETM, uint8_t u8ETM_Channel);
void ETM_EnableChannelInt(ETM_Type *pETM, uint8_t u8ETM_Channel);
void ETM_DisableOverflowInt(ETM_Type *pETM);
void ETM_EnableOverflowInt(ETM_Type *pETM);
void ETM_disblechannel(ETM_Type *pETM, uint8_t u8ETM_Channel);
#ifdef __cplusplus
}
#endif
#endif /* ETM_H_ */