#include "driver_adv_timer.h" /* ---------------------- TIM registers bit mask ------------------------ */ #define SMCR_ETR_MASK ((uint16_t)0x00FF) #define CCMR_OFFSET ((uint16_t)0x0018) #define CCER_CCE_SET ((uint16_t)0x0001) #define CCER_CCNE_SET ((uint16_t)0x0004) /** * @} */ /** @defgroup tim_private_macros * @{ */ /** * @} */ /** @defgroup tim_private_variables * @{ */ /** * @} */ /** @defgroup tim_private_functionprototypes * @{ */ static void ti1_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, uint16_t tim_icfilter); static void ti2_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, uint16_t tim_icfilter); //static void ti3_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, // uint16_t tim_icfilter); //static void ti4_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, // uint16_t tim_icfilter); /** * @} */ /** @defgroup tim_private_macros * @{ */ /** * @} */ /** @defgroup tim_private_variables * @{ */ /** * @} */ /** @defgroup tim_private_functionprototypes * @{ */ /** * @} */ /** @defgroup tim_private_functions * @{ */ /** * @brief deinitializes the TIMx peripheral registers to their default reset values. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @retval none */ /** * @brief initializes the TIMx time base unit peripheral according to * the specified parameters in the tim_timebaseinitstruct. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_timebaseinitstruct: pointer to a tim_timebaseinittypedef * structure that contains the configuration information for the * specified tim peripheral. * @retval none */ void tim_timebaseinit(tim_typedef* TIMx, tim_timebaseinittypedef* tim_timebaseinitstruct) { uint16_t tmpcr1 = 0; /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_COUNTER_MODE(tim_timebaseinitstruct->tim_countermode)); assert_param(IS_TIM_CKD_DIV(tim_timebaseinitstruct->tim_clockdivision)); tmpcr1 = TIMx->cr1; if(TIMx == TIM1) { /* select the counter mode */ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); tmpcr1 |= (uint32_t)tim_timebaseinitstruct->tim_countermode; } // if((TIMx != tim6) && (TIMx != tim7)) // { // /* set the clock division */ tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); tmpcr1 |= (uint32_t)tim_timebaseinitstruct->tim_clockdivision; // } TIMx->cr1 = tmpcr1; /* set the autoreload value */ TIMx->arr = tim_timebaseinitstruct->tim_period ; /* set the prescaler value */ TIMx->psc = tim_timebaseinitstruct->tim_prescaler; if (TIMx == TIM1) { /* set the repetition counter value */ TIMx->rcr = tim_timebaseinitstruct->tim_repetitioncounter; } /* generate an update event to reload the prescaler and the repetition counter values immediately */ TIMx->egr = TIM_PSCRELOADMODE_IMMEDIATE; } /** * @brief initializes the TIMx channel1 according to the specified * parameters in the tim_ocinitstruct. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_ocinitstruct: pointer to a tim_ocinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ void tim_oc1init(tim_typedef* TIMx, tim_ocinittypedef* tim_ocinitstruct) { uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_OC_MODE(tim_ocinitstruct->tim_ocmode)); assert_param(IS_TIM_OUTPUT_STATE(tim_ocinitstruct->tim_outputstate)); assert_param(IS_TIM_OC_POLARITY(tim_ocinitstruct->tim_ocpolarity)); /* DISABLE the channel 1: reset the cc1e bit */ TIMx->ccer &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E); /* get the TIMx ccer register value */ tmpccer = TIMx->ccer; /* get the TIMx cr2 register value */ tmpcr2 = TIMx->cr2; /* get the TIMx ccmr1 register value */ tmpccmrx = TIMx->ccmr1; /* reset the output compare mode bits */ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M)); tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S)); // 预留 ■ /* select the output compare mode */ tmpccmrx |= tim_ocinitstruct->tim_ocmode; /* reset the output polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P)); /* set the output compare polarity */ tmpccer |= tim_ocinitstruct->tim_ocpolarity; /* set the output state */ tmpccer |= tim_ocinitstruct->tim_outputstate; if(TIMx == TIM1) { assert_param(IS_TIM_OUTPUTN_STATE(tim_ocinitstruct->tim_outputnstate)); assert_param(IS_TIM_OCN_POLARITY(tim_ocinitstruct->tim_ocnpolarity)); assert_param(IS_TIM_OCNIDLE_STATE(tim_ocinitstruct->tim_ocnidlestate)); assert_param(IS_TIM_OCIDLE_STATE(tim_ocinitstruct->tim_ocidlestate)); /* reset the output n polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NP)); /* set the output n polarity */ tmpccer |= tim_ocinitstruct->tim_ocnpolarity; /* reset the output n state */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NE)); /* set the output n state */ tmpccer |= tim_ocinitstruct->tim_outputnstate; /* reset the output compare and output compare n idle state */ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1)); // 预留 ■ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1N)); // 预留 ■ /* set the output idle state */ tmpcr2 |= tim_ocinitstruct->tim_ocidlestate; /* set the output n idle state */ tmpcr2 |= tim_ocinitstruct->tim_ocnidlestate; } /* write to TIMx cr2 */ TIMx->cr2 = tmpcr2; /* write to TIMx ccmr1 */ TIMx->ccmr1 = tmpccmrx; /* set the capture compare register value */ TIMx->ccr1 = tim_ocinitstruct->tim_pulse; /* write to TIMx ccer */ TIMx->ccer = tmpccer; } /** * @brief initializes the TIMx channel2 according to the specified * parameters in the tim_ocinitstruct. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select * the tim peripheral. * @param tim_ocinitstruct: pointer to a tim_ocinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ void tim_oc2init(tim_typedef* TIMx, tim_ocinittypedef* tim_ocinitstruct) { uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_OC_MODE(tim_ocinitstruct->tim_ocmode)); assert_param(IS_TIM_OUTPUT_STATE(tim_ocinitstruct->tim_outputstate)); assert_param(IS_TIM_OC_POLARITY(tim_ocinitstruct->tim_ocpolarity)); /* DISABLE the channel 2: reset the cc2e bit */ TIMx->ccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E)); /* get the TIMx ccer register value */ tmpccer = TIMx->ccer; /* get the TIMx cr2 register value */ tmpcr2 = TIMx->cr2; /* get the TIMx ccmr1 register value */ tmpccmrx = TIMx->ccmr1; /* reset the output compare mode and capture/compare selection bits */ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M)); tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)); // 预留 ■ /* select the output compare mode */ tmpccmrx |= (uint16_t)(tim_ocinitstruct->tim_ocmode << 8); /* reset the output polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P)); /* set the output compare polarity */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_ocpolarity << 4); /* set the output state */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_outputstate << 4); if(TIMx == TIM1) { assert_param(IS_TIM_OUTPUTN_STATE(tim_ocinitstruct->tim_outputnstate)); assert_param(IS_TIM_OCN_POLARITY(tim_ocinitstruct->tim_ocnpolarity)); assert_param(IS_TIM_OCNIDLE_STATE(tim_ocinitstruct->tim_ocnidlestate)); assert_param(IS_TIM_OCIDLE_STATE(tim_ocinitstruct->tim_ocidlestate)); /* reset the output n polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NP)); /* set the output n polarity */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_ocnpolarity << 4); /* reset the output n state */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NE)); /* set the output n state */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_outputnstate << 4); /* reset the output compare and output compare n idle state */ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2)); tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2N)); /* set the output idle state */ tmpcr2 |= (uint16_t)(tim_ocinitstruct->tim_ocidlestate << 2); /* set the output n idle state */ tmpcr2 |= (uint16_t)(tim_ocinitstruct->tim_ocnidlestate << 2); } /* write to TIMx cr2 */ TIMx->cr2 = tmpcr2; /* write to TIMx ccmr1 */ TIMx->ccmr1 = tmpccmrx; /* set the capture compare register value */ TIMx->ccr2 = tim_ocinitstruct->tim_pulse; /* write to TIMx ccer */ TIMx->ccer = tmpccer; } /** * @brief initializes the TIMx channel3 according to the specified * parameters in the tim_ocinitstruct. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocinitstruct: pointer to a tim_ocinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ void tim_oc3init(tim_typedef* TIMx, tim_ocinittypedef* tim_ocinitstruct) { uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OC_MODE(tim_ocinitstruct->tim_ocmode)); assert_param(IS_TIM_OUTPUT_STATE(tim_ocinitstruct->tim_outputstate)); assert_param(IS_TIM_OC_POLARITY(tim_ocinitstruct->tim_ocpolarity)); /* DISABLE the channel 2: reset the cc2e bit */ TIMx->ccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E)); /* get the TIMx ccer register value */ tmpccer = TIMx->ccer; /* get the TIMx cr2 register value */ tmpcr2 = TIMx->cr2; /* get the TIMx ccmr2 register value */ tmpccmrx = TIMx->ccmr2; /* reset the output compare mode and capture/compare selection bits */ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M)); tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC3S));// 预留 ■ /* select the output compare mode */ tmpccmrx |= tim_ocinitstruct->tim_ocmode; /* reset the output polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P)); /* set the output compare polarity */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_ocpolarity << 8); /* set the output state */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_outputstate << 8); if(TIMx == TIM1) { assert_param(IS_TIM_OUTPUTN_STATE(tim_ocinitstruct->tim_outputnstate)); assert_param(IS_TIM_OCN_POLARITY(tim_ocinitstruct->tim_ocnpolarity)); assert_param(IS_TIM_OCNIDLE_STATE(tim_ocinitstruct->tim_ocnidlestate)); assert_param(IS_TIM_OCIDLE_STATE(tim_ocinitstruct->tim_ocidlestate)); /* reset the output n polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NP)); /* set the output n polarity */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_ocnpolarity << 8); /* reset the output n state */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NE)); /* set the output n state */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_outputnstate << 8); /* reset the output compare and output compare n idle state */ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3)); tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3N)); /* set the output idle state */ tmpcr2 |= (uint16_t)(tim_ocinitstruct->tim_ocidlestate << 4); /* set the output n idle state */ tmpcr2 |= (uint16_t)(tim_ocinitstruct->tim_ocnidlestate << 4); } /* write to TIMx cr2 */ TIMx->cr2 = tmpcr2; /* write to TIMx ccmr2 */ TIMx->ccmr2 = tmpccmrx; /* set the capture compare register value */ TIMx->ccr3 = tim_ocinitstruct->tim_pulse; /* write to TIMx ccer */ TIMx->ccer = tmpccer; } /** * @brief initializes the TIMx channel4 according to the specified * parameters in the tim_ocinitstruct. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocinitstruct: pointer to a tim_ocinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ void tim_oc4init(tim_typedef* TIMx, tim_ocinittypedef* tim_ocinitstruct) { uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OC_MODE(tim_ocinitstruct->tim_ocmode)); assert_param(IS_TIM_OUTPUT_STATE(tim_ocinitstruct->tim_outputstate)); assert_param(IS_TIM_OC_POLARITY(tim_ocinitstruct->tim_ocpolarity)); /* DISABLE the channel 2: reset the cc4e bit */ TIMx->ccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E)); /* get the TIMx ccer register value */ tmpccer = TIMx->ccer; /* get the TIMx cr2 register value */ tmpcr2 = TIMx->cr2; /* get the TIMx ccmr2 register value */ tmpccmrx = TIMx->ccmr2; /* reset the output compare mode and capture/compare selection bits */ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M)); tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC4S)); // 预留 ■ /* select the output compare mode */ tmpccmrx |= (uint16_t)(tim_ocinitstruct->tim_ocmode << 8); /* reset the output polarity level */ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P)); /* set the output compare polarity */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_ocpolarity << 12); /* set the output state */ tmpccer |= (uint16_t)(tim_ocinitstruct->tim_outputstate << 12); if(TIMx == TIM1) { assert_param(IS_TIM_OCIDLE_STATE(tim_ocinitstruct->tim_ocidlestate)); /* reset the output compare idle state */ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS4)); /* set the output idle state */ tmpcr2 |= (uint16_t)(tim_ocinitstruct->tim_ocidlestate << 6); } /* write to TIMx cr2 */ TIMx->cr2 = tmpcr2; /* write to TIMx ccmr2 */ TIMx->ccmr2 = tmpccmrx; /* set the capture compare register value */ TIMx->ccr4 = tim_ocinitstruct->tim_pulse; /* write to TIMx ccer */ TIMx->ccer = tmpccer; } /** * @brief initializes the tim peripheral according to the specified * parameters in the tim_icinitstruct. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_icinitstruct: pointer to a tim_icinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ //void tim_icinit(tim_typedef* TIMx, tim_icinittypedef* tim_icinitstruct) // 预留 //{ // /* check the parameters */ // assert_param(IS_TIM_CHANNEL(tim_icinitstruct->tim_channel)); // assert_param(IS_TIM_IC_SELECTION(tim_icinitstruct->tim_icselection)); // assert_param(IS_TIM_IC_PRESCALER(tim_icinitstruct->tim_icprescaler)); // assert_param(IS_TIM_IC_FILTER(tim_icinitstruct->tim_icfilter)); // // if(TIMx == TIM1) // { // assert_param(IS_TIM_IC_POLARITY(tim_icinitstruct->tim_icpolarity)); // } // else // { // assert_param(IS_TIM_IC_POLARITY_LITE(tim_icinitstruct->tim_icpolarity)); // } // if (tim_icinitstruct->tim_channel == TIM_CHANNEL_1) // { // assert_param(IS_TIM_LIST8_PERIPH(TIMx)); // /* ti1 configuration */ // ti1_config(TIMx, tim_icinitstruct->tim_icpolarity, // tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic1prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } // else if (tim_icinitstruct->tim_channel == TIM_CHANNEL_2) // { // assert_param(IS_TIM_LIST6_PERIPH(TIMx)); // /* ti2 configuration */ // ti2_config(TIMx, tim_icinitstruct->tim_icpolarity, // tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic2prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } // else if (tim_icinitstruct->tim_channel == TIM_CHANNEL_3) // { // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // /* ti3 configuration */ // ti3_config(TIMx, tim_icinitstruct->tim_icpolarity, // tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic3prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } // else // { // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // /* ti4 configuration */ // ti4_config(TIMx, tim_icinitstruct->tim_icpolarity, // tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic4prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } //} /** * @brief configures the tim peripheral according to the specified * parameters in the tim_icinitstruct to measure an external pwm signal. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_icinitstruct: pointer to a tim_icinittypedef structure * that contains the configuration information for the specified tim peripheral. * @retval none */ //void tim_pwmiconfig(tim_typedef* TIMx, tim_icinittypedef* tim_icinitstruct) // 预留 //{ // uint16_t icoppositepolarity = TIM_ICPOLARITY_RISING; // uint16_t icoppositeselection = TIM_ICSELECTION_DIRECTTI; // /* check the parameters */ // assert_param(IS_TIM_LIST6_PERIPH(TIMx)); // /* select the opposite input polarity */ // if (tim_icinitstruct->tim_icpolarity == TIM_ICPOLARITY_RISING) // { // icoppositepolarity = TIM_ICPOLARITY_FALLING; // } // else // { // icoppositepolarity = TIM_ICPOLARITY_RISING; // } // /* select the opposite input */ // if (tim_icinitstruct->tim_icselection == TIM_ICSELECTION_DIRECTTI) // { // icoppositeselection = TIM_ICSELECTION_INDIRECTTI; // } // else // { // icoppositeselection = TIM_ICSELECTION_DIRECTTI; // } // if (tim_icinitstruct->tim_channel == TIM_CHANNEL_1) // { // /* ti1 configuration */ // ti1_config(TIMx, tim_icinitstruct->tim_icpolarity, tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic1prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // /* ti2 configuration */ // ti2_config(TIMx, icoppositepolarity, icoppositeselection, tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic2prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } // else // { // /* ti2 configuration */ // ti2_config(TIMx, tim_icinitstruct->tim_icpolarity, tim_icinitstruct->tim_icselection, // tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic2prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // /* ti1 configuration */ // ti1_config(TIMx, icoppositepolarity, icoppositeselection, tim_icinitstruct->tim_icfilter); // /* set the input capture prescaler value */ // tim_setic1prescaler(TIMx, tim_icinitstruct->tim_icprescaler); // } //} /** * @brief configures the: break feature, dead time, lock level, the ossi, * the ossr state and the aoe(automatic output enable). * @param TIMx: where x can be 1 or 8 to select the tim * @param tim_bdtrinitstruct: pointer to a tim_bdtrinittypedef structure that * contains the bdtr register configuration information for the tim peripheral. * @retval none */ void tim_bdtrconfig(tim_typedef* TIMx, tim_bdtrinittypedef *tim_bdtrinitstruct) { /* check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(IS_TIM_OSSR_STATE(tim_bdtrinitstruct->tim_ossrstate)); assert_param(IS_TIM_OSSI_STATE(tim_bdtrinitstruct->tim_ossistate)); assert_param(IS_TIM_LOCK_LEVEL(tim_bdtrinitstruct->tim_locklevel)); assert_param(IS_TIM_BREAK_STATE(tim_bdtrinitstruct->tim_break)); assert_param(IS_TIM_BREAK_POLARITY(tim_bdtrinitstruct->tim_breakpolarity)); assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(tim_bdtrinitstruct->tim_automaticoutput)); /* set the lock level, the break enable bit and the ploarity, the ossr state, the ossi state, the dead time value and the automatic output enable bit */ TIMx->bdtr = (uint32_t)tim_bdtrinitstruct->tim_ossrstate | tim_bdtrinitstruct->tim_ossistate | tim_bdtrinitstruct->tim_locklevel | tim_bdtrinitstruct->tim_deadtime | tim_bdtrinitstruct->tim_break | tim_bdtrinitstruct->tim_breakpolarity | tim_bdtrinitstruct->tim_automaticoutput; } /** * @brief fills each tim_timebaseinitstruct member with its default value. * @param tim_timebaseinitstruct : pointer to a tim_timebaseinittypedef * structure which will be initialized. * @retval none */ void tim_timebasestructinit(tim_timebaseinittypedef* tim_timebaseinitstruct) { /* set the default configuration */ tim_timebaseinitstruct->tim_period = 0xffff; tim_timebaseinitstruct->tim_prescaler = 0x0000; tim_timebaseinitstruct->tim_clockdivision = TIM_CKD_DIV1; tim_timebaseinitstruct->tim_countermode = TIM_COUNTERMODE_UP; tim_timebaseinitstruct->tim_repetitioncounter = 0x0000; } /** * @brief fills each tim_ocinitstruct member with its default value. * @param tim_ocinitstruct : pointer to a tim_ocinittypedef structure which will * be initialized. * @retval none */ void tim_ocstructinit(tim_ocinittypedef* tim_ocinitstruct) { /* set the default configuration */ tim_ocinitstruct->tim_ocmode = TIM_OCMODE_TIMING; tim_ocinitstruct->tim_outputstate = TIM_OUTPUTSTATE_DISABLE; tim_ocinitstruct->tim_outputnstate = TIM_OUTPUTNSTATE_DISABLE; tim_ocinitstruct->tim_pulse = 0x0000; tim_ocinitstruct->tim_ocpolarity = TIM_OCPOLARITY_HIGH; tim_ocinitstruct->tim_ocnpolarity = TIM_OCNPOLARITY_HIGH; tim_ocinitstruct->tim_ocidlestate = TIM_OCIDLESTATE_RESET; tim_ocinitstruct->tim_ocnidlestate = TIM_OCNIDLESTATE_RESET; } /** * @brief fills each tim_icinitstruct member with its default value. * @param tim_icinitstruct: pointer to a tim_icinittypedef structure which will * be initialized. * @retval none */ //void tim_icstructinit(tim_icinittypedef* tim_icinitstruct) // 预留 //{ // /* set the default configuration */ // tim_icinitstruct->tim_channel = TIM_CHANNEL_1; // tim_icinitstruct->tim_icpolarity = TIM_ICPOLARITY_RISING; // tim_icinitstruct->tim_icselection = TIM_ICSELECTION_DIRECTTI; // tim_icinitstruct->tim_icprescaler = TIM_ICPSC_DIV1; // tim_icinitstruct->tim_icfilter = 0x00; //} /** * @brief fills each tim_bdtrinitstruct member with its default value. * @param tim_bdtrinitstruct: pointer to a tim_bdtrinittypedef structure which * will be initialized. * @retval none */ void tim_bdtrstructinit(tim_bdtrinittypedef* tim_bdtrinitstruct) { /* set the default configuration */ tim_bdtrinitstruct->tim_ossrstate = TIM_OSSRSTATE_DISABLE; tim_bdtrinitstruct->tim_ossistate = TIM_OSSISTATE_DISABLE; tim_bdtrinitstruct->tim_locklevel = TIM_LOCKLEVEL_OFF; tim_bdtrinitstruct->tim_deadtime = 0x00; tim_bdtrinitstruct->tim_break = TIM_BREAK_DISABLE; tim_bdtrinitstruct->tim_breakpolarity = TIM_BREAKPOLARITY_LOW; tim_bdtrinitstruct->tim_automaticoutput = TIM_AUTOMATICOUTPUT_DISABLE; } /** * @brief enables or DISABLEs the specified tim peripheral. * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. * @param newstate: new state of the TIMx peripheral. * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_text.tim.cmd) void tim_cmd(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* enable the tim counter */ TIMx->cr1 |= TIM_CR1_CEN; } else { /* DISABLE the tim counter */ TIMx->cr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); } } /** * @brief enables or DISABLEs the tim peripheral main outputs. * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral. * @param newstate: new state of the tim peripheral main outputs. * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_text.tim.ctrlpwmoutputs) void tim_ctrlpwmoutputs(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(IS_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* enable the tim main output */ TIMx->bdtr |= TIM_BDTR_MOE; } else { /* DISABLE the tim main output */ TIMx->bdtr &= (uint32_t)(~((uint32_t)TIM_BDTR_MOE)); } } /** * @brief enables or DISABLEs the specified tim interrupts. * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. * @param tim_it: specifies the tim interrupts sources to be enabled or DISABLEd. * this parameter can be any combination of the following values: * @arg tim_it_update: tim update interrupt source * @arg tim_it_cc1: tim capture compare 1 interrupt source * @arg tim_it_cc2: tim capture compare 2 interrupt source * @arg tim_it_cc3: tim capture compare 3 interrupt source * @arg tim_it_cc4: tim capture compare 4 interrupt source * @arg tim_it_com: tim commutation interrupt source * @arg tim_it_trigger: tim trigger interrupt source * @arg tim_it_break: tim break interrupt source * @note * - tim6 and tim7 can only generate an update interrupt. * - tim9, TIM12 and TIM15 can have only tim_it_update, tim_it_cc1, * tim_it_cc2 or tim_it_trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have tim_it_update or tim_it_cc1. * - tim_it_break is used only with TIM1, tim8 and TIM15. * - tim_it_com is used only with TIM1, tim8, TIM15, TIM16 and TIM17. * @param newstate: new state of the tim interrupts. * this parameter can be: enable or DISABLE. * @retval none */ void tim_itconfig(tim_typedef* TIMx, uint16_t tim_it, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_IT(tim_it)); assert_param(IS_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* enable the interrupt sources */ TIMx->dier |= tim_it; } else { /* DISABLE the interrupt sources */ TIMx->dier &= (uint16_t)~tim_it; } } /** * @brief configures the TIMx event to be generate by software. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_eventsource: specifies the event source. * this parameter can be one or more of the following values: * @arg tim_eventsource_update: timer update event source * @arg tim_eventsource_cc1: timer capture compare 1 event source * @arg tim_eventsource_cc2: timer capture compare 2 event source * @arg tim_eventsource_cc3: timer capture compare 3 event source * @arg tim_eventsource_cc4: timer capture compare 4 event source * @arg tim_eventsource_com: timer com event source * @arg tim_eventsource_trigger: timer trigger event source * @arg tim_eventsource_break: timer break event source * @note * - tim6 and tim7 can only generate an update event. * - tim_eventsource_com and tim_eventsource_break are used only with TIM1 and tim8. * @retval none */ AT(.com_periph.tim.generateevent) void tim_generateevent(tim_typedef* TIMx, uint16_t tim_eventsource) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_EVENT_SOURCE(tim_eventsource)); /* set the event sources */ TIMx->egr = tim_eventsource; } ///** // * @brief configures the TIMx's dma interface. // * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select // * the tim peripheral. // * @param tim_dmabase: dma base address. // * this parameter can be one of the following values: // * @arg tim_dmabase_cr, tim_dmabase_CR2, tim_dmabase_smcr, // * tim_dmabase_dier, TIM1_dmabase_sr, tim_dmabase_egr, // * tim_dmabase_CCMR1, tim_dmabase_ccmr2, tim_dmabase_CCER, // * tim_dmabase_cnt, tim_dmabase_psc, tim_dmabase_arr, // * tim_dmabase_rcr, tim_dmabase_CCR1, tim_dmabase_CCR2, // * tim_dmabase_ccr3, tim_dmabase_ccr4, tim_dmabase_bdtr, // * tim_dmabase_dcr. // * @param tim_dmaburstlength: dma burst length. // * this parameter can be one value between: // * tim_dmaburstlength_1transfer and tim_dmaburstlength_18transfers. // * @retval none // */ //void tim_dmaconfig(tim_typedef* TIMx, uint16_t tim_dmabase, uint16_t tim_dmaburstlength) //{ // /* check the parameters */ // assert_param(is_tim_list4_periph(TIMx)); // assert_param(is_tim_dma_base(tim_dmabase)); // assert_param(is_tim_dma_length(tim_dmaburstlength)); // /* set the dma base and the dma burst length */ // TIMx->dcr = tim_dmabase | tim_dmaburstlength; //} /** * @brief enables or DISABLEs the TIMx's dma requests. * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 15, 16 or 17 * to select the tim peripheral. * @param tim_dmasource: specifies the dma request sources. * this parameter can be any combination of the following values: * @arg tim_dma_update: tim update interrupt source * @arg tim_dma_cc1: tim capture compare 1 dma source * @arg tim_dma_cc2: tim capture compare 2 dma source * @arg tim_dma_cc3: tim capture compare 3 dma source * @arg tim_dma_cc4: tim capture compare 4 dma source * @arg tim_dma_com: tim commutation dma source * @arg tim_dma_trigger: tim trigger dma source * @param newstate: new state of the dma request sources. * this parameter can be: enable or DISABLE. * @retval none */ //void tim_dmacmd(tim_typedef* TIMx, uint16_t tim_dmasource, FUNCTIONAL_STATE newstate) //{ // /* check the parameters */ // assert_param(IS_TIM_LIST9_PERIPH(TIMx)); // assert_param(IS_TIM_DMA_SOURCE(tim_dmasource)); // assert_param(IS_FUNCTIONAL_STATE(newstate)); // // if (newstate != DISABLE) // { // /* enable the dma sources */ // TIMx->dier |= tim_dmasource; // } // else // { // /* DISABLE the dma sources */ // TIMx->dier &= (uint16_t)~tim_dmasource; // } //} /** * @brief configures the TIMx internal clock * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 * to select the tim peripheral. * @retval none */ AT(.com_periph.tim.internalclock) void tim_internalclockconfig(tim_typedef* TIMx) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); /* DISABLE slave mode to clock the prescaler directly with the internal clock */ TIMx->smcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); } /** * @brief configures the TIMx internal trigger as external clock * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the tim peripheral. * @param tim_itrsource: trigger source. * this parameter can be one of the following values: * @param tim_ts_itr0: internal trigger 0 * @param tim_ts_itr1: internal trigger 1 * @param tim_ts_itr2: internal trigger 2 * @param tim_ts_itr3: internal trigger 3 * @retval none */ AT(.com_periph.tim.itrxexternalclock) void tim_itrxexternalclockconfig(tim_typedef* TIMx, uint16_t tim_inputtriggersource) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(tim_inputtriggersource)); /* select the internal trigger */ tim_selectinputtrigger(TIMx, tim_inputtriggersource); /* select the external clock mode1 */ TIMx->smcr |= TIM_SLAVEMODE_EXTERNAL1; } /** * @brief configures the TIMx trigger as external clock * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the tim peripheral. * @param tim_tixexternalclksource: trigger source. * this parameter can be one of the following values: * @arg tim_tixexternalclk1source_ti1ed: ti1 edge detector * @arg tim_tixexternalclk1source_ti1: filtered timer input 1 * @arg TIM_TIXEXTERNALCLK1SOURCE_TI2: filtered timer input 2 * @param tim_icpolarity: specifies the tix polarity. * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_RISING * @arg TIM_ICPOLARITY_FALLING * @param icfilter : specifies the filter value. * this parameter must be a value between 0x0 and 0xf. * @retval none */ AT(.com_periph.tim.tixexternalclock) void tim_tixexternalclockconfig(tim_typedef* TIMx, uint16_t tim_tixexternalclksource, uint16_t tim_icpolarity, uint16_t icfilter) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_TIXCLK_SOURCE(tim_tixexternalclksource)); assert_param(IS_TIM_IC_POLARITY(tim_icpolarity)); assert_param(IS_TIM_IC_FILTER(icfilter)); /* configure the timer input clock source */ if (tim_tixexternalclksource == TIM_TIXEXTERNALCLK1SOURCE_TI2) { ti2_config(TIMx, tim_icpolarity, TIM_ICSELECTION_DIRECTTI, icfilter); } else { ti1_config(TIMx, tim_icpolarity, TIM_ICSELECTION_DIRECTTI, icfilter); } /* select the trigger source */ tim_selectinputtrigger(TIMx, tim_tixexternalclksource); /* select the external clock mode1 */ TIMx->smcr |= TIM_SLAVEMODE_EXTERNAL1; } /** * @brief configures the external clock mode1 * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_exttrgprescaler: the external trigger prescaler. * this parameter can be one of the following values: * @arg tim_exttrgpsc_off: etrp prescaler off. * @arg tim_exttrgpsc_div2: etrp frequency divided by 2. * @arg tim_exttrgpsc_div4: etrp frequency divided by 4. * @arg tim_exttrgpsc_div8: etrp frequency divided by 8. * @param tim_exttrgpolarity: the external trigger polarity. * this parameter can be one of the following values: * @arg tim_exttrgpolarity_inverted: active low or falling edge active. * @arg tim_exttrgpolarity_noninverted: active high or rising edge active. * @param exttrgfilter: external trigger filter. * this parameter must be a value between 0x00 and 0x0f * @retval none */ AT(.com_periph.etrclockmode1) void tim_etrclockmode1config(tim_typedef* TIMx, uint16_t tim_exttrgprescaler, uint16_t tim_exttrgpolarity, uint16_t exttrgfilter) { uint16_t tmpsmcr = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_EXT_PRESCALER(tim_exttrgprescaler)); assert_param(IS_TIM_EXT_POLARITY(tim_exttrgpolarity)); assert_param(IS_TIM_EXT_FILTER(exttrgfilter)); /* configure the etr clock source */ tim_etrconfig(TIMx, tim_exttrgprescaler, tim_exttrgpolarity, exttrgfilter); /* get the TIMx smcr register value */ tmpsmcr = TIMx->smcr; /* reset the sms bits */ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); /* select the external clock mode1 */ tmpsmcr |= TIM_SLAVEMODE_EXTERNAL1; /* select the trigger selection : etrf */ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); tmpsmcr |= TIM_TS_ETRF; /* write to TIMx smcr */ TIMx->smcr = tmpsmcr; } /** * @brief configures the external clock mode2 * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_exttrgprescaler: the external trigger prescaler. * this parameter can be one of the following values: * @arg tim_exttrgpsc_off: etrp prescaler off. * @arg tim_exttrgpsc_div2: etrp frequency divided by 2. * @arg tim_exttrgpsc_div4: etrp frequency divided by 4. * @arg tim_exttrgpsc_div8: etrp frequency divided by 8. * @param tim_exttrgpolarity: the external trigger polarity. * this parameter can be one of the following values: * @arg tim_exttrgpolarity_inverted: active low or falling edge active. * @arg tim_exttrgpolarity_noninverted: active high or rising edge active. * @param exttrgfilter: external trigger filter. * this parameter must be a value between 0x00 and 0x0f * @retval none */ AT(.com_periph.tim.etrclockmode2) void tim_etrclockmode2config(tim_typedef* TIMx, uint16_t tim_exttrgprescaler, uint16_t tim_exttrgpolarity, uint16_t exttrgfilter) { /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_EXT_PRESCALER(tim_exttrgprescaler)); assert_param(IS_TIM_EXT_POLARITY(tim_exttrgpolarity)); assert_param(IS_TIM_EXT_FILTER(exttrgfilter)); /* configure the etr clock source */ tim_etrconfig(TIMx, tim_exttrgprescaler, tim_exttrgpolarity, exttrgfilter); /* enable the external clock mode2 */ TIMx->smcr |= TIM_SMCR_ECE; } /** * @brief configures the TIMx external trigger (etr). * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_exttrgprescaler: the external trigger prescaler. * this parameter can be one of the following values: * @arg tim_exttrgpsc_off: etrp prescaler off. * @arg tim_exttrgpsc_div2: etrp frequency divided by 2. * @arg tim_exttrgpsc_div4: etrp frequency divided by 4. * @arg tim_exttrgpsc_div8: etrp frequency divided by 8. * @param tim_exttrgpolarity: the external trigger polarity. * this parameter can be one of the following values: * @arg tim_exttrgpolarity_inverted: active low or falling edge active. * @arg tim_exttrgpolarity_noninverted: active high or rising edge active. * @param exttrgfilter: external trigger filter. * this parameter must be a value between 0x00 and 0x0f * @retval none */ AT(.com_periph.tim.etrconfig) void tim_etrconfig(tim_typedef* TIMx, uint16_t tim_exttrgprescaler, uint16_t tim_exttrgpolarity, uint16_t exttrgfilter) { uint16_t tmpsmcr = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_EXT_PRESCALER(tim_exttrgprescaler)); assert_param(IS_TIM_EXT_POLARITY(tim_exttrgpolarity)); assert_param(IS_TIM_EXT_FILTER(exttrgfilter)); tmpsmcr = TIMx->smcr; /* reset the etr bits */ tmpsmcr &= SMCR_ETR_MASK; /* set the PRESCALER, the filter value and the polarity */ tmpsmcr |= (uint16_t)(tim_exttrgprescaler | (uint16_t)(tim_exttrgpolarity | (uint16_t)(exttrgfilter << (uint16_t)8))); /* write to TIMx smcr */ TIMx->smcr = tmpsmcr; } /** * @brief configures the TIMx prescaler. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param prescaler: specifies the prescaler register value * @param tim_pscreloadmode: specifies the tim prescaler reload mode * this parameter can be one of the following values: * @arg tim_pscreloadmode_update: the prescaler is loaded at the update event. * @arg TIM_PSCRELOADMODE_IMMEDIATE: the prescaler is loaded immediately. * @retval none */ AT(.com_periph.tim.prescaler) void tim_prescalerconfig(tim_typedef* TIMx, uint16_t prescaler, uint16_t tim_pscreloadmode) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_PRESCALER_RELOAD(tim_pscreloadmode)); /* set the prescaler value */ TIMx->psc = prescaler; /* set or reset the ug bit */ TIMx->egr = tim_pscreloadmode; } /** * @brief specifies the TIMx counter mode to be used. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_countermode: specifies the counter mode to be used * this parameter can be one of the following values: * @arg TIM_COUNTERMODE_UP: tim up counting mode * @arg tim_countermode_down: tim down counting mode * @arg tim_countermode_centeraligned1: tim center aligned mode1 * @arg tim_countermode_centeraligned2: tim center aligned mode2 * @arg tim_countermode_centeraligned3: tim center aligned mode3 * @retval none */ AT(.com_periph.tim.countermode) void tim_countermodeconfig(tim_typedef* TIMx, uint16_t tim_countermode) { uint16_t tmpcr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_COUNTER_MODE(tim_countermode)); tmpcr1 = TIMx->cr1; /* reset the cms and dir bits */ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); /* set the counter mode */ tmpcr1 |= tim_countermode; /* write to TIMx cr1 register */ TIMx->cr1 = tmpcr1; } /** * @brief selects the input trigger source * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_inputtriggersource: the input trigger source. * this parameter can be one of the following values: * @arg tim_ts_itr0: internal trigger 0 * @arg tim_ts_itr1: internal trigger 1 * @arg tim_ts_itr2: internal trigger 2 * @arg tim_ts_itr3: internal trigger 3 * @arg tim_ts_ti1f_ed: ti1 edge detector * @arg tim_ts_ti1fp1: filtered timer input 1 * @arg tim_ts_ti2fp2: filtered timer input 2 * @arg TIM_TS_ETRF: external trigger input * @retval none */ AT(.com_periph.tim.selectinputtrigger) void tim_selectinputtrigger(tim_typedef* TIMx, uint16_t tim_inputtriggersource) { uint16_t tmpsmcr = 0; /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_TRIGGER_SELECTION(tim_inputtriggersource)); /* get the TIMx smcr register value */ tmpsmcr = TIMx->smcr; /* reset the ts bits */ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); /* set the input trigger source */ tmpsmcr |= tim_inputtriggersource; /* write to TIMx smcr */ TIMx->smcr = tmpsmcr; } /** * @brief configures the TIMx encoder interface. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_encodermode: specifies the TIMx encoder mode. * this parameter can be one of the following values: * @arg tim_encodermode_ti1: counter counts on ti1fp1 edge depending on ti2fp2 level. * @arg tim_encodermode_ti2: counter counts on ti2fp2 edge depending on ti1fp1 level. * @arg tim_encodermode_ti12: counter counts on both ti1fp1 and ti2fp2 edges depending * on the level of the other input. * @param tim_ic1polarity: specifies the ic1 polarity * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_FALLING: ic falling edge. * @arg TIM_ICPOLARITY_RISING: ic rising edge. * @param tim_ic2polarity: specifies the ic2 polarity * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_FALLING: ic falling edge. * @arg TIM_ICPOLARITY_RISING: ic rising edge. * @retval none */ void tim_encoderinterfaceconfig(tim_typedef* TIMx, uint16_t tim_encodermode, uint16_t tim_ic1polarity, uint16_t tim_ic2polarity) { uint16_t tmpsmcr = 0; uint16_t tmpccmr1 = 0; uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST5_PERIPH(TIMx)); assert_param(IS_TIM_ENCODER_MODE(tim_encodermode)); assert_param(IS_TIM_IC_POLARITY(tim_ic1polarity)); assert_param(IS_TIM_IC_POLARITY(tim_ic2polarity)); /* get the TIMx smcr register value */ tmpsmcr = TIMx->smcr; /* get the TIMx ccmr1 register value */ tmpccmr1 = TIMx->ccmr1; /* get the TIMx ccer register value */ tmpccer = TIMx->ccer; /* set the encoder mode */ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); tmpsmcr |= tim_encodermode; /* select the capture compare 1 and the capture compare 2 as input */ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S))); // 预留 ■ tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; // 预留 ■ /* set the ti1 and the ti2 polarities */ tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P))); tmpccer |= (uint16_t)(tim_ic1polarity | (uint16_t)(tim_ic2polarity << (uint16_t)4)); /* write to TIMx smcr */ TIMx->smcr = tmpsmcr; /* write to TIMx ccmr1 */ TIMx->ccmr1 = tmpccmr1; /* write to TIMx ccer */ TIMx->ccer = tmpccer; } /** * @brief forces the TIMx output 1 waveform to active or inactive level. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_forcedaction: specifies the forced action to be set to the output waveform. * this parameter can be one of the following values: * @arg tim_forcedaction_active: force active level on oc1ref * @arg tim_forcedaction_inactive: force inactive level on oc1ref. * @retval none */ AT(.com_periph.tim.forcedoc1) void tim_forcedoc1config(tim_typedef* TIMx, uint16_t tim_forcedaction) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(is_tim_list8_periph(TIMx)); assert_param(IS_TIM_FORCED_ACTION(tim_forcedaction)); tmpccmr1 = TIMx->ccmr1; /* reset the oc1m bits */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M); /* configure the forced output mode */ tmpccmr1 |= tim_forcedaction; /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief forces the TIMx output 2 waveform to active or inactive level. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_forcedaction: specifies the forced action to be set to the output waveform. * this parameter can be one of the following values: * @arg tim_forcedaction_active: force active level on oc2ref * @arg tim_forcedaction_inactive: force inactive level on oc2ref. * @retval none */ AT(.com_periph.tim.forcedoc2) void tim_forcedoc2config(tim_typedef* TIMx, uint16_t tim_forcedaction) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_FORCED_ACTION(tim_forcedaction)); tmpccmr1 = TIMx->ccmr1; /* reset the oc2m bits */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M); /* configure the forced output mode */ tmpccmr1 |= (uint16_t)(tim_forcedaction << 8); /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief forces the TIMx output 3 waveform to active or inactive level. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_forcedaction: specifies the forced action to be set to the output waveform. * this parameter can be one of the following values: * @arg tim_forcedaction_active: force active level on oc3ref * @arg tim_forcedaction_inactive: force inactive level on oc3ref. * @retval none */ AT(.com_periph.tim.forcedoc3) void tim_forcedoc3config(tim_typedef* TIMx, uint16_t tim_forcedaction) { uint16_t tmpccmr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_FORCED_ACTION(tim_forcedaction)); tmpccmr2 = TIMx->ccmr2; /* reset the oc1m bits */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M); /* configure the forced output mode */ tmpccmr2 |= tim_forcedaction; /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief forces the TIMx output 4 waveform to active or inactive level. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_forcedaction: specifies the forced action to be set to the output waveform. * this parameter can be one of the following values: * @arg tim_forcedaction_active: force active level on oc4ref * @arg tim_forcedaction_inactive: force inactive level on oc4ref. * @retval none */ AT(.com_periph.tim.forcedoc4) void tim_forcedoc4config(tim_typedef* TIMx, uint16_t tim_forcedaction) { uint16_t tmpccmr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_FORCED_ACTION(tim_forcedaction)); tmpccmr2 = TIMx->ccmr2; /* reset the oc2m bits */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M); /* configure the forced output mode */ tmpccmr2 |= (uint16_t)(tim_forcedaction << 8); /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief enables or DISABLEs TIMx peripheral preload register on arr. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param newstate: new state of the TIMx peripheral preload register * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_periph.tim.arrpreload) void tim_arrpreloadconfig(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(is_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* set the arr preload bit */ TIMx->cr1 |= TIM_CR1_ARPE; } else { /* reset the arr preload bit */ TIMx->cr1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE); } } /** * @brief selects the tim peripheral commutation event. * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral * @param newstate: new state of the commutation event. * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_periph.tim.selectcom) void tim_selectcom(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(is_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* set the com bit */ TIMx->cr2 |= TIM_CR2_CCUS; } else { /* reset the com bit */ TIMx->cr2 &= (uint16_t)~((uint16_t)TIM_CR2_CCUS); } } /** * @brief selects the TIMx peripheral capture compare dma source. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select * the tim peripheral. * @param newstate: new state of the capture compare dma source * this parameter can be: enable or DISABLE. * @retval none */ //void tim_selectccdma(tim_typedef* TIMx, FUNCTIONAL_STATE newstate)预留 //{ // /* check the parameters */ // assert_param(IS_TIM_LIST4_PERIPH(TIMx)); // assert_param(is_FUNCTIONAL_STATE(newstate)); // if (newstate != DISABLE) // { // /* set the ccds bit */ // TIMx->cr2 |= TIM_CR2_CCDS; // 预留 ■ // } // else // { // /* reset the ccds bit */ // TIMx->cr2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS); // 预留 ■ // } //} /** * @brief sets or resets the tim peripheral capture compare preload control bit. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8 or 15 * to select the TIMx peripheral * @param newstate: new state of the capture compare preload control bit * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_periph.tim.ccpreloadcontrol) void tim_ccpreloadcontrol(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_LIST5_PERIPH(TIMx)); assert_param(is_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* set the ccpc bit */ TIMx->cr2 |= TIM_CR2_CCPC; } else { /* reset the ccpc bit */ TIMx->cr2 &= (uint16_t)~((uint16_t)TIM_CR2_CCPC); } } /** * @brief enables or DISABLEs the TIMx peripheral preload register on ccr1. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_ocpreload: new state of the TIMx peripheral preload register * this parameter can be one of the following values: * @arg tim_ocpreload_enable * @arg tim_ocpreload_DISABLE * @retval none */ AT(.com_periph.tim.oc1preload) void tim_oc1preloadconfig(tim_typedef* TIMx, uint16_t tim_ocpreload) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_OCPRELOAD_STATE(tim_ocpreload)); tmpccmr1 = TIMx->ccmr1; /* reset the oc1pe bit */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE); /* enable or DISABLE the output compare preload feature */ tmpccmr1 |= tim_ocpreload; /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief enables or DISABLEs the TIMx peripheral preload register on ccr2. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select * the tim peripheral. * @param tim_ocpreload: new state of the TIMx peripheral preload register * this parameter can be one of the following values: * @arg tim_ocpreload_enable * @arg tim_ocpreload_DISABLE * @retval none */ AT(.com_periph.tim.oc2preload) void tim_oc2preloadconfig(tim_typedef* TIMx, uint16_t tim_ocpreload) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_OCPRELOAD_STATE(tim_ocpreload)); tmpccmr1 = TIMx->ccmr1; /* reset the oc2pe bit */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE); /* enable or DISABLE the output compare preload feature */ tmpccmr1 |= (uint16_t)(tim_ocpreload << 8); /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief enables or DISABLEs the TIMx peripheral preload register on ccr3. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocpreload: new state of the TIMx peripheral preload register * this parameter can be one of the following values: * @arg tim_ocpreload_enable * @arg tim_ocpreload_DISABLE * @retval none */ AT(.com_periph.tim.oc3preload) void tim_oc3preloadconfig(tim_typedef* TIMx, uint16_t tim_ocpreload) { uint16_t tmpccmr2 = 0; /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // assert_param(IS_TIM_OCPRELOAD_STATE(tim_ocpreload)); tmpccmr2 = TIMx->ccmr2; /* reset the oc3pe bit */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE); /* enable or DISABLE the output compare preload feature */ tmpccmr2 |= tim_ocpreload; /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief enables or DISABLEs the TIMx peripheral preload register on ccr4. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocpreload: new state of the TIMx peripheral preload register * this parameter can be one of the following values: * @arg tim_ocpreload_enable * @arg tim_ocpreload_DISABLE * @retval none */ AT(.com_periph.tim.oc4preload) void tim_oc4preloadconfig(tim_typedef* TIMx, uint16_t tim_ocpreload) { uint16_t tmpccmr2 = 0; /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // assert_param(IS_TIM_OCPRELOAD_STATE(tim_ocpreload)); tmpccmr2 = TIMx->ccmr2; /* reset the oc4pe bit */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE); /* enable or DISABLE the output compare preload feature */ tmpccmr2 |= (uint16_t)(tim_ocpreload << 8); /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief configures the TIMx output compare 1 fast feature. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_ocfast: new state of the output compare fast enable bit. * this parameter can be one of the following values: * @arg tim_ocfast_enable: tim output compare fast enable * @arg tim_ocfast_DISABLE: tim output compare fast DISABLE * @retval none */ //void tim_oc1fastconfig(tim_typedef* TIMx, uint16_t tim_ocfast) 预留 //{ // uint16_t tmpccmr1 = 0; // /* check the parameters */ // assert_param(IS_TIM_LIST8_PERIPH(TIMx)); // assert_param(IS_TIM_OCFAST_STATE(tim_ocfast)); // /* get the TIMx ccmr1 register value */ // tmpccmr1 = TIMx->ccmr1; // /* reset the oc1fe bit */ // tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE); // 预留 ■ // /* enable or DISABLE the output compare fast bit */ // tmpccmr1 |= tim_ocfast; // /* write to TIMx ccmr1 */ // TIMx->ccmr1 = tmpccmr1; //} /** * @brief configures the TIMx output compare 2 fast feature. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select * the tim peripheral. * @param tim_ocfast: new state of the output compare fast enable bit. * this parameter can be one of the following values: * @arg tim_ocfast_enable: tim output compare fast enable * @arg tim_ocfast_DISABLE: tim output compare fast DISABLE * @retval none */ //void tim_oc2fastconfig(tim_typedef* TIMx, uint16_t tim_ocfast) 预留 //{ // uint16_t tmpccmr1 = 0; // /* check the parameters */ //// assert_param(IS_TIM_LIST6_PERIPH(TIMx)); //// assert_param(IS_TIM_OCFAST_STATE(tim_ocfast)); // /* get the TIMx ccmr1 register value */ // tmpccmr1 = TIMx->ccmr1; // /* reset the oc2fe bit */ // tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE); // 预留 ■ // /* enable or DISABLE the output compare fast bit */ // tmpccmr1 |= (uint16_t)(tim_ocfast << 8); // /* write to TIMx ccmr1 */ // TIMx->ccmr1 = tmpccmr1; //} /** * @brief configures the TIMx output compare 3 fast feature. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocfast: new state of the output compare fast enable bit. * this parameter can be one of the following values: * @arg tim_ocfast_enable: tim output compare fast enable * @arg tim_ocfast_DISABLE: tim output compare fast DISABLE * @retval none */ //void tim_oc3fastconfig(tim_typedef* TIMx, uint16_t tim_ocfast) 预留 //{ // uint16_t tmpccmr2 = 0; // /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // assert_param(IS_TIM_OCFAST_STATE(tim_ocfast)); // /* get the TIMx ccmr2 register value */ // tmpccmr2 = TIMx->ccmr2; // /* reset the oc3fe bit */ // tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE); // 预留 ■ // /* enable or DISABLE the output compare fast bit */ // tmpccmr2 |= tim_ocfast; // /* write to TIMx ccmr2 */ // TIMx->ccmr2 = tmpccmr2; //} /** * @brief configures the TIMx output compare 4 fast feature. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocfast: new state of the output compare fast enable bit. * this parameter can be one of the following values: * @arg tim_ocfast_enable: tim output compare fast enable * @arg tim_ocfast_DISABLE: tim output compare fast DISABLE * @retval none */ //void tim_oc4fastconfig(tim_typedef* TIMx, uint16_t tim_ocfast) 预留 //{ // uint16_t tmpccmr2 = 0; // /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // assert_param(IS_TIM_OCFAST_STATE(tim_ocfast)); // /* get the TIMx ccmr2 register value */ // tmpccmr2 = TIMx->ccmr2; // /* reset the oc4fe bit */ // tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE); // 预留 ■ // /* enable or DISABLE the output compare fast bit */ // tmpccmr2 |= (uint16_t)(tim_ocfast << 8); // /* write to TIMx ccmr2 */ // TIMx->ccmr2 = tmpccmr2; //} /** * @brief clears or safeguards the ocref1 signal on an external event * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_occlear: new state of the output compare clear enable bit. * this parameter can be one of the following values: * @arg tim_occlear_enable: tim output clear enable * @arg tim_occlear_DISABLE: tim output clear DISABLE * @retval none */ AT(.com_periph.tim.clearoc1) void tim_clearoc1ref(tim_typedef* TIMx, uint16_t tim_occlear) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OCCLEAR_STATE(tim_occlear)); tmpccmr1 = TIMx->ccmr1; /* reset the oc1ce bit */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE); /* enable or DISABLE the output compare clear bit */ tmpccmr1 |= tim_occlear; /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief clears or safeguards the ocref2 signal on an external event * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_occlear: new state of the output compare clear enable bit. * this parameter can be one of the following values: * @arg tim_occlear_enable: tim output clear enable * @arg tim_occlear_DISABLE: tim output clear DISABLE * @retval none */ AT(.com_periph.tim.clearoc2) void tim_clearoc2ref(tim_typedef* TIMx, uint16_t tim_occlear) { uint16_t tmpccmr1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OCCLEAR_STATE(tim_occlear)); tmpccmr1 = TIMx->ccmr1; /* reset the oc2ce bit */ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE); /* enable or DISABLE the output compare clear bit */ tmpccmr1 |= (uint16_t)(tim_occlear << 8); /* write to TIMx ccmr1 register */ TIMx->ccmr1 = tmpccmr1; } /** * @brief clears or safeguards the ocref3 signal on an external event * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_occlear: new state of the output compare clear enable bit. * this parameter can be one of the following values: * @arg tim_occlear_enable: tim output clear enable * @arg tim_occlear_DISABLE: tim output clear DISABLE * @retval none */ AT(.com_periph.tim.clearoc3) void tim_clearoc3ref(tim_typedef* TIMx, uint16_t tim_occlear) { uint16_t tmpccmr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OCCLEAR_STATE(tim_occlear)); tmpccmr2 = TIMx->ccmr2; /* reset the oc3ce bit */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE); /* enable or DISABLE the output compare clear bit */ tmpccmr2 |= tim_occlear; /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief clears or safeguards the ocref4 signal on an external event * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_occlear: new state of the output compare clear enable bit. * this parameter can be one of the following values: * @arg tim_occlear_enable: tim output clear enable * @arg tim_occlear_DISABLE: tim output clear DISABLE * @retval none */ AT(.com_periph.tim.clearoc4) void tim_clearoc4ref(tim_typedef* TIMx, uint16_t tim_occlear) { uint16_t tmpccmr2 = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OCCLEAR_STATE(tim_occlear)); tmpccmr2 = TIMx->ccmr2; /* reset the oc4ce bit */ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE); /* enable or DISABLE the output compare clear bit */ tmpccmr2 |= (uint16_t)(tim_occlear << 8); /* write to TIMx ccmr2 register */ TIMx->ccmr2 = tmpccmr2; } /** * @brief configures the TIMx channel 1 polarity. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_ocpolarity: specifies the oc1 polarity * this parameter can be one of the following values: * @arg TIM_OCPOLARITY_HIGH: output compare active high * @arg tim_ocpolarity_low: output compare active low * @retval none */ AT(.com_periph.tim.oc1polarity) void tim_oc1polarityconfig(tim_typedef* TIMx, uint16_t tim_ocpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_OC_POLARITY(tim_ocpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc1p bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P); tmpccer |= tim_ocpolarity; /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 1n polarity. * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the tim peripheral. * @param tim_ocnpolarity: specifies the oc1n polarity * this parameter can be one of the following values: * @arg tim_ocnpolarity_high: output compare active high * @arg tim_ocnpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc1npolarity) void tim_oc1npolarityconfig(tim_typedef* TIMx, uint16_t tim_ocnpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(IS_TIM_OCN_POLARITY(tim_ocnpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc1np bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1NP); tmpccer |= tim_ocnpolarity; /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 2 polarity. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_ocpolarity: specifies the oc2 polarity * this parameter can be one of the following values: * @arg TIM_OCPOLARITY_HIGH: output compare active high * @arg tim_ocpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc2polarity) void tim_oc2polarityconfig(tim_typedef* TIMx, uint16_t tim_ocpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_OC_POLARITY(tim_ocpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc2p bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P); tmpccer |= (uint16_t)(tim_ocpolarity << 4); /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 2n polarity. * @param TIMx: where x can be 1 or 8 to select the tim peripheral. * @param tim_ocnpolarity: specifies the oc2n polarity * this parameter can be one of the following values: * @arg tim_ocnpolarity_high: output compare active high * @arg tim_ocnpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc2npolarity) void tim_oc2npolarityconfig(tim_typedef* TIMx, uint16_t tim_ocnpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST1_PERIPH(TIMx)); assert_param(IS_TIM_OCN_POLARITY(tim_ocnpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc2np bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2NP); tmpccer |= (uint16_t)(tim_ocnpolarity << 4); /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 3 polarity. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocpolarity: specifies the oc3 polarity * this parameter can be one of the following values: * @arg TIM_OCPOLARITY_HIGH: output compare active high * @arg tim_ocpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc3polarity) void tim_oc3polarityconfig(tim_typedef* TIMx, uint16_t tim_ocpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OC_POLARITY(tim_ocpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc3p bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P); tmpccer |= (uint16_t)(tim_ocpolarity << 8); /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 3n polarity. * @param TIMx: where x can be 1 or 8 to select the tim peripheral. * @param tim_ocnpolarity: specifies the oc3n polarity * this parameter can be one of the following values: * @arg tim_ocnpolarity_high: output compare active high * @arg tim_ocnpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc3npolarity) void tim_oc3npolarityconfig(tim_typedef* TIMx, uint16_t tim_ocnpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST1_PERIPH(TIMx)); assert_param(IS_TIM_OCN_POLARITY(tim_ocnpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc3np bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3NP); tmpccer |= (uint16_t)(tim_ocnpolarity << 8); /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief configures the TIMx channel 4 polarity. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_ocpolarity: specifies the oc4 polarity * this parameter can be one of the following values: * @arg TIM_OCPOLARITY_HIGH: output compare active high * @arg tim_ocpolarity_low: output compare active low * @retval none */ AT(.com_periph.oc4polarity) void tim_oc4polarityconfig(tim_typedef* TIMx, uint16_t tim_ocpolarity) { uint16_t tmpccer = 0; /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_OC_POLARITY(tim_ocpolarity)); tmpccer = TIMx->ccer; /* set or reset the cc4p bit */ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P); tmpccer |= (uint16_t)(tim_ocpolarity << 12); /* write to TIMx ccer register */ TIMx->ccer = tmpccer; } /** * @brief enables or DISABLEs the tim capture compare channel x. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_channel: specifies the tim channel * this parameter can be one of the following values: * @arg TIM_CHANNEL_1: tim channel 1 * @arg TIM_CHANNEL_2: tim channel 2 * @arg TIM_CHANNEL_3: tim channel 3 * @arg TIM_CHANNEL_4: tim channel 4 * @param tim_ccx: specifies the tim channel ccxe bit new state. * this parameter can be: tim_ccx_enable or tim_ccx_DISABLE. * @retval none */ AT(.com_periph.ccxcmd) void tim_ccxcmd(tim_typedef* TIMx, uint16_t tim_channel, uint16_t tim_ccx) { uint16_t tmp = 0; /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_CHANNEL(tim_channel)); assert_param(IS_TIM_CCX(tim_ccx)); tmp = CCER_CCE_SET << tim_channel; /* reset the ccxe bit */ TIMx->ccer &= (uint16_t)~ tmp; /* set or reset the ccxe bit */ TIMx->ccer |= (uint16_t)(tim_ccx << tim_channel); } /** * @brief enables or DISABLEs the tim capture compare channel xn. * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the tim peripheral. * @param tim_channel: specifies the tim channel * this parameter can be one of the following values: * @arg TIM_CHANNEL_1: tim channel 1 * @arg TIM_CHANNEL_2: tim channel 2 * @arg TIM_CHANNEL_3: tim channel 3 * @param tim_ccxn: specifies the tim channel ccxne bit new state. * this parameter can be: tim_ccxn_enable or tim_ccxn_DISABLE. * @retval none */ AT(.com_periph.ccxncmd) void tim_ccxncmd(tim_typedef* TIMx, uint16_t tim_channel, uint16_t tim_ccxn) { uint16_t tmp = 0; /* check the parameters */ assert_param(IS_TIM_LIST2_PERIPH(TIMx)); assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(tim_channel)); assert_param(IS_TIM_CCXN(tim_ccxn)); tmp = CCER_CCNE_SET << tim_channel; /* reset the ccxne bit */ TIMx->ccer &= (uint16_t) ~tmp; /* set or reset the ccxne bit */ TIMx->ccer |= (uint16_t)(tim_ccxn << tim_channel); } /** * @brief selects the tim output compare mode. * @note this function DISABLEs the selected channel before changing the output * compare mode. * user has to enable this channel using tim_ccxcmd and tim_ccxncmd functions. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_channel: specifies the tim channel * this parameter can be one of the following values: * @arg TIM_CHANNEL_1: tim channel 1 * @arg TIM_CHANNEL_2: tim channel 2 * @arg TIM_CHANNEL_3: tim channel 3 * @arg TIM_CHANNEL_4: tim channel 4 * @param tim_ocmode: specifies the tim output compare mode. * this parameter can be one of the following values: * @arg TIM_OCMODE_TIMING * @arg tim_ocmode_active * @arg tim_ocmode_toggle * @arg tim_ocmode_low * @arg tim_ocmode_high * @arg tim_ocmode_pwm1 * @arg tim_ocmode_pwm2 * @arg tim_forcedaction_active * @arg tim_forcedaction_inactive * @retval none */ AT(.com_periph.selectocxm) void tim_selectocxm(tim_typedef* TIMx, uint16_t tim_channel, uint16_t tim_ocmode) { uint32_t tmp = 0; uint16_t tmp1 = 0; /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_CHANNEL(tim_channel)); assert_param(IS_TIM_OCM(tim_ocmode)); tmp = (uint32_t) TIMx; tmp += CCMR_OFFSET; tmp1 = CCER_CCE_SET << (uint16_t)tim_channel; /* DISABLE the channel: reset the ccxe bit */ TIMx->ccer &= (uint16_t) ~tmp1; if((tim_channel == TIM_CHANNEL_1) ||(tim_channel == TIM_CHANNEL_3)) { tmp += (tim_channel>>1); /* reset the ocxm bits in the ccmrx register */ *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); /* configure the ocxm bits in the ccmrx register */ *(__IO uint32_t *) tmp |= tim_ocmode; } else { tmp += (uint16_t)(tim_channel - (uint16_t)4)>> (uint16_t)1; /* reset the ocxm bits in the ccmrx register */ *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); /* configure the ocxm bits in the ccmrx register */ *(__IO uint32_t *) tmp |= (uint16_t)(tim_ocmode << 8); } } /** * @brief enables or DISABLEs the TIMx update event. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param newstate: new state of the TIMx udis bit * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_periph.tim.updatedisable) void tim_updatedisableconfig(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_FUNCTIONAL_STATE(newstate)); if (newstate != DISABLE) { /* set the update DISABLE bit */ TIMx->cr1 |= TIM_CR1_UDIS; } else { /* reset the update DISABLE bit */ TIMx->cr1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS); } } /** * @brief configures the TIMx update request interrupt source. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_updatesource: specifies the update source. * this parameter can be one of the following values: * @arg tim_updatesource_regular: source of update is the counter overflow/underflow or the setting of ug bit, or an update generation through the slave mode controller. * @arg tim_updatesource_global: source of update is counter overflow/underflow. * @retval none */ AT(.com_periph.tim.updaterequest) void tim_updaterequestconfig(tim_typedef* TIMx, uint16_t tim_updatesource) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_UPDATE_SOURCE(tim_updatesource)); if (tim_updatesource != TIM_UPDATESOURCE_GLOBAL) { /* set the urs bit */ TIMx->cr1 |= TIM_CR1_URS; } else { /* reset the urs bit */ TIMx->cr1 &= (uint16_t)~((uint16_t)TIM_CR1_URS); } } /** * @brief enables or DISABLEs the TIMx's hall sensor interface. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param newstate: new state of the TIMx hall sensor interface. * this parameter can be: enable or DISABLE. * @retval none */ //void tim_selecthallsensor(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) 预留 //{ // /* check the parameters */ // assert_param(IS_TIM_LIST6_PERIPH(TIMx)); // assert_param(IS_FUNCTIONAL_STATE(newstate)); // if (newstate != DISABLE) // { // /* set the ti1s bit */ // TIMx->cr2 |= TIM_CR2_TI1S; // 预留 ■ // } // else // { // /* reset the ti1s bit */ // TIMx->cr2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S); // 预留 ■ // } //} /** * @brief selects the TIMx's one pulse mode. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_opmode: specifies the opm mode to be used. * this parameter can be one of the following values: * @arg tim_opmode_single * @arg tim_opmode_repetitive * @retval none */ AT(.com_periph.selectonepulsemode) void tim_selectonepulsemode(tim_typedef* TIMx, uint16_t tim_opmode) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_OPM_MODE(tim_opmode)); /* reset the opm bit */ TIMx->cr1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM); /* configure the opm mode */ TIMx->cr1 |= tim_opmode; } /** * @brief selects the TIMx trigger output mode. * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_trgosource: specifies the trigger output source. * this paramter can be one of the following values: * * - for all TIMx * @arg tim_trgosource_reset: the ug bit in the tim_egr register is used as the trigger output (trgo). * @arg tim_trgosource_enable: the counter enable cen is used as the trigger output (trgo). * @arg tim_trgosource_update: the update event is selected as the trigger output (trgo). * * - for all TIMx except tim6 and tim7 * @arg tim_trgosource_oc1: the trigger output sends a positive pulse when the cc1if flag * is to be set, as soon as a capture or compare match occurs (trgo). * @arg tim_trgosource_oc1ref: oc1ref signal is used as the trigger output (trgo). * @arg tim_trgosource_oc2ref: oc2ref signal is used as the trigger output (trgo). * @arg tim_trgosource_oc3ref: oc3ref signal is used as the trigger output (trgo). * @arg tim_trgosource_oc4ref: oc4ref signal is used as the trigger output (trgo). * * @retval none */ AT(.com_periph.tim.selectoutputtrigger) void tim_selectoutputtrigger(tim_typedef* TIMx, uint16_t tim_trgosource) { /* check the parameters */ assert_param(IS_TIM_LIST7_PERIPH(TIMx)); assert_param(IS_TIM_TRGO_SOURCE(tim_trgosource)); /* reset the mms bits */ TIMx->cr2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS); /* select the trgo source */ TIMx->cr2 |= tim_trgosource; } /** * @brief selects the TIMx slave mode. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_slavemode: specifies the timer slave mode. * this parameter can be one of the following values: * @arg tim_slavemode_reset: rising edge of the selected trigger signal (trgi) re-initializes * the counter and triggers an update of the registers. * @arg tim_slavemode_gated: the counter clock is enabled when the trigger signal (trgi) is high. * @arg tim_slavemode_trigger: the counter starts at a rising edge of the trigger trgi. * @arg TIM_SLAVEMODE_EXTERNAL1: rising edges of the selected trigger (trgi) clock the counter. * @retval none */ AT(.com_periph.tim.selectslavemode) void tim_selectslavemode(tim_typedef* TIMx, uint16_t tim_slavemode) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_SLAVE_MODE(tim_slavemode)); /* reset the sms bits */ TIMx->smcr &= (uint16_t)~((uint16_t)TIM_SMCR_SMS); /* select the slave mode */ TIMx->smcr |= tim_slavemode; } /** * @brief sets or resets the TIMx master/slave mode. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_masterslavemode: specifies the timer master slave mode. * this parameter can be one of the following values: * @arg tim_masterslavemode_enable: synchronization between the current timer * and its slaves (through trgo). * @arg tim_masterslavemode_DISABLE: no action * @retval none */ //void tim_selectmasterslavemode(tim_typedef* TIMx, uint16_t tim_masterslavemode) 预留 //{ // /* check the parameters */ // assert_param(IS_TIM_LIST6_PERIPH(TIMx)); // assert_param(IS_TIM_MSM_STATE(tim_masterslavemode)); // /* reset the msm bit */ // TIMx->smcr &= (uint16_t)~((uint16_t)TIM_SMCR_MSM); // 预留 ■ // // /* set or reset the msm bit */ // TIMx->smcr |= tim_masterslavemode; //} /** * @brief sets the TIMx counter register value * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param counter: specifies the counter register new value. * @retval none */ AT(.com_periph.tim.setcounter) void tim_setcounter(tim_typedef* TIMx, uint16_t counter) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); /* set the counter register value */ TIMx->cnt = counter; } /** * @brief sets the TIMx autoreload register value * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param autoreload: specifies the autoreload register new value. * @retval none */ AT(.com_periph.tim.setautoreload) void tim_setautoreload(tim_typedef* TIMx, uint16_t autoreload) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); /* set the autoreload register value */ TIMx->arr = autoreload; } /** * @brief sets the TIMx capture compare1 register value * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param compare1: specifies the capture compare1 register new value. * @retval none */ AT(.com_periph.setcompare1) void tim_setcompare1(tim_typedef* TIMx, uint16_t compare1) { /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); /* set the capture compare1 register value */ TIMx->ccr1 = compare1; } /** * @brief sets the TIMx capture compare2 register value * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param compare2: specifies the capture compare2 register new value. * @retval none */ AT(.com_periph.setcompare2) void tim_setcompare2(tim_typedef* TIMx, uint16_t compare2) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); /* set the capture compare2 register value */ TIMx->ccr2 = compare2; } /** * @brief sets the TIMx capture compare3 register value * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param compare3: specifies the capture compare3 register new value. * @retval none */ AT(.com_periph.setcompare3) void tim_setcompare3(tim_typedef* TIMx, uint16_t compare3) { /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); /* set the capture compare3 register value */ TIMx->ccr3 = compare3; } /** * @brief sets the TIMx capture compare4 register value * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param compare4: specifies the capture compare4 register new value. * @retval none */ AT(.com_periph.setcompare4) void tim_setcompare4(tim_typedef* TIMx, uint16_t compare4) { /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); /* set the capture compare4 register value */ TIMx->ccr4 = compare4; } /** * @brief sets the TIMx input capture 1 prescaler. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_icpsc: specifies the input capture1 prescaler new value. * this parameter can be one of the following values: * @arg TIM_ICPSC_DIV1: no prescaler * @arg tim_icpsc_div2: capture is done once every 2 events * @arg tim_icpsc_div4: capture is done once every 4 events * @arg tim_icpsc_div8: capture is done once every 8 events * @retval none */ AT(.com_periph.setic1prescaler) void tim_setic1prescaler(tim_typedef* TIMx, uint16_t tim_icpsc) { /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_IC_PRESCALER(tim_icpsc)); /* reset the ic1psc bits */ TIMx->ccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC); // 预留 ■ /* set the ic1psc value */ TIMx->ccmr1 |= tim_icpsc; } /** * @brief sets the TIMx input capture 2 prescaler. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_icpsc: specifies the input capture2 prescaler new value. * this parameter can be one of the following values: * @arg TIM_ICPSC_DIV1: no prescaler * @arg tim_icpsc_div2: capture is done once every 2 events * @arg tim_icpsc_div4: capture is done once every 4 events * @arg tim_icpsc_div8: capture is done once every 8 events * @retval none */ AT(.com_periph.setic2prescaler) void tim_setic2prescaler(tim_typedef* TIMx, uint16_t tim_icpsc) { /* check the parameters */ assert_param(IS_TIM_LIST6_PERIPH(TIMx)); assert_param(IS_TIM_IC_PRESCALER(tim_icpsc)); /* reset the ic2psc bits */ TIMx->ccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC); // 预留 ■ /* set the ic2psc value */ TIMx->ccmr1 |= (uint16_t)(tim_icpsc << 8); } /** * @brief sets the TIMx input capture 3 prescaler. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_icpsc: specifies the input capture3 prescaler new value. * this parameter can be one of the following values: * @arg TIM_ICPSC_DIV1: no prescaler * @arg tim_icpsc_div2: capture is done once every 2 events * @arg tim_icpsc_div4: capture is done once every 4 events * @arg tim_icpsc_div8: capture is done once every 8 events * @retval none */ AT(.com_periph.setic3prescaler) void tim_setic3prescaler(tim_typedef* TIMx, uint16_t tim_icpsc) { /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_IC_PRESCALER(tim_icpsc)); /* reset the ic3psc bits */ TIMx->ccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC); // 预留 ■ /* set the ic3psc value */ TIMx->ccmr2 |= tim_icpsc; } /** * @brief sets the TIMx input capture 4 prescaler. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_icpsc: specifies the input capture4 prescaler new value. * this parameter can be one of the following values: * @arg TIM_ICPSC_DIV1: no prescaler * @arg tim_icpsc_div2: capture is done once every 2 events * @arg tim_icpsc_div4: capture is done once every 4 events * @arg tim_icpsc_div8: capture is done once every 8 events * @retval none */ AT(.com_periph.setic4prescaler) void tim_setic4prescaler(tim_typedef* TIMx, uint16_t tim_icpsc) { /* check the parameters */ assert_param(IS_TIM_LIST3_PERIPH(TIMx)); assert_param(IS_TIM_IC_PRESCALER(tim_icpsc)); /* reset the ic4psc bits */ TIMx->ccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC); // 预留 ■ /* set the ic4psc value */ TIMx->ccmr2 |= (uint16_t)(tim_icpsc << 8); } /** * @brief sets the TIMx clock division value. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select * the tim peripheral. * @param tim_ckd: specifies the clock division value. * this parameter can be one of the following value: * @arg TIM_CKD_DIV1: tdts = tck_tim * @arg tim_ckd_div2: tdts = 2*tck_tim * @arg tim_ckd_div4: tdts = 4*tck_tim * @retval none */ AT(.com_periph.tim.setclockdivision) void tim_setclockdivision(tim_typedef* TIMx, uint16_t tim_ckd) { /* check the parameters */ assert_param(IS_TIM_LIST8_PERIPH(TIMx)); assert_param(IS_TIM_CKD_DIV(tim_ckd)); /* reset the ckd bits */ TIMx->cr1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD); /* set the ckd value */ TIMx->cr1 |= tim_ckd; } /** * @brief gets the TIMx input capture 1 value. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @retval capture compare 1 register value. */ //uint16_t tim_getcapture1(tim_typedef* TIMx) //{ // /* check the parameters */ // assert_param(IS_TIM_LIST8_PERIPH(TIMx)); // /* get the capture 1 register value */ // return TIMx->ccr1; //} /** * @brief gets the TIMx input capture 2 value. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @retval capture compare 2 register value. */ //uint16_t tim_getcapture2(tim_typedef* TIMx) //{ // /* check the parameters */ // assert_param(IS_TIM_LIST6_PERIPH(TIMx)); // /* get the capture 2 register value */ // return TIMx->ccr2; //} /** * @brief gets the TIMx input capture 3 value. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @retval capture compare 3 register value. */ //uint16_t tim_getcapture3(tim_typedef* TIMx) //{ // /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // /* get the capture 3 register value */ // return TIMx->ccr3; //} /** * @brief gets the TIMx input capture 4 value. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @retval capture compare 4 register value. */ //uint16_t tim_getcapture4(tim_typedef* TIMx) //{ // /* check the parameters */ // assert_param(IS_TIM_LIST3_PERIPH(TIMx)); // /* get the capture 4 register value */ // return TIMx->ccr4; //} /** * @brief gets the TIMx counter value. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @retval counter register value. */ AT(.com_periph.tim.getcounter) uint16_t tim_getcounter(tim_typedef* TIMx) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); /* get the counter register value */ return TIMx->cnt; } /** * @brief gets the TIMx prescaler value. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @retval prescaler register value. */ AT(.com_periph.tim.getprescaler) uint16_t tim_getprescaler(tim_typedef* TIMx) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); /* get the prescaler register value */ return TIMx->psc; } /** * @brief checks whether the specified tim flag is set or not. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_flag: specifies the flag to check. * this parameter can be one of the following values: * @arg tim_flag_update: tim update flag * @arg tim_flag_cc1: tim capture compare 1 flag * @arg tim_flag_cc2: tim capture compare 2 flag * @arg tim_flag_cc3: tim capture compare 3 flag * @arg tim_flag_cc4: tim capture compare 4 flag * @arg tim_flag_com: tim commutation flag * @arg tim_flag_trigger: tim trigger flag * @arg tim_flag_break: tim break flag * @arg tim_flag_cc1of: tim capture compare 1 overcapture flag * @arg tim_flag_cc2of: tim capture compare 2 overcapture flag * @arg tim_flag_cc3of: tim capture compare 3 overcapture flag * @arg tim_flag_cc4of: tim capture compare 4 overcapture flag * @note * - tim6 and tim7 can have only one update flag. * - tim9, TIM12 and TIM15 can have only tim_flag_update, tim_flag_cc1, * tim_flag_cc2 or tim_flag_trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have tim_flag_update or tim_flag_cc1. * - tim_flag_break is used only with TIM1, tim8 and TIM15. * - tim_flag_com is used only with TIM1, tim8, TIM15, TIM16 and TIM17. * @retval the new state of tim_flag (set or reset). */ AT(.com_periph.getflagstatus) FLAG_STATE tim_getflagstatus(tim_typedef* TIMx, uint16_t tim_flag) { IT_STATE bitstatus = RESET; /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_GET_FLAG(tim_flag)); if ((TIMx->sr & tim_flag) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } /** * @brief clears the TIMx's pending flags. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_flag: specifies the flag bit to clear. * this parameter can be any combination of the following values: * @arg tim_flag_update: tim update flag * @arg tim_flag_cc1: tim capture compare 1 flag * @arg tim_flag_cc2: tim capture compare 2 flag * @arg tim_flag_cc3: tim capture compare 3 flag * @arg tim_flag_cc4: tim capture compare 4 flag * @arg tim_flag_com: tim commutation flag * @arg tim_flag_trigger: tim trigger flag * @arg tim_flag_break: tim break flag * @arg tim_flag_cc1of: tim capture compare 1 overcapture flag * @arg tim_flag_cc2of: tim capture compare 2 overcapture flag * @arg tim_flag_cc3of: tim capture compare 3 overcapture flag * @arg tim_flag_cc4of: tim capture compare 4 overcapture flag * @note * - tim6 and tim7 can have only one update flag. * - tim9, TIM12 and TIM15 can have only tim_flag_update, tim_flag_cc1, * tim_flag_cc2 or tim_flag_trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have tim_flag_update or tim_flag_cc1. * - tim_flag_break is used only with TIM1, tim8 and TIM15. * - tim_flag_com is used only with TIM1, tim8, TIM15, TIM16 and TIM17. * @retval none */ AT(.com_periph.clearflag) void tim_clearflag(tim_typedef* TIMx, uint16_t tim_flag) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_CLEAR_FLAG(tim_flag)); /* clear the flags */ TIMx->sr = (uint16_t)tim_flag; } /** * @brief checks whether the tim interrupt has occurred or not. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_it: specifies the tim interrupt source to check. * this parameter can be one of the following values: * @arg tim_it_update: tim update interrupt source * @arg tim_it_cc1: tim capture compare 1 interrupt source * @arg tim_it_cc2: tim capture compare 2 interrupt source * @arg tim_it_cc3: tim capture compare 3 interrupt source * @arg tim_it_cc4: tim capture compare 4 interrupt source * @arg tim_it_com: tim commutation interrupt source * @arg tim_it_trigger: tim trigger interrupt source * @arg tim_it_break: tim break interrupt source * @note * - tim6 and tim7 can generate only an update interrupt. * - tim9, TIM12 and TIM15 can have only tim_it_update, tim_it_cc1, * tim_it_cc2 or tim_it_trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have tim_it_update or tim_it_cc1. * - tim_it_break is used only with TIM1, tim8 and TIM15. * - tim_it_com is used only with TIM1, tim8, TIM15, TIM16 and TIM17. * @retval the new state of the tim_it(set or reset). */ AT(.com_periph.getitstatus) IT_STATE tim_getitstatus(tim_typedef* TIMx, uint16_t tim_it) { IT_STATE bitstatus = RESET; uint16_t itstatus = 0x0, itenable = 0x0; /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_GET_IT(tim_it)); itstatus = TIMx->sr & tim_it; itenable = TIMx->dier & tim_it; if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } /** * @brief clears the TIMx's interrupt pending bits. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param tim_it: specifies the pending bit to clear. * this parameter can be any combination of the following values: * @arg tim_it_update: TIM1 update interrupt source * @arg tim_it_cc1: tim capture compare 1 interrupt source * @arg tim_it_cc2: tim capture compare 2 interrupt source * @arg tim_it_cc3: tim capture compare 3 interrupt source * @arg tim_it_cc4: tim capture compare 4 interrupt source * @arg tim_it_com: tim commutation interrupt source * @arg tim_it_trigger: tim trigger interrupt source * @arg tim_it_break: tim break interrupt source * @note * - tim6 and tim7 can generate only an update interrupt. * - tim9, TIM12 and TIM15 can have only tim_it_update, tim_it_cc1, * tim_it_cc2 or tim_it_trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have tim_it_update or tim_it_cc1. * - tim_it_break is used only with TIM1, tim8 and TIM15. * - tim_it_com is used only with TIM1, tim8, TIM15, TIM16 and TIM17. * @retval none */ AT(.com_periph.clearitpendingbit) void tim_clearitpendingbit(tim_typedef* TIMx, uint16_t tim_it) { /* check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_IT(tim_it)); /* clear the it pending bit */ TIMx->sr = (uint16_t)tim_it; } /** * @brief configure the ti1 as input. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the tim peripheral. * @param tim_icpolarity : the input polarity. * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_RISING * @arg TIM_ICPOLARITY_FALLING * @param tim_icselection: specifies the input to be used. * this parameter can be one of the following values: * @arg TIM_ICSELECTION_DIRECTTI: tim input 1 is selected to be connected to ic1. * @arg TIM_ICSELECTION_INDIRECTTI: tim input 1 is selected to be connected to ic2. * @arg tim_icselection_trc: tim input 1 is selected to be connected to trc. * @param tim_icfilter: specifies the input capture filter. * this parameter must be a value between 0x00 and 0x0f. * @retval none */ static void ti1_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, uint16_t tim_icfilter) { uint16_t tmpccmr1 = 0, tmpccer = 0; /* DISABLE the channel 1: reset the cc1e bit */ TIMx->ccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1E); tmpccmr1 = TIMx->ccmr1; tmpccer = TIMx->ccer; /* select the input and set the filter */ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F))); // 预留 ■ tmpccmr1 |= (uint16_t)(tim_icselection | (uint16_t)(tim_icfilter << (uint16_t)4)); if(TIMx == TIM1) { /* select the polarity and set the cc1e bit */ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P)); tmpccer |= (uint16_t)(tim_icpolarity | (uint16_t)TIM_CCER_CC1E); } else { /* select the polarity and set the cc1e bit */ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP)); tmpccer |= (uint16_t)(tim_icpolarity | (uint16_t)TIM_CCER_CC1E); } /* write to TIMx ccmr1 and ccer registers */ TIMx->ccmr1 = tmpccmr1; TIMx->ccer = tmpccer; } /** * @brief configure the ti2 as input. * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the tim peripheral. * @param tim_icpolarity : the input polarity. * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_RISING * @arg TIM_ICPOLARITY_FALLING * @param tim_icselection: specifies the input to be used. * this parameter can be one of the following values: * @arg TIM_ICSELECTION_DIRECTTI: tim input 2 is selected to be connected to ic2. * @arg TIM_ICSELECTION_INDIRECTTI: tim input 2 is selected to be connected to ic1. * @arg tim_icselection_trc: tim input 2 is selected to be connected to trc. * @param tim_icfilter: specifies the input capture filter. * this parameter must be a value between 0x00 and 0x0f. * @retval none */ static void ti2_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, uint16_t tim_icfilter) { uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; /* DISABLE the channel 2: reset the cc2e bit */ TIMx->ccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2E); tmpccmr1 = TIMx->ccmr1; tmpccer = TIMx->ccer; tmp = (uint16_t)(tim_icpolarity << 4); /* select the input and set the filter */ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F))); // 预留 ■ tmpccmr1 |= (uint16_t)(tim_icfilter << 12); tmpccmr1 |= (uint16_t)(tim_icselection << 8); if(TIMx == TIM1) { /* select the polarity and set the cc2e bit */ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P)); tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); } else { /* select the polarity and set the cc2e bit */ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); tmpccer |= (uint16_t)(tim_icpolarity | (uint16_t)TIM_CCER_CC2E); } /* write to TIMx ccmr1 and ccer registers */ TIMx->ccmr1 = tmpccmr1 ; TIMx->ccer = tmpccer; } /** * @brief configure the ti3 as input. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_icpolarity : the input polarity. * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_RISING * @arg TIM_ICPOLARITY_FALLING * @param tim_icselection: specifies the input to be used. * this parameter can be one of the following values: * @arg TIM_ICSELECTION_DIRECTTI: tim input 3 is selected to be connected to ic3. * @arg TIM_ICSELECTION_INDIRECTTI: tim input 3 is selected to be connected to ic4. * @arg tim_icselection_trc: tim input 3 is selected to be connected to trc. * @param tim_icfilter: specifies the input capture filter. * this parameter must be a value between 0x00 and 0x0f. * @retval none */ //static void ti3_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, 预留 // uint16_t tim_icfilter) //{ // uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; // /* DISABLE the channel 3: reset the cc3e bit */ // TIMx->ccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3E); // tmpccmr2 = TIMx->ccmr2; // tmpccer = TIMx->ccer; // tmp = (uint16_t)(tim_icpolarity << 8); // /* select the input and set the filter */ // tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F))); // 预留 ■ // tmpccmr2 |= (uint16_t)(tim_icselection | (uint16_t)(tim_icfilter << (uint16_t)4)); // // if(TIMx == TIM1) // { // /* select the polarity and set the cc3e bit */ // tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P)); // tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); // } // else // { // /* select the polarity and set the cc3e bit */ // tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP)); // tmpccer |= (uint16_t)(tim_icpolarity | (uint16_t)TIM_CCER_CC3E); // } // // /* write to TIMx ccmr2 and ccer registers */ // TIMx->ccmr2 = tmpccmr2; // TIMx->ccer = tmpccer; //} /** * @brief configure the ti4 as input. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the tim peripheral. * @param tim_icpolarity : the input polarity. * this parameter can be one of the following values: * @arg TIM_ICPOLARITY_RISING * @arg TIM_ICPOLARITY_FALLING * @param tim_icselection: specifies the input to be used. * this parameter can be one of the following values: * @arg TIM_ICSELECTION_DIRECTTI: tim input 4 is selected to be connected to ic4. * @arg TIM_ICSELECTION_INDIRECTTI: tim input 4 is selected to be connected to ic3. * @arg tim_icselection_trc: tim input 4 is selected to be connected to trc. * @param tim_icfilter: specifies the input capture filter. * this parameter must be a value between 0x00 and 0x0f. * @retval none */ //static void ti4_config(tim_typedef* TIMx, uint16_t tim_icpolarity, uint16_t tim_icselection, 预留 // uint16_t tim_icfilter) //{ // uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; // // /* DISABLE the channel 4: reset the cc4e bit */ // TIMx->ccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4E); // tmpccmr2 = TIMx->ccmr2; // tmpccer = TIMx->ccer; // tmp = (uint16_t)(tim_icpolarity << 12); // /* select the input and set the filter */ // tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F))); // 预留 ■ // tmpccmr2 |= (uint16_t)(tim_icselection << 8); // tmpccmr2 |= (uint16_t)(tim_icfilter << 12); // // if(TIMx == TIM1) // { // /* select the polarity and set the cc4e bit */ // tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P)); // tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); // } // else // { // /* select the polarity and set the cc4e bit */ // tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC4NP)); // 预留 ■ // tmpccer |= (uint16_t)(tim_icpolarity | (uint16_t)TIM_CCER_CC4E); // } // /* write to TIMx ccmr2 and ccer registers */ // TIMx->ccmr2 = tmpccmr2; // TIMx->ccer = tmpccer; //} /** * @brief enables or DISABLEs the TIMx saradc trgo enable or DISABLE. * @param TIMx: where x can be 1 to 17 to select the tim peripheral. * @param newstate: new state of the TIMx saradc trgo bit * this parameter can be: enable or DISABLE. * @retval none */ AT(.com_periph.tim.trgosaradc) void tim_trgosaradc_config(tim_typedef* TIMx, FUNCTIONAL_STATE newstate) { if(newstate != DISABLE) { /* set the update DISABLE bit */ TIMx->sarad |= TIM_SARAD_TRGOEN; } else { /* reset the update DISABLE bit */ TIMx->sarad &= (uint32_t)~((uint32_t)TIM_SARAD_TRGOEN); } }