Files
arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/etm/etm.h
T

1007 lines
34 KiB
C

/******************************************************************************
*
* @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_ */