#include "interval.h" #include "cgc.h" /** * @brief This function initializes the interval module. * @param IT_InitStruct: pointer to a IT_InitTypeDef structure that contains * the configuration information for the specified interval peripheral. * @retval None */ void IT_Init(IT_InitTypeDef *IT_InitStruct) { assert_param(IS_COUNTER_RANGER(IT_InitStruct->IT_Counter)); assert_param(IS_IT_CLKSRC(IT_InitStruct->IT_ClkSource)); CGC_PER0PeriphClockCmd(CGC_PER0Periph_RTC,ENABLE); switch(IT_InitStruct->IT_ClkSource) { case IT_FIL : CGC->OSMC |= 1<<4; MISC->RTCCL = 0x01; break; case IT_FSUB: MISC->RTCCL = 0x00; break; case IT_FHOCO: MISC->RTCCL = 0x80; MISC->RTCCL |= IT_InitStruct->IT_Freqscaler; break; case IT_FMX: MISC->RTCCL = 0x00; MISC->RTCCL |= IT_InitStruct->IT_Freqscaler; break; default: break; } RTC->ITMC = 0x0000; // OPERATION_DISABLE INTC_DisableIRQ(IT_IRQn); // disable INTIT interrupt INTC_ClearPendingIRQ(IT_IRQn); // clear INTIT interrupt flag RTC->ITMC = IT_InitStruct->IT_Counter; } /** * @brief This function enables IntervalTimer count operation and clears interrupt flag. * @param None * @retval None */ void IT_Start(void) { INTC_ClearPendingIRQ(IT_IRQn); // clear INTIT interrupt flag NVIC_ClearPendingIRQ(IT_IRQn); // clear INTIT interrupt flag INTC_EnableIRQ(IT_IRQn); // enable INTIT interrupt RTC->ITMC |= 0x8000; //OPERATION_ENABLE /* confirm the IntervalTimer is running */ while((RTC->ITMC & 0x8000) == 0U); /* wait ITMC.RINTE == 1 */ } /** * @brief This function disables IntervalTimer count operation and clears interrupt flag. * @param None * @retval None */ void IT_Stop(void) { INTC_DisableIRQ(IT_IRQn); // disable INTIT interrupt INTC_ClearPendingIRQ(IT_IRQn); // clear INTIT interrupt flag NVIC_ClearPendingIRQ(IT_IRQn); // clear INTIT interrupt flag RTC->ITMC &= (uint16_t)~0x8000; }