1007 lines
34 KiB
C
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_ */
|