/** ****************************************************************************** * @file xl_ftm.c * @author Kirk ,xu.wang * @version 4.5.2 * @date Fri Mar 26 17:29:12 2021 * @brief This file provide function about FTM firmware program ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ /* Includes ---------------------------------------------------------------*/ #include "xl_ftm.h" /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @defgroup FTM FTM Module * @brief FTM Driver Modules Library * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup FTM_Private_Functions * @brief * @{ */ /** * @brief д±£»¤¹¦ÄÜʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_WriteProtectEnable(FTM_Type* FTMx) { FTMx->FMS |= FTM_FMS_WPEN_MASK; } /** * @brief д±£»¤¹¦ÄܽûÓÃ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_WriteProtectDisable(FTM_Type* FTMx) { FTMx->MODE |= FTM_MODE_WPDIS_MASK; } /** * @brief ÅäÖÃFTMxÍâÉè¼Ä´æÆ÷ΪĬÈÏÖµ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None. */ void FTM_DeInit(FTM_Type* FTMx) { /* disable channel */ FTMx->CONTROLS[0].CnSC = 0; FTMx->CONTROLS[0].CnV = 0; FTMx->CONTROLS[1].CnSC = 0; FTMx->CONTROLS[1].CnV = 0; FTMx->CONTROLS[2].CnSC = 0; FTMx->CONTROLS[2].CnV = 0; FTMx->CONTROLS[3].CnSC = 0; FTMx->CONTROLS[3].CnV = 0; if(FTMx == FTM2) { FTMx->CONTROLS[4].CnSC = 0; FTMx->CONTROLS[4].CnV = 0; FTMx->CONTROLS[5].CnSC = 0; FTMx->CONTROLS[5].CnV = 0; FTMx->CONTROLS[6].CnSC = 0; FTMx->CONTROLS[6].CnV = 0; FTMx->CONTROLS[7].CnSC = 0; FTMx->CONTROLS[7].CnV = 0; } /* disable the colck */ FTMx->SC = 0; FTMx->CNT=0; FTMx->MOD = 0; FTMx->CNTIN=0; FTMx->MODE = 0x4; FTMx->COMBINE = 0; FTMx->CNTIN = 0; FTMx->SYNC = 0; FTMx->OUTINIT = 0; FTMx->OUTMASK = 0; FTMx->DEADTIME = 0; FTMx->EXTTRIG = 0; FTMx->POL = 0; FTMx->FMS = 0; FTMx->FILTER = 0; FTMx->FLTCTRL = 0; FTMx->FLTPOL = 0; FTMx->CONF = 0; FTMx->SYNCONF = 0; FTMx->SWOCTRL = 0; FTMx->PWMLOAD = 0; } /** * @brief FTMxÍâÉè¼Ä´æÆ÷³õʼ»¯. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_InitStruct: Ö¸¶¨FTM_InitTypeDefÅäÖÃ. * @retval None. */ void FTM_Init(FTM_Type* FTMx, const FTM_InitTypeDef* FTM_InitStruct) { /*---------------------------- FTMx SC Configuration -----------------*/ /* write SC to enable clock */ FTMx->SC &= ~(FTM_SC_CLKS_MASK | FTM_SC_PS_MASK); FTMx->SC |= ((FTM_InitStruct->FTM_ClkSource << FTM_SC_CLKS_SHIFT)| (FTM_InitStruct->FTM_Prescaler)); /* At this step, return the status of initialization */ } /** * @brief FTMxÖ¸¶¨Í¨µÀ±ßÔµ¶ÔÆëPWMÅäÖÃ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param PWMEdgeSelect: ±ßÑØÑ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔΪÒÔÏÂÖµ: * @arg FTM_PWM_HIGHTRUEPULSE: Æ¥ÅäʱÇåÁãÊä³ö * @arg FTM_PWM_LOWTRUEPULSE: Æ¥ÅäʱÖÃλÊä³ö * @retval None */ void FTM_EdgeAlignedPWMInit(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t PWMEdgeSelect) { /* disable counter */ FTMx->SC = 0x0; FTMx->MOD = FTM_MOD_INIT; if(FTM_PWM_HIGHTRUEPULSE == PWMEdgeSelect) { /* Configure timers PWM High True Pulses */ FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK; FTMx->CONTROLS[FTM_Channel].CnV = FTM_C0V_INIT + (FTM_Channel*(uint32_t)100); } else { /* Configure timers for PWM Low True Pulses */ FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSA_MASK; FTMx->CONTROLS[FTM_Channel].CnV = FTM_C0V_INIT + (FTM_Channel*(uint32_t)100) ; } } /** * @brief FTMxÖ¸¶¨Í¨µÀÖÐÐÄ¶ÔÆëPWMÅäÖÃ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param PWMEdgeSelect: ±ßÑØÑ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_PWM_HIGHTRUEPULSE: Æ¥ÅäʱÇåÁãÊä³ö * @arg FTM_PWM_LOWTRUEPULSE: Æ¥ÅäʱÖÃλÊä³ö * @retval None */ void FTM_CenterAlignedPWMInit(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t PWMEdgeSelect) { /* disable counter */ FTMx->SC = 0x0; FTMx->MOD = FTM_MOD_INIT; FTMx->SC |= FTM_SC_CPWMS_MASK; if(FTM_PWM_HIGHTRUEPULSE == PWMEdgeSelect) { /* Configure timers PWM High True Pulses */ FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_ELSB_MASK; FTMx->CONTROLS[FTM_Channel].CnV = FTM_C0V_INIT + (FTM_Channel * (uint32_t)100); } else { /* Configure timers for PWM Low True Pulses */ FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_ELSA_MASK; FTMx->CONTROLS[FTM_Channel].CnV = FTM_C0V_INIT + (FTM_Channel * (uint32_t)100); } } /** * @brief FTMx×éºÏģʽPWMÅäÖÃ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_CombinePWMStruct: Ö¸ÏòFTM_CombinePWMTypeDefÅäÖÃ. * @retval None */ void FTM_CombinePWMPWMInit(FTM_Type* FTMx, const FTM_CombinePWMTypeDef *FTM_CombinePWMStruct) { /* disable counter */ FTMx->SC = 0x0; FTMx->MOD = FTM_MOD_INIT; FTMx->SC &= ~FTM_SC_CPWMS_MASK; if(FTM_CombinePWMStruct->FTM_ChannelPair == FTM_CHANNELPAIR0) { FTMx->COMBINE &= ~(FTM_COMBINE_COMBINE0_MASK | FTM_COMBINE_COMP0_MASK | FTM_COMBINE_DTEN0_MASK | \ FTM_COMBINE_SYNCEN0_MASK | FTM_COMBINE_FAULTEN0_MASK); FTMx->COMBINE |= ((FTM_CombinePWMStruct->FTM_CombineEn) | \ (FTM_CombinePWMStruct->FTM_CompEn << FTM_COMBINE_COMP0_SHIFT)| \ (FTM_CombinePWMStruct->FTM_DeadtimeEn << FTM_COMBINE_DTEN0_SHIFT) | (FTM_CombinePWMStruct->FTM_SynchronizationEn << FTM_COMBINE_SYNCEN0_SHIFT)| \ (FTM_CombinePWMStruct->FTM_FaultControlEn << FTM_COMBINE_FAULTEN0_SHIFT)); } else if(FTM_CombinePWMStruct->FTM_ChannelPair==FTM_CHANNELPAIR1) { FTMx->COMBINE &= ~(FTM_COMBINE_COMBINE1_MASK | FTM_COMBINE_COMP1_MASK | FTM_COMBINE_DTEN1_MASK | \ FTM_COMBINE_SYNCEN1_MASK | FTM_COMBINE_FAULTEN1_MASK); FTMx->COMBINE |= ((FTM_CombinePWMStruct->FTM_CombineEn << FTM_COMBINE_COMBINE1_SHIFT) | \ (FTM_CombinePWMStruct->FTM_CompEn << FTM_COMBINE_COMP1_SHIFT)| \ (FTM_CombinePWMStruct->FTM_DeadtimeEn << FTM_COMBINE_DTEN1_SHIFT) | (FTM_CombinePWMStruct->FTM_SynchronizationEn << FTM_COMBINE_SYNCEN1_SHIFT)| \ (FTM_CombinePWMStruct->FTM_FaultControlEn << FTM_COMBINE_FAULTEN1_SHIFT)); } else if(FTM_CombinePWMStruct->FTM_ChannelPair==FTM_CHANNELPAIR2) { FTMx->COMBINE &= ~(FTM_COMBINE_COMBINE2_MASK | FTM_COMBINE_COMP2_MASK | FTM_COMBINE_DTEN2_MASK | \ FTM_COMBINE_SYNCEN2_MASK | FTM_COMBINE_FAULTEN2_MASK); FTMx->COMBINE |= ((FTM_CombinePWMStruct->FTM_CombineEn << FTM_COMBINE_COMBINE2_SHIFT) | \ (FTM_CombinePWMStruct->FTM_CompEn << FTM_COMBINE_COMP2_SHIFT)| \ (FTM_CombinePWMStruct->FTM_DeadtimeEn << FTM_COMBINE_DTEN2_SHIFT) | (FTM_CombinePWMStruct->FTM_SynchronizationEn << FTM_COMBINE_SYNCEN2_SHIFT)| \ (FTM_CombinePWMStruct->FTM_FaultControlEn << FTM_COMBINE_FAULTEN2_SHIFT)); } else { FTMx->COMBINE &= ~(FTM_COMBINE_COMBINE3_MASK | FTM_COMBINE_COMP3_MASK | FTM_COMBINE_DTEN3_MASK | \ FTM_COMBINE_SYNCEN3_MASK | FTM_COMBINE_FAULTEN3_MASK); FTMx->COMBINE |= ((FTM_CombinePWMStruct->FTM_CombineEn << FTM_COMBINE_COMBINE3_SHIFT) | \ (FTM_CombinePWMStruct->FTM_CompEn << FTM_COMBINE_COMP3_SHIFT)| \ (FTM_CombinePWMStruct->FTM_DeadtimeEn << FTM_COMBINE_DTEN3_SHIFT) | (FTM_CombinePWMStruct->FTM_SynchronizationEn << FTM_COMBINE_SYNCEN3_SHIFT)| \ (FTM_CombinePWMStruct->FTM_FaultControlEn << FTM_COMBINE_FAULTEN3_SHIFT)); } if(FTM_PWM_HIGHTRUEPULSE == FTM_CombinePWMStruct->PWMEdgeSelect) { /* Configure timers PWM High True Pulses */ FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair].CnSC = FTM_CnSC_ELSB_MASK; FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair].CnV = FTM_C0V_INIT + (FTM_CombinePWMStruct->FTM_ChannelPair*(uint32_t)100); FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair + (uint32_t)1].CnSC = FTM_CnSC_ELSB_MASK; FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair + (uint32_t)1].CnV = FTM_C0V_INIT + ((FTM_CombinePWMStruct->FTM_ChannelPair+(uint32_t)1)*(uint32_t)100); } else { /* Configure timers for PWM Low True Pulses */ FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair].CnSC = FTM_CnSC_ELSA_MASK; FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair].CnV = FTM_C0V_INIT + (FTM_CombinePWMStruct->FTM_ChannelPair* (uint32_t)100); FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair + (uint32_t)1].CnSC = FTM_CnSC_ELSA_MASK; FTMx->CONTROLS[FTM_CombinePWMStruct->FTM_ChannelPair + (uint32_t)1].CnV = FTM_C0V_INIT + ((FTM_CombinePWMStruct->FTM_ChannelPair+ (uint32_t)1)* (uint32_t)100) ; } } /** * @brief FTMxPWM³õʼ»¯ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param PWMModeSelect: Ñ¡Ôñpwmģʽ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_PWMMODE_EDGEALLIGNED: ±ßÑØ¶ÔÆëģʽ * @arg FTM_PWMMODE_CENTERALLIGNED: ÖÐÐÄģʽ¶ÔÆë * @arg FTM_PWMMODE_COMBINE: ×éºÏģʽ * @param PWMEdgeSelect: ±ßÑØÑ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_PWM_HIGHTRUEPULSE: Æ¥ÅäʱÇåÁãÊä³ö * @arg FTM_PWM_LOWTRUEPULSE: Æ¥ÅäʱÖÃλÊä³ö * @retval None */ void FTM_PWMInit(FTM_Type* FTMx, uint8_t PWMModeSelect, uint8_t PWMEdgeSelect) { uint8_t channels, i; /* channels num */ if (FTM0 == FTMx) { channels = 2; } else if(FTM1 == FTMx) { channels = 2; } else { channels = 6; } /* disable counter */ FTMx->SC = 0x0; FTMx->MOD = FTM_MOD_INIT; /* enable CPWM */ if(FTM_PWMMODE_CENTERALLIGNED == PWMModeSelect) { FTMx->SC |= FTM_SC_CPWMS_MASK; } /* enable combine pwm mode */ else if(FTM_PWMMODE_COMBINE == PWMModeSelect) { FTMx->MODE |= FTM_MODE_WPDIS_MASK | FTM_MODE_SYNCLOADEN_MASK; FTMx->COMBINE = FTM_COMBINE_COMBINE0_MASK | FTM_COMBINE_COMP0_MASK | FTM_COMBINE_SYNCEN0_MASK | FTM_COMBINE_DTEN0_MASK | FTM_COMBINE_COMBINE1_MASK | FTM_COMBINE_COMP1_MASK | FTM_COMBINE_SYNCEN1_MASK | FTM_COMBINE_DTEN1_MASK | FTM_COMBINE_COMBINE2_MASK | FTM_COMBINE_COMP2_MASK | FTM_COMBINE_SYNCEN2_MASK | FTM_COMBINE_DTEN2_MASK ; FTMx->SC &= ~FTM_SC_CPWMS_MASK; } else { FTMx->SC &= ~FTM_SC_CPWMS_MASK; } if(FTM_PWM_HIGHTRUEPULSE == PWMEdgeSelect) { /* Configure timers PWM High True Pulses */ for(i=0; iCONTROLS[i].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK; FTMx->CONTROLS[i].CnV = FTM_C0V_INIT + (i*(uint32_t)100); } } else { /* Configure timers for PWM Low True Pulses */ for(i=0; iCONTROLS[i].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSA_MASK; FTMx->CONTROLS[i].CnV = FTM_C0V_INIT + (i*(uint32_t)100); } } } /** * @brief FTMxÊäÈë²¶»ñ³õʼ»¯ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param CaptureMode: Ñ¡Ôñ²¶»ñ±ßÑØ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_INPUTCAPTURE_RISINGEDGE: ÉÏÉýÑØ²¶»ñ * @arg FTM_INPUTCAPTURE_FALLINGEDGE: ϽµÑز¶»ñ * @arg FTM_INPUTCAPTURE_BOTHEDGE: Ë«±ßÑØ²¶»ñ * @retval None */ void FTM_InputCaptureInit(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t CaptureMode) { FTMx->SC = 0x0; /* disable counter */ FTMx->MOD = 0xFFFF; /* free running */ /* enable interrupt, Capture on rising edge */ if(FTM_INPUTCAPTURE_RISINGEDGE == CaptureMode) { FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSA_MASK; } /* Capture on falling edge */ else if(FTM_INPUTCAPTURE_FALLINGEDGE == CaptureMode) { FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSB_MASK; } /* Capture on rising or falling edge */ else { FTMx->CONTROLS[FTM_Channel].CnSC = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSA_MASK | FTM_CnSC_ELSB_MASK; } } /** * @brief FTMxË«ÑØ²¶»ñ³õʼ»¯ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_DualEdgeStruct: Ö¸ÏòFTM_DualEdgeCaptureTypeDefÅäÖÃ. * @retval None */ void FTM_DualEdgeCaptureInit(FTM_Type* FTMx, const FTM_DualEdgeCaptureTypeDef* FTM_DualEdgeStruct) { /* diable counter */ FTMx->SC = 0x0; FTMx->MOD = 0xFFFF; /* DECAPEN = 1, ChannelPair/2 * 8 */ FTMx->COMBINE |= ((uint32_t)(FTM_COMBINE_DECAPEN0_MASK) << (FTM_DualEdgeStruct->FTM_ChannelPair * 4u)); /* CH(n)F and CH(n+1)F bits must be cleared first */ FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair].CnSC &= ~FTM_CnSC_CHF_MASK; FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair + (uint8_t)1].CnSC &= ~FTM_CnSC_CHF_MASK; /* oneshot mode */ if(FTM_INPUTCAPTURE_DUALEDGE_ONESHOT == FTM_DualEdgeStruct->FTM_CaptureMode) { FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair].CnSC &= ~FTM_CnSC_MSA_MASK; FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair + (uint8_t)1].CnSC &= ~FTM_CnSC_MSA_MASK; } /* continuouse mode */ else { FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair].CnSC |= FTM_CnSC_MSA_MASK; FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair + (uint8_t)1u].CnSC |= FTM_CnSC_MSA_MASK; } /* select detec edge */ FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair].CnSC |= (FTM_DualEdgeStruct->FTM_Channel_N_Edge << (uint8_t)2); FTMx->CONTROLS[FTM_DualEdgeStruct->FTM_ChannelPair + (uint8_t)1].CnSC |= (FTM_DualEdgeStruct->FTM_Channel_Np1_Edge << (uint8_t)2); FTMx->COMBINE |= ((uint32_t)FTM_COMBINE_DECAP0_MASK << (FTM_DualEdgeStruct->FTM_ChannelPair * 4u)); } /** * @brief FTMxÊä³ö±È½Ï³õʼ»¯ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param CompareMode: Ñ¡Ôñ±È½Ï±ßÑØ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_OUTPUT_TOGGLE: Æ¥ÅäʱÇл»Êä³ö * @arg FTM_OUTPUT_CLEAR: Æ¥ÅäʱÇåÁãÊä³ö * @arg FTM_OUTPUT_SET: Æ¥ÅäʱÖÃλÊä³ö * @retval None */ void FTM_OutputCompareInit(FTM_Type* FTMx, uint8_t FTM_Channel, uint32_t CompareMode) { FTM_WriteProtectDisable(FTMx ); /* diable counter */ FTMx->SC = 0x0; FTMx->MOD = FTM_MOD_INIT; /* select detec edge */ FTMx->CONTROLS[FTM_Channel].CnSC = (FTM_CnSC_MSA_MASK | (CompareMode << (uint8_t)2u)); FTMx->CONTROLS[FTM_Channel].CnV = FTM_C0V_INIT; } /** * @brief ʹÄÜFTMÒç³öÖжÏ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState:FTMxÒç³öÖжÏÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜFTMxÒç³öÖÐ¶Ï * @arg DISABLE: ʧÄÜFTMxÒç³öÖÐ¶Ï * @retval None */ void FTM_OverflowITCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* first clear the Timer Overflow flag */ if((FTMx->SC & FTM_SC_TOF_MASK) == FTM_SC_TOF_MASK) { FTMx->SC &= ~FTM_SC_TOF_MASK; } /* Enable the Timer Overflow interrupt function */ FTMx->SC |= FTM_SC_TOIE_MASK; } else { /* Disable the Timer Overflow interrupt function */ FTMx->SC &= ~FTM_SC_TOIE_MASK; } } /** * @brief »ñÈ¡Òç³ö±ê־״̬. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval µ±Ç°×´Ì¬(TRUE or FALSE) */ FlagStatus FTM_GetOverFlowFlag(const FTM_Type* FTMx) { return ((FTMx->SC & FTM_SC_TOF_MASK) == FTM_SC_TOF_MASK); } /** * @brief ʹÄÜFTMͨµÀ¶ÔÖÐCV ¼Ä´æÆ÷ͬ²½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_ ChannelPair: Ñ¡ÔñFTMͨµÀ¶Ô. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNELPAIR0: FTMxͨµÀ¶Ô0 * @arg FTM_CHANNELPAIR1: FTMxͨµÀ¶Ô1 * @arg FTM_CHANNELPAIR2: FTMxͨµÀ¶Ô2 * @arg FTM_CHANNELPAIR3: FTMxͨµÀ¶Ô3 * @param NewState:ÊÇ·ñʹÄÜͨµÀ¶ÔÖÐCV¼Ä´æÆ÷ͬ²½. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜCV¼Ä´æÆ÷ͬ²½ * @arg DISABLE: ʧÄÜCV¼Ä´æÆ÷ͬ²½ * @retval None */ void FTM_CVSyncEnable(FTM_Type* FTMx,uint8_t FTM_ChannelPair,FunctionalState State) { if(State == ENABLE) { if(FTM_ChannelPair == FTM_CHANNELPAIR0) { FTMx->COMBINE |= FTM_COMBINE_SYNCEN0_MASK; } else if(FTM_ChannelPair == FTM_CHANNELPAIR1) { FTMx->COMBINE |= FTM_COMBINE_SYNCEN1_MASK; } else if(FTM_ChannelPair == FTM_CHANNELPAIR2) { FTMx->COMBINE |= FTM_COMBINE_SYNCEN2_MASK; } else { FTMx->COMBINE |= FTM_COMBINE_SYNCEN3_MASK; } } else { if(FTM_ChannelPair == FTM_CHANNELPAIR0) { FTMx->COMBINE &= ~FTM_COMBINE_SYNCEN0_MASK; } else if(FTM_ChannelPair == FTM_CHANNELPAIR1) { FTMx->COMBINE &= ~FTM_COMBINE_SYNCEN1_MASK; } else if(FTM_ChannelPair == FTM_CHANNELPAIR2) { FTMx->COMBINE &= ~FTM_COMBINE_SYNCEN2_MASK; } else { FTMx->COMBINE &= ~FTM_COMBINE_SYNCEN3_MASK; } } } /** * @brief Çå³ýFTMxÒç³ö±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_ClrOverFlowFlag(FTM_Type* FTMx) { if((FTMx->SC & FTM_SC_TOF_MASK) == FTM_SC_TOF_MASK) { FTMx->SC &= ~FTM_SC_TOF_MASK; } } /** * @brief »ñÈ¡CNTÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval ·µ»ØCNTµÄÖµ. */ uint16_t FTM_GetCountValue(const FTM_Type* FTMx) { return (uint16_t)FTMx->CNT; } /** * @brief ÉèÖÃMODÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param ModValue: É趨MODÖµ. * @retval None */ void FTM_SetModValue(FTM_Type* FTMx, uint16_t ModValue) { FTMx->CNT = 0; FTMx->MOD = ModValue; } /** * @brief ÉèÖÃCNTINÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_SetCountInitValue(FTM_Type* FTMx, uint16_t InitialValue) { FTMx->CNTIN = InitialValue; } /** * @brief FTMxͨµÀÖжÏʹÄÜ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param NewState: FTMxÏàӦͨµÀÖжÏÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜFTMxͨµÀÖÐ¶Ï * @arg DISABLE: ʧÄÜFTMxͨµÀÖÐ¶Ï * @retval None */ void FTM_ChannelIntCmd(FTM_Type* FTMx, uint8_t FTM_Channel, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the channel interrupt function */ FTMx->CONTROLS[FTM_Channel].CnSC |= FTM_CnSC_CHIE_MASK; } else { /* Disable the channel interrupt function */ FTMx->CONTROLS[FTM_Channel].CnSC &= ~FTM_CnSC_CHIE_MASK; } } /** * @brief FTM»ñȡͨµÀ±êÖ¾ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @retval ·µ»ØÍ¨µÀ±êÖ¾. */ FlagStatus FTM_GetChannelFlag(const FTM_Type* FTMx, uint8_t FTM_Channel) { return ((FTMx->CONTROLS[FTM_Channel].CnSC & FTM_CnSC_CHF_MASK) == FTM_CnSC_CHF_MASK); } /** * @brief FTMÇå³ýͨµÀ±êÖ¾ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @retval None */ void FTM_ClrChannelFlag(FTM_Type* FTMx, uint8_t FTM_Channel) { //Dummy read while CHF is set (void) FTMx->CONTROLS[FTM_Channel].CnSC; FTMx->CONTROLS[FTM_Channel].CnSC &= ~FTM_CnSC_CHF_MASK; } /** * @brief FTMÉèÖÃͨµÀÖµ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param ChannelValue: É趨ͨµÀÖµ. * @retval None */ void FTM_SetChannelValue(FTM_Type* FTMx, uint8_t FTM_Channel, uint16_t ChannelValue) { FTMx->CONTROLS[FTM_Channel].CnV = ChannelValue; } /** * @brief FTM»ñȡͨµÀÖµ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @retval ͨµÀÖµ */ uint16_t FTM_GetChannelValue(const FTM_Type* FTMx, uint8_t FTM_Channel ) { return (uint16_t)FTMx->CONTROLS[FTM_Channel].CnV; } /** * @brief »ñÈ¡ËùÓÐͨµÀÒç³ö±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval ·µ»ØËùÓÐͨµÀ±êÖ¾. */ uint32_t FTM_GetStatusRegFlag(const FTM_Type* FTMx) { return (FTMx->STATUS & 0xFFu); } /** * @brief Çå³ýËùÓÐͨµÀÒç³ö±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_ClrStatusRegFlag(FTM_Type* FTMx) { if((FTMx->STATUS & 0xFFu) != 0u) { FTMx->STATUS = 0x00; } } /** * @brief µÃµ½Ö¸¶¨Í¨µÀÒç³ö±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @retval ·µ»ØËùÓÐͨµÀ±êÖ¾. */ FlagStatus FTM_GetStatusChannelFlag(const FTM_Type* FTMx, uint8_t ChannelFlag) { uint32_t flag; /* Get all the channel flags */ flag = FTMx->STATUS ; /* get the selected channel flag */ return ((flag &((uint32_t)1<STATUS & ((uint32_t)1<STATUS &= ~((uint32_t)1<MODE |= FTM_MODE_FAULTIE_MASK; } else { /* Disable the fault interrupt */ FTMx->MODE &= ~FTM_MODE_FAULTIE_MASK; } } /** * @brief ¶¨ÒåFTM´íÎó¿ØÖÆÄ£Ê½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_FaultControlModeDef: Ñ¡Ôñ´íÎó¿ØÖÆÄ£Ê½. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_ALLDISABLE: ËùÓÐͨµÀ½ûÓùÊÕÏ * @arg FTM_EVENENABLE_MANUALCLEAR: żÊýͨµÀʹÄܹÊÕÏ¿ØÖÆ£¬ÊÖ¶¯¹ÊÕÏÇåÁã. * @arg FTM_ALLENABLE_MANUALCLEAR: ËùÓÐͨµÀʹÄܹÊÕÏ¿ØÖÆ£¬ÊÖ¶¯¹ÊÕÏÇåÁã. * @arg FTM_ALLENABLE_AUTOCLEAR: ËùÓÐͨµÀʹÄܹÊÕÏ¿ØÖÆ£¬×Ô¶¯¹ÊÕÏÇåÁã. * @retval None */ void FTM_SetFaultControlMode(FTM_Type* FTMx, FTM_FaultControlModeDef FTM_FaultControlMode) { FTMx->MODE &= ~FTM_MODE_FAULTM_MASK; FTMx->MODE |= ((uint32_t)FTM_FaultControlMode << FTM_MODE_FAULTM_SHIFT); } /** * @brief ʹÄܲ¶»ñ²âÊÔģʽ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: ²¶»ñ²âÊÔÊÇ·ñʹÄÜ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜFTMx²¶»ñ²âÊÔ * @arg DISABLE: ʧÄÜFTMx²¶»ñ²âÊÔ * @retval None */ void FTM_CaptureTestCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the CAPTEST function */ FTMx->MODE |= FTM_MODE_CAPTEST_MASK; } else { /* Disable the CAPTEST function */ FTMx->MODE &= ~FTM_MODE_CAPTEST_MASK; } } /** * @brief Ñ¡ÔñPWMͬ²½Èí¼þ´¥·¢. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: PWMͬ²½Èí¼þ´¥·¢ÊÇ·ñʹÄÜ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜFTMxµÄPWMͬ²½Èí¼þ´¥·¢ * @arg DISABLE: ʧÄÜFTMxµÄPWMͬ²½Èí¼þ´¥·¢ * @retval None */ void FTM_SoftwareSync(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the SWSYNC function */ FTMx->SYNC |= FTM_SYNC_SWSYNC_MASK; } else { /* Disable the SWSYNC function */ FTMx->SYNC &= ~FTM_SYNC_SWSYNC_MASK; } } /** * @brief Ñ¡ÔñPWMͬ²½Ó²¼þ´¥·¢. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param TriggerN: ͬ²½´¥·¢ÐźÅÑ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SYNC_TRIGGER_TRIGGER0: Tigger0 synchronization * @arg FTM_SYNC_TRIGGER_TRIGGER1: Tigger1 synchronization * @arg FTM_SYNC_TRIGGER_TRIGGER2: Tigger2 synchronization * @param NewState: PWMͬ²½Ó²¼þ´¥·¢ÊÇ·ñʹÄÜ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜFTMxµÄPWMͬ²½Ó²¼þ´¥·¢ * @arg DISABLE: ʧÄÜFTMxµÄPWMͬ²½Ó²¼þ´¥·¢ * @retval None */ void FTM_HardwareSync(FTM_Type* FTMx, uint8_t TriggerN, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the selected Trigger */ FTMx->SYNC |= ((uint32_t)TriggerN); } else { /* Disable the selected Trigger */ FTMx->SYNC &= ~((uint32_t)TriggerN); } } /** * @brief Ñ¡ÔñSWOCTRL/INVCTRL/OUTMASK/MOD, CNTINºÍCV/CNTͬ²½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param TriggerType: ´¥·¢Ä£Ê½Ñ¡Ôñ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SYNCONF_SWTRIGGER: Èí¼þ´¥·¢Ä£Ê½ * @arg FTM_SYNCONF_HWTRIGGER: Ó²¼þ´¥·¢Ä£Ê½ * @param RegType: ¼Ä´æÆ÷ͬ²½¿ØÖÆ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SYNCONF_CNTREG: CNT¼Ä´æÆ÷ͬ²½ * @arg FTM_SYNCONF_MODCNTINCVREG: MOD¡¢CNTINºÍCV¼Ä´æÆ÷ͬ²½ * @arg FTM_SYNCONF_OUTMASKREG: OUTMASK ¼Ä´æÆ÷ͬ²½ * @arg FTM_SYNCONF_INVCTRLREG: INVCTRL¼Ä´æÆ÷ͬ²½ * @arg FTM_SYNCONF_SWOCTRLREG: SWOCTRL¼Ä´æÆ÷ͬ²½ * @param NewState: ͬ²½ÊÇ·ñʹÄÜ. * @arg ENABLE: ʹÄÜFTMxµÄPWMͬ²½Ó²¼þ´¥·¢ * @arg DISABLE: ʧÄÜFTMxµÄPWMͬ²½Ó²¼þ´¥·¢ * @retval None */ void FTM_RegSyncCmd(FTM_Type* FTMx, uint8_t TriggerType, uint8_t RegType, FunctionalState NewState) { uint32_t tempvalue; if(TriggerType == FTM_SYNCONF_SWTRIGGER) { tempvalue= ((uint32_t)0x100 << RegType); if (NewState != DISABLE) { /* Enable the software trigger activate synchronization. */ FTMx->SYNCONF |= tempvalue; } else { /* Disable the software trigger activate synchronization. */ FTMx->SYNCONF &= ~tempvalue; } } else { tempvalue= ((uint32_t)0x10000 << RegType); if (NewState != DISABLE) { /* Enable the hardware trigger activate synchronization. */ FTMx->SYNCONF |= tempvalue; } else { /* Disable the hardware trigger activate synchronization. */ FTMx->SYNCONF &= ~tempvalue; } } } /** * @brief OUTMASK¼Ä´æÆ÷ͬ²½ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param update:ͬ²½Ä£Ê½Ñ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_UPDATE_RISINGCLK: ¼Ä´æÆ÷ÔÚËùÓÐϵͳµÄÉÏÉýÑØ½øÐÐͬ²½¸üР* @arg FTM_UPDATE_PWMSYNC: ¼Ä´æÆ÷½öͨ¹ýPWMͬ²½¸üР* @retval None */ void FTM_OutMaskSync(FTM_Type* FTMx, uint8_t update) { if(FTM_UPDATE_PWMSYNC==update) { /* updated with the value of its buffer only by the PWM synchronization. */ FTMx->SYNC |= FTM_SYNC_SYNCHOM_MASK; } else { /* updated with the value of its buffer in all rising edges of the system clock. */ FTMx->SYNC &= ~FTM_SYNC_SYNCHOM_MASK; } } /** * @brief CNTIN¼Ä´æÆ÷ͬ²½ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param update:ͬ²½¸üÐÂģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_UPDATE_RISINGCLK: ¼Ä´æÆ÷ÔÚËùÓÐϵͳµÄÉÏÉýÑØ½øÐÐͬ²½¸üР* @arg FTM_UPDATE_PWMSYNC: ¼Ä´æÆ÷½öͨ¹ýPWMͬ²½¸üР* @retval None */ void FTM_CNTINCSync(FTM_Type* FTMx, uint8_t update) { if(FTM_UPDATE_PWMSYNC==update) { /* updated with the value of its buffer only by the PWM synchronization. */ FTMx->SYNCONF |= FTM_SYNCONF_CNTINC_MASK; } else { /* updated with the value of its buffer in all rising edges of the system clock. */ FTMx->SYNCONF &= ~FTM_SYNCONF_CNTINC_MASK; } } /** * @brief INVCTRL¼Ä´æÆ÷ͬ²½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param update:ͬ²½¸üÐÂģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_UPDATE_RISINGCLK: ¼Ä´æÆ÷ÔÚËùÓÐϵͳµÄÉÏÉýÑØ½øÐÐͬ²½¸üР* @arg FTM_UPDATE_PWMSYNC: ¼Ä´æÆ÷½öͨ¹ýPWMͬ²½¸üР* @retval None */ void FTM_INVCSync(FTM_Type* FTMx, uint8_t update) { if(FTM_UPDATE_PWMSYNC==update) { /* updated with the value of its buffer only by the PWM synchronization. */ FTMx->SYNCONF |= FTM_SYNCONF_INVC_MASK; } else { /* updated with the value of its buffer in all rising edges of the system clock. */ FTMx->SYNCONF &= ~FTM_SYNCONF_INVC_MASK; } } /** * @brief SWOCTRL¼Ä´æÆ÷ͬ²½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param update:ͬ²½¸üÐÂģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_UPDATE_RISINGCLK: ¼Ä´æÆ÷ÔÚËùÓÐϵͳµÄÉÏÉýÑØ½øÐÐͬ²½¸üР* @arg FTM_UPDATE_PWMSYNC: ¼Ä´æÆ÷½öͨ¹ýPWMͬ²½¸üР* @retval None */ void FTM_SWOCSync(FTM_Type* FTMx, uint8_t update) { if(FTM_UPDATE_PWMSYNC==update) { /* updated with the value of its buffer only by the PWM synchronization. */ FTMx->SYNCONF |= FTM_SYNCONF_SWOC_MASK; } else { /* updated with the value of its buffer in all rising edges of the system clock. */ FTMx->SYNCONF &= ~FTM_SYNCONF_SWOC_MASK; } } /** * @brief Ñ¡ÔñPWMͬ²½Ä£Ê½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param mode:ģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SYNCMODE_LEGACY: Ñ¡Ôñ´«Í³PWMͬ²½ * @arg FTM_SYNCMODE_ENHANCED: Ñ¡ÔñÔöÇ¿PWMͬ²½ * @retval None */ void FTM_SetSyncMode(FTM_Type* FTMx, uint8_t mode) { if(FTM_SYNCMODE_ENHANCED == mode) { /* selecte Enhanced PWM synchronization */ FTMx->SYNCONF |= FTM_SYNCONF_SYNCMODE_MASK; } else { /* selecte Legacy PWM synchronization . */ FTMx->SYNCONF &= ~FTM_SYNCONF_SYNCMODE_MASK; } } /** * @brief FTMÈí¼þͬ²½´¥·¢ÀàÐÍ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param type:ģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SOFTWARE_SYN_CNT: Èí¼þ´¥·¢¼¤»îFTM¼ÆÊýÆ÷ͬ²½ * @arg FTM_SOFTWARE_SYN_MOD_CNTIN_CV: Èí¼þ´¥·¢¼¤»îMOD¡¢CNTIN¡¢CV¼Ä´æÆ÷ͬ²½ * @arg FTM_SOFTWARE_SYN_OUTMASK: Èí¼þ´¥·¢¼¤»îÊä³öÆÁ±Îͬ²½ * @arg FTM_SOFTWARE_SYN_INVCTRL: Èí¼þ´¥·¢¼¤»î·´Ïà¿ØÖÆÍ¬²½ * @arg FTM_SOFTWARE_SYN_OUTCTRL: Èí¼þ´¥·¢¼¤»îÊä³ö¿ØÖÆÍ¬²½ * @param NewState: Èí¼þͬ²½¼¤»îģʽÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜ * @arg DISABLE: ʧÄÜ * @retval None */ void FTM_SoftSyncActivateTypeEnable(FTM_Type* FTMx, uint32_t type, FunctionalState NewState) { if(NewState != DISABLE) { FTMx->SYNCONF |= type; } else { FTMx->SYNCONF &= ~type; } } /** * @brief FTMÓ²¼þͬ²½´¥·¢ÀàÐÍ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param type:ģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_HARDWARE_SYN_CNT: Ó²¼þ´¥·¢¼¤»îFTM¼ÆÊýÆ÷ͬ²½ * @arg FTM_HARDWARE_SYN_MOD_CNTIN_CV: Ó²¼þ´¥·¢¼¤»îMOD¡¢CNTIN¡¢CV¼Ä´æÆ÷ͬ²½ * @arg FTM_HARDWARE_SYN_OUTMASK: Ó²¼þ´¥·¢¼¤»îÊä³öÆÁ±Îͬ²½ * @arg FTM_HARDWARE_SYN_INVCTRL: Ó²¼þ´¥·¢¼¤»î·´Ïà¿ØÖÆÍ¬²½ * @arg FTM_HARDWARE_SYN_OUTCTRL: Ó²¼þ´¥·¢¼¤»îÊä³ö¿ØÖÆÍ¬²½ * @param NewState: Ó²¼þͬ²½¼¤»îģʽÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ×î´ó¼ÓÔØµãʹÄÜ * @arg DISABLE: ×î´ó¼ÓÔØµãʧÄÜ * @retval None */ void FTM_HardSyncActivateTypeEnable(FTM_Type* FTMx, uint32_t type, FunctionalState NewState) { if(NewState != DISABLE) { FTMx->SYNCONF |= type; } else { FTMx->SYNCONF &= ~type; } } /** * @brief Ñ¡ÔñPWMͬ²½Ä£Ê½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param mode:ģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_PWMSYNC_NORESTRICT: ¿ÉÓÃÓÚMOD,CnV,OUTMASKºÍFTM¼ÆÊýÆ÷ͬ²½µÄÈí¼þºÍÓ²¼þ´¥·¢ * @arg FTM_PWMSYNC_SWANDHW: Èí¼þ´¥·¢Ö»ÄÜÓÃÓÚMODºÍCnVͬ²½£¬Ó²¼þ´¥·¢Ö»ÄÜÓÃÓÚOUTMASKºÍFTM¼ÆÊýÆ÷ͬ²½ * @retval None */ void FTM_SetPWMSyncMode(FTM_Type* FTMx, uint8_t mode) { if(FTM_PWMSYNC_SWANDHW == mode) { /* Software trigger can only be used by MOD and CnV synchronization, and hardware triggers can only be used by OUTMASK and FTM counter synchronization */ FTMx->MODE |= FTM_MODE_PWMSYNC_MASK; } else { /* Software and hardware triggers can be used by MOD, CnV, OUTMASK, and FTM counter synchronization. */ FTMx->MODE &= ~FTM_MODE_PWMSYNC_MASK; } } /** * @brief Ñ¡ÔñÓ²¼þ´¥·¢Ä£Ê½. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param mode:ģʽѡÔñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_HWTRIGMODE_CLEAR: ¼ì²éµ½Ó²¼þ´¥·¢Ê±£¬FTMÇåÁãTRIGλ * @arg FTM_HWTRIGMODE_UNCLEAR: ¼ì²éµ½Ó²¼þ´¥·¢Ê±£¬FTM²»ÇåÁãTRIGλ * @retval None */ void FTM_SetHardwareTriggerMode(FTM_Type* FTMx, uint8_t mode) { if(FTM_HWTRIGMODE_UNCLEAR == mode) { /* FTM does not clear the TRIGj bit when the hardware trigger j is detected, where j = 0, 1,2. */ FTMx->SYNCONF |= FTM_SYNCONF_HWTRIGMODE_MASK; } else { /* FTM clears the TRIGj bit when the hardware trigger j is detected, where j = 0, 1,2. */ FTMx->SYNCONF &= ~FTM_SYNCONF_HWTRIGMODE_MASK; } } /** * @brief Ñ¡ÔñPWMͬ²½×î´óÔØÈë. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: ×î´ó¼ÓÔØµãÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ×î´ó¼ÓÔØµãʹÄÜ * @arg DISABLE: ×î´ó¼ÓÔØµãʧÄÜ * @retval None */ void FTM_CNTMAXCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the CNTMAX function */ FTMx->SYNC |= FTM_SYNC_CNTMAX_MASK; } else { /* Disable the CNTMAX function */ FTMx->SYNC &= ~FTM_SYNC_CNTMAX_MASK; } } /** * @brief Ñ¡ÔñPWMͬ²½×îÐ¡ÔØÈë. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: ×îС¼ÓÔØµãÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ×îС¼ÓÔØµãʹÄÜ * @arg DISABLE: ×îС¼ÓÔØµãʧÄÜ * @retval None */ void FTM_CNTMINCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the CNTMIN function */ FTMx->SYNC |= FTM_SYNC_CNTMIN_MASK; } else { /* Disable the CNTMIN function */ FTMx->SYNC &= ~FTM_SYNC_CNTMIN_MASK; } } /** * @brief FTM¼ÆÊýÆ÷ͬ²½ÖØÐÂÔ¤ÖÃ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param mode: ÖØÐ³õʼ»¯ÅäÖà * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_REINIT_NORMALLY: Õý³£¼ÆÊý * @arg FTM_REINIT_UPDATED: µ±¼ì²âµ½Ìض¨µÄ´¥·¢Ê±£¬FTM¼ÆÊýÆ÷ÒÔÆä³õʼֵ¸üР* @retval None */ void FTM_Reinitialization(FTM_Type* FTMx, uint8_t mode) { if(FTM_REINIT_UPDATED == mode) { /* FTM counter is updated with its initial value when the selected trigger is detected. */ FTMx->SYNC |= FTM_SYNC_REINIT_MASK; } else { /* FTM counter continues to count normally. */ FTMx->SYNC &= ~FTM_SYNC_REINIT_MASK; } } /** * @brief Ñ¡Ôñ³õʼ»¯·¢ÉúʱͨµÀÊä³öÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param initialvalue:³õʼ»¯Í¨µÀÊä³ö * @retval None */ void FTM_SetInitOut(FTM_Type* FTMx, uint8_t initialvalue) { FTMx->OUTINIT = initialvalue; /* When a 1 is written to INIT bit the channels output is initialized according to the state of their corresponding bit in the OUTINIT register.*/ FTMx->MODE |= FTM_MODE_INIT_MASK; } /** * @brief Ö¸¶¨Í¨µÀÑ¡Ôñ³õʼ»¯·¢ÉúʱͨµÀÊä³öÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param initialvalue:Ö¸¶¨Í¨µÀ³õʼ»¯Êä³ö * @retval None */ void FTM_SetChannelOutInitValue(FTM_Type* FTMx,uint8_t FTM_Channel, uint8_t initialvalue) { uint32_t tempvalue; tempvalue = ((uint32_t)1<OUTINIT |= tempvalue; } else { /* The initialization value is 0. */ FTMx->OUTINIT &= ~tempvalue; } /* When a 1 is written to INIT bit the channels output is initialized according to the state of their corresponding bit in the OUTINIT register.*/ FTMx->MODE |= FTM_MODE_INIT_MASK; } /** * @brief ¶¨ÒåͨµÀÊä³öÊÇ·ñ¿É¼ûµÄ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param outmask: ÉèÖÃoutmask¼Ä´æÆ÷µÄÖµ. * @retval None */ void FTM_SetOutMask(FTM_Type* FTMx, uint8_t outmask) { /* Enable the Output Mask function */ FTMx->OUTMASK = outmask; } /** * @brief ¶¨ÒåÖ¸¶¨Í¨µÀÊä³öÊÇ·ñ¿É¼ûµÄ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param NewState: ͨµÀÊä³öÆÁ±ÎÊÇ·ñʹÄÜ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ͨµÀÊä³öÆÁ±Î * @arg DISABLE: ͨµÀÊä³öδÆÁ±Î * @retval None */ void FTM_SetChannelOutMaskCmd(FTM_Type* FTMx, uint8_t FTM_Channel, FunctionalState NewState) { uint32_t maskvalue; maskvalue = ((uint32_t)1<OUTMASK |= maskvalue; } else { /* Disable Output Mask */ FTMx->OUTMASK &= ~maskvalue; } } /** * @brief Ñ¡ÔñËÀÇøÔ¤¶¨ÇøÓòºÍËÀÇøÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param PrescalerValue: ËÀÇøÊ±¼äÔ¤·ÖƵֵ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_DEADTIME_DTPS_DIV1: FTMxʱÖÓ1·ÖƵ * @arg FTM_DEADTIME_DTPS_DIV4: FTMxʱÖÓ4·ÖƵ * @arg FTM_DEADTIME_DTPS_DIV16: FTMxʱÖÓ16·ÖƵ * @param DeadtimeValue: ËÀÇøÊ±¼ä(0x00~0x3F) * @retval None */ void FTM_PWMDeadtimeSet(FTM_Type* FTMx, uint32_t PrescalerValue, uint32_t DeadtimeValue) { FTM0->DEADTIME = 0; /* set the deadtime */ FTMx->DEADTIME = ((DeadtimeValue & (uint32_t)0x3F) | ((PrescalerValue & (uint32_t)0x3) << FTM_DEADTIME_DTPS_SHIFT)); } /** * @brief »ñȡͨµÀ´¥·¢±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @return ·µ»ØÍ¨µÀ´¥·¢±êÖ¾. */ FlagStatus FTM_GetExternalTriggerFlag(const FTM_Type* FTMx) { return ((FTMx->EXTTRIG & FTM_EXTTRIG_TRIGF_MASK) == FTM_EXTTRIG_TRIGF_MASK); } /** * @brief Çå³ýͨµÀ´¥·¢±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_ClrExternalTriggerFlag(FTM_Type* FTMx) { /* first read the reg, then write 0 to clear */ if((FTMx->EXTTRIG & FTM_EXTTRIG_TRIGF_MASK) == FTM_EXTTRIG_TRIGF_MASK) { FTMx->EXTTRIG &= ~FTM_EXTTRIG_TRIGF_MASK; } } /** * @brief ÊÇ·ñʹÄÜͨµÀN´¥·¢. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @param NewState: ͨµÀN´¥·¢ÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜͨµÀN´¥·¢ * @arg DISABLE: ʹÄÜͨµÀN´¥·¢ * @retval None */ void FTM_SetChnTriggerCmd(FTM_Type* FTMx, uint8_t FTM_Channel, FunctionalState NewState) { uint32_t value; /* Enable the hardware trigger mask function */ value = (FTM_Channel > 1U) ? ((uint32_t)1 << (FTM_Channel - 2U)) : ((uint32_t)1 << (FTM_Channel + 4U)); if (NewState != DISABLE) { /* Enable The generation of the channel trigger */ FTMx->EXTTRIG |= value; } else { /* Disable The generation of the channel trigger */ FTMx->EXTTRIG &= ~value; } } /** * @brief µ±FTM¼ÆÊýÓëCNTIN¼Ä´æÆ÷ÖµÏàͬʱ´¥·¢Ê¹ÄÜ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: ³õʼ»¯´¥·¢ÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄܳõʼ»¯´¥·¢Éú³É * @arg DISABLE: ʧÄܳõʼ»¯´¥·¢Éú³É * @retval None */ void FTM_SetInitTriggerCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the generation of the channel trigger */ FTMx->EXTTRIG |= FTM_EXTTRIG_INITTRIGEN_MASK; } else { /* Disable the generation of the channel trigger */ FTMx->EXTTRIG &= ~FTM_EXTTRIG_INITTRIGEN_MASK; } } /** * @brief ¶¨ÒåͨµÀÊä³ö¼«ÐÔ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param PolarityValue: ÉèÖÃPOL¼Ä´æÆ÷µÄÖµ. * @retval None */ void FTM_SetChannelsPolarity(FTM_Type* FTMx, uint8_t PolarityValue) { /* Enable the channels polarity */ FTMx->POL = PolarityValue; } /** * @brief ¶¨Ò嵥ͨµÀÊä³ö¼«ÐÔ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param FTM_Polarity: Êä³ö¼«ÐÔ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNELPOLARITY_HIGH: ͨµÀ¼«ÐÔΪ¸ßµçƽÓÐЧ * @arg FTM_CHANNELPOLARITY_LOW: ͨµÀ¼«ÐÔΪµÍµçƽÓÐЧ * @retval None */ void FTM_SetSingleChannelPolarity(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t FTM_Polarity) { uint32_t polvalue; polvalue = ((uint32_t)1<POL |= polvalue; } else { /* The channel polarity is active high */ FTMx->POL &= ~polvalue; } } /** * @brief ±íÕ÷FAULTFÖе±j = 3, 2, 1, 0ʱµÄÂß¼­OR,µ±Ð´0ʱÇå³ý,µ±Ð´1ʱûÓÐ×÷ÓÃ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval ·µ»ØFAULTFÖе±j = 3, 2, 1, 0ʱµÄÂß¼­OR. */ FlagStatus FTM_GetFaultDetectLogicORFlag(const FTM_Type* FTMx) { return ((FTMx->FMS & FTM_FMS_FAULTF_MASK) == FTM_FMS_FAULTF_MASK); } /** * @brief ͨ¹ýÓ²¼þÉèÖôíÎóÐźÅʹÄÜ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultDetectFlag: ¹ÊÕϼì²â±êÖ¾. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULTDETECTION_FLAG0: ¹ÊÕϼì²â±êÖ¾0 * @arg FTM_FAULTDETECTION_FLAG1: ¹ÊÕϼì²â±êÖ¾1 * @arg FTM_FAULTDETECTION_FLAG2: ¹ÊÕϼì²â±êÖ¾2 * @arg FTM_FAULTDETECTION_FLAG3: ¹ÊÕϼì²â±êÖ¾3 * @retval None */ FlagStatus FTM_GetFaultDetectFlag(const FTM_Type* FTMx, uint8_t FaultDetectFlag) { return ((FTMx->FMS & ((uint32_t)1 << FaultDetectFlag)) == ((uint32_t)1 << FaultDetectFlag)); } /** * @brief µ±´íÎó¿ØÖÆÊ¹ÄÜÖØÖôíÎóÊäÈëʹÄÜORÂß¼­. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ uint32_t FTM_GetFaultInLogicORValue(const FTM_Type* FTMx) { return (FTMx->FMS & FTM_FMS_FAULTIN_MASK); } /** * @brief Çå³ýFaultDetectLogicOR±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @retval None */ void FTM_ClrFaultDetectLogicORFlag(FTM_Type* FTMx) { /* first read the reg, then write 0 to clear */ if((FTMx->FMS & FTM_FMS_FAULTF_MASK) == FTM_FMS_FAULTF_MASK) { FTMx->FMS &= ~FTM_FMS_FAULTF_MASK; } } /** * @brief Çå³ý´íÎó¼ì²â±êÖ¾. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultDetectFlag: ¹ÊÕϼì²â±êÖ¾. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULTDETECTION_FLAG0: ¹ÊÕϼì²â±êÖ¾0 * @arg FTM_FAULTDETECTION_FLAG1: ¹ÊÕϼì²â±êÖ¾1 * @arg FTM_FAULTDETECTION_FLAG2: ¹ÊÕϼì²â±êÖ¾2 * @arg FTM_FAULTDETECTION_FLAG3: ¹ÊÕϼì²â±êÖ¾3 * @retval None */ void FTM_ClrFaultDetectFlag(FTM_Type* FTMx, uint8_t FaultDetectFlag) { /* first read the reg, then write 0 to clear */ if((FTMx->FMS & ((uint32_t)1<FMS &= ~(((uint32_t)1 << FaultDetectFlag)); } } /** * @brief Ñ¡Ôñµ¥Í¨µÀÊäÈëÂËÖµ,µ±ÖµÎª0ʱÂËÖµÎÞЧ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_FilterChannel: FTMÊäÈëÂ˲¨Í¨µÀ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_INPUTFILTER_CHANNEL0: ͨµÀ0ÊäÈëÂ˲¨Æ÷ * @arg FTM_INPUTFILTER_CHANNEL1: ͨµÀ1ÊäÈëÂ˲¨Æ÷ * @arg FTM_INPUTFILTER_CHANNEL2: ͨµÀ2ÊäÈëÂ˲¨Æ÷ * @arg FTM_INPUTFILTER_CHANNEL3: ͨµÀ3ÊäÈëÂ˲¨Æ÷ * @param FilterValue: ÉèÖÃÂËÖµ0x0~0xF. * @retval None */ void FTM_SetChannelInFilter(FTM_Type* FTMx, uint8_t FTM_FilterChannel, uint32_t FilterValue) { FTMx->FILTER &= ~((uint32_t)0xF << (FTM_FilterChannel << 2)); /* Selects the filter value for the channel input. */ FTMx->FILTER |= (FilterValue << (FTM_FilterChannel << 2)); } /** * @brief Ñ¡ÔñͨµÀÊäÈëÂËÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param filter: ÉèÖÃFILTER¼Ä´æÆ÷µÄÖµ. * @retval None */ void FTM_SetInCapFilter(FTM_Type* FTMx, uint16_t filter) { /* set the filter value */ FTMx->FILTER = filter; } /** * @brief ÊÇ·ñʹÄܹÊÕÏÊäÈë. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultInput: Ö¸ÏòFTM_fault_input_listÊý¾Ý. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULT_INPUT0: ¹ÊÕÏÊäÈë0 * @arg FTM_FAULT_INPUT1: ¹ÊÕÏÊäÈë1 * @arg FTM_FAULT_INPUT2: ¹ÊÕÏÊäÈë2 * @arg FTM_FAULT_INPUT3: ¹ÊÕÏÊäÈë3 * @param NewState: ¹ÊÕÏÊäÈëÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄܹÊÕÏÊäÈë * @arg DISABLE: ʧÄܹÊÕÏÊäÈë * @retval None */ void FTM_FaultPinCmd(FTM_Type* FTMx, uint8_t FaultInput, FunctionalState NewState) { uint32_t tempvalue; tempvalue= ((uint32_t)1 << FaultInput); if (NewState != DISABLE) { /* Enable Fault input */ FTMx->FLTCTRL |= tempvalue; } else { /* Disable Fault input */ FTMx->FLTCTRL &= ~tempvalue; } } /** * @brief ÊÇ·ñʹÄÜÂËÖµ¹ÊÕÏÊäÈë. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultFilter: Ö¸ÏòFTM_fault_input_filter_listÊý¾Ý. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULTINPUT_FILTER0: ¹ÊÕÏÊäÈë0Â˲¨Æ÷ * @arg FTM_FAULTINPUT_FILTER1: ¹ÊÕÏÊäÈë1Â˲¨Æ÷ * @arg FTM_FAULTINPUT_FILTER2: ¹ÊÕÏÊäÈë2Â˲¨Æ÷ * @arg FTM_FAULTINPUT_FILTER3: ¹ÊÕÏÊäÈë3Â˲¨Æ÷ * @param NewState: ¹ÊÕÏÊäÈëÂ˲¨ÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄܹÊÕÏÊäÈëÂ˲¨Æ÷ * @arg DISABLE: ʧÄܹÊÕÏÊäÈëÂ˲¨Æ÷ * @retval None */ void FTM_FaultPinFilterCmd(FTM_Type* FTMx, uint8_t FaultFilter, FunctionalState NewState) { uint32_t tempvalue; tempvalue= ((uint32_t)0x10 << FaultFilter); if (NewState != DISABLE) { /* Enable Fault input filter */ FTMx->FLTCTRL |= tempvalue; } else { /* Disable Fault input filter */ FTMx->FLTCTRL &= ~tempvalue; } } /** * @brief Ñ¡ÔñÂËÖµ´íÎóÊäÈë. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FilterValue:ÉèÖÃÂËÖµ 0x0~0xF. * @retval None */ void FTM_SetFaultInFilter(FTM_Type* FTMx, uint32_t FilterValue) { FTMx->FLTCTRL &= ~FTM_FLTCTRL_FFVAL_MASK; /* Selects the filter value */ FTMx->FLTCTRL |= (FilterValue << FTM_FLTCTRL_FFVAL_SHIFT); } /** * @brief ÅäÖÃFTMÈ«¾ÖʱÖÓ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: Íⲿȫ¾Öʱ»ùÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜÍⲿȫ¾Öʱ»ù * @arg DISABLE: ʧÄÜÍⲿȫ¾Öʱ»ù * @retval None */ void FTM_GTBEENCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable Use of an external global time base */ FTMx->CONF |= FTM_CONF_GTBEEN_MASK; } else { /* Disable Use of an external global time base */ FTMx->CONF &= ~FTM_CONF_GTBEEN_MASK; } } /** * @brief »ùÓÚÆäËüFTMsʹÄÜÈ«¾ÖʱÖÓ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState: È«¾Öʱ»ùÐźÅÉú³ÉÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ʹÄÜÈ«¾Öʱ»ùÐźÅÉú³É * @arg DISABLE: ʧÄÜÈ«¾Öʱ»ùÐźÅÉú³É * @retval None */ void FTM_GTBEOUTCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable A global time base signal generation */ FTMx->CONF |= FTM_CONF_GTBEOUT_MASK; } else { /* Disable A global time base signal generation */ FTMx->CONF &= ~FTM_CONF_GTBEOUT_MASK; } } /** * @brief ½øÈëDebugģʽ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param DebugMode£ºDebugModeÖµ 0~0x03. * @retval None */ void FTM_SetDebugModeBehavior(FTM_Type* FTMx, uint32_t DebugMode) { FTMx->CONF &= ~FTM_CONF_BDMMODE_MASK; /* Set the Debug Mode */ FTMx->CONF |= (DebugMode << FTM_CONF_BDMMODE_SHIFT); } /** * @brief ¶¨Òå´íÎóÊäÈ뼫ÐÔ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultInput: Ö¸ÏòFTM_fault_polarity_filter_listÊý¾Ý. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULTINPUT_FILTER0: ¹ÊÕÏÊäÈë0 * @arg FTM_FAULTINPUT_FILTER1: ¹ÊÕÏÊäÈë1 * @arg FTM_FAULTINPUT_FILTER2: ¹ÊÕÏÊäÈë2 * @arg FTM_FAULTINPUT_FILTER3: ¹ÊÕÏÊäÈë3 * @param polarity: ¹ÊÕÏÊäÈ뼫ÐÔ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_FAULTINPOLARITY_HIGH: ¹ÊÕÏÊäÈ뼫ÐÔΪ¸ßµçƽÓÐЧ * @arg FTM_FAULTINPOLARITY_LOW: ¹ÊÕÏÊäÈ뼫ÐÔΪµÍµçƽÓÐЧ * @retval None */ void FTM_SetFaultInPolarity(FTM_Type* FTMx, uint8_t FaultInput, uint8_t polarity) { uint32_t polvalue; polvalue = ((uint32_t)1<FLTPOL |= polvalue; } else { /* The fault input polarity is active high */ FTMx->FLTPOL &= ~polvalue; } } /** * @brief ¿ØÖÆ×éºÏͨµÀ·­×ª. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_INVERT_PAIRCHANNEL0: ͨµÀ×é0 * @arg FTM_INVERT_PAIRCHANNEL1: ͨµÀ×é1 * @arg FTM_INVERT_PAIRCHANNEL2: ͨµÀ×é2 * @arg FTM_INVERT_PAIRCHANNEL3: ͨµÀ×é3 * @param NewState:×éºÏͨµÀ·­×ªÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ×éºÏͨµÀ·­×ªÊ¹ÄÜ * @arg DISABLE: ×éºÏͨµÀ·­×ª²»Ê¹ÄÜ * @retval None */ void FTM_PairChannelsInvertCmd(FTM_Type* FTMx, uint8_t channelpair, FunctionalState NewState) { uint32_t tempvalue; tempvalue= ((uint32_t)1<INVCTRL |= tempvalue; } else { /* Disable Inverting */ FTMx->INVCTRL &= ~tempvalue; } } /** * @brief Èí¼þÊä³ö¿ØÖÆÍ¨µÀNÊÇ·ñʹÄÜ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param NewState:ͨµÀNÈí¼þÊä³ö¿ØÖÆÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ͨµÀNÈí¼þÊä³ö¿ØÖÆÊ¹ÄÜ * @arg DISABLE: ͨµÀNÈí¼þÊä³ö¿ØÖÆÊ§ÄÜ * @retval None */ void FTM_SWOutControlCmd(FTM_Type* FTMx, uint8_t FTM_Channel, FunctionalState NewState) { uint32_t tempvalue; tempvalue= ((uint32_t)1<SWOCTRL |= tempvalue; } else { /* The channel output is not affected */ FTMx->SWOCTRL &= ~tempvalue; } } /** * @brief ÉèÖÃÈí¼þÊä³ö¿ØÖÆÍ¨µÀNµÄÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param outvalue: ÉèÖÿØÖÆÍ¨µÀNµÄÖµ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_SWCONTROL_OUT0: Èí¼þÊä³ö¿ØÖÆÇ¿ÖÆ0½øÈëͨµÀÊä³ö * @arg FTM_SWCONTROL_OUT1: Èí¼þÊä³ö¿ØÖÆÇ¿ÖÆ1½øÈëͨµÀÊä³ö * @retval None */ void FTM_SetSWOutControlValue(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t outvalue) { uint32_t tempvalue; tempvalue= ((uint32_t)0x100<SWOCTRL |= tempvalue; } else { /* The software output control forces 0 to the channel output */ FTMx->SWOCTRL &= ~tempvalue; } } /** * @brief ÊÇ·ñ°üº¬Í¨µÀ±È½Ï½ø³Ì. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param Matchchannel: ÉèÖÃPWMLOAD¼Ä´æÆ÷ µÍ8λµÄÖµ. * @retval None */ void FTM_SetLoadMatchChannels(FTM_Type* FTMx, uint32_t Matchchannel) { FTMx->PWMLOAD &= ~(uint32_t)0xFF ; FTMx->PWMLOAD |= Matchchannel; } /** * @brief ÊÇ·ñ°üº¬µ¥Í¨µÀ±È½Ï½ø³Ì. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FTM_Channel: Ñ¡ÔñFTMͨµÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNEL0: FTMxͨµÀ0 * @arg FTM_CHANNEL1: FTMxͨµÀ1 * @arg FTM_CHANNEL2: FTMxͨµÀ2 * @arg FTM_CHANNEL3: FTMxͨµÀ3 * @arg FTM_CHANNEL4: FTMxͨµÀ4 * @arg FTM_CHANNEL5: FTMxͨµÀ5 * @arg FTM_CHANNEL6: FTMxͨµÀ6 * @arg FTM_CHANNEL7: FTMxͨµÀ7 * @param include:ÊÇ·ñ°üº¬µ¥Í¨µÀ±È½Ï½ø³Ì * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM_CHANNELMATCH_NOTINCLUDE:²»°üº¬µ¥Í¨µÀ±È½Ï½ø³Ì * @arg FTM_CHANNELMATCH_INCLUDE£º°üº¬µ¥Í¨µÀ±È½Ï½ø³Ì * @retval None */ void FTM_SetLoadMatchChannel(FTM_Type* FTMx, uint8_t FTM_Channel, uint8_t include) { uint32_t tempvalue; tempvalue= ((uint32_t)1<PWMLOAD |= tempvalue; } else { /* Do not include the channel in the matching process. */ FTMx->PWMLOAD &= ~tempvalue; } } /** * @brief ʹÄܼÓÔØMOD, CNTIN,CV¼Ä´æÆ÷µÄÖµ. * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState:FTMx¼ÓÔØÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ¼ÓÔØÊ¹ÄÜ * @arg DISABLE: ¼ÓÔØÊ§ÄÜ * @retval None */ void FTM_SetLoadCmd(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable Loading updated */ FTMx->PWMLOAD |= FTM_PWMLOAD_LDOK_MASK; } else { /* Disable Loading updated */ FTMx->PWMLOAD &= ~FTM_PWMLOAD_LDOK_MASK; } } /** * @brief ʹÄÜPWMͬ²½ºÍÖмä¼ÓÔØ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param NewState:PWMͬ²½ºÍÖмä¼ÓÔØÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ͬ²½ºÍÖмä¼ÓÔØÊ¹ÄÜ * @arg DISABLE: ͬ²½ºÍÖмä¼ÓÔØÊ§ÄÜ * @retval None */ void FTM_SyncLoadEnable(FTM_Type* FTMx, FunctionalState NewState) { if (NewState != DISABLE) { FTMx->MODE |= FTM_MODE_SYNCLOADEN_MASK; } else { FTMx->MODE &= ~FTM_MODE_SYNCLOADEN_MASK; } } /** * @brief ¹ÊÕÏ¿ØÖÆÊ¹ÄÜ * @param FTMx: Ñ¡ÔñFTMÍâÉè. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FTM0: FTM0ÍâÉè * @arg FTM1: FTM1ÍâÉè * @arg FTM2: FTM2ÍâÉè * @param FaultControlChannel:¹ÊÕÏ¿ØÖÆÍ¨µÀÑ¡Ôñ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg FaultControlChanne0: ͨµÀ(0)ºÍ(1)ÖеĹÊÕÏ¿ØÖÆ * @arg FaultControlChannel: ͨµÀ(2)ºÍ(3)ÖеĹÊÕÏ¿ØÖÆ * @arg FaultControlChanne2: ͨµÀ(4)ºÍ(5)ÖеĹÊÕÏ¿ØÖÆ * @arg FaultControlChanne3: ͨµÀ(6)ºÍ(7)ÖеĹÊÕÏ¿ØÖÆ * @param NewState:¹ÊÕÏ¿ØÖÆÊÇ·ñʹÄÜ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ¹ÊÕÏ¿ØÖÆÊ¹ÄÜ * @arg DISABLE: ¹ÊÕÏ¿ØÖÆÊ§ÄÜ * @retval None */ void FTM_FaultControlEnable(FTM_Type* FTMx, uint32_t FaultControlChannel,FunctionalState NewState) { if (NewState != DISABLE) { FTMx->COMBINE |= FaultControlChannel; } else { FTMx->COMBINE &= ~FaultControlChannel; } } /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */