mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
172:7d866c31b3c5
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 172:7d866c31b3c5 1 /**************************************************************************//**
AnnaBridge 172:7d866c31b3c5 2 * @file timer.c
AnnaBridge 172:7d866c31b3c5 3 * @brief M480 Timer Controller(Timer) driver source file
AnnaBridge 172:7d866c31b3c5 4 *
AnnaBridge 172:7d866c31b3c5 5 * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.
AnnaBridge 172:7d866c31b3c5 6 *****************************************************************************/
AnnaBridge 172:7d866c31b3c5 7 #include "M480.h"
AnnaBridge 172:7d866c31b3c5 8
AnnaBridge 172:7d866c31b3c5 9
AnnaBridge 172:7d866c31b3c5 10 /** @addtogroup M480_Device_Driver M480 Device Driver
AnnaBridge 172:7d866c31b3c5 11 @{
AnnaBridge 172:7d866c31b3c5 12 */
AnnaBridge 172:7d866c31b3c5 13
AnnaBridge 172:7d866c31b3c5 14 /** @addtogroup M480_TIMER_Driver TIMER Driver
AnnaBridge 172:7d866c31b3c5 15 @{
AnnaBridge 172:7d866c31b3c5 16 */
AnnaBridge 172:7d866c31b3c5 17
AnnaBridge 172:7d866c31b3c5 18 /** @addtogroup M480_TIMER_EXPORTED_FUNCTIONS TIMER Exported Functions
AnnaBridge 172:7d866c31b3c5 19 @{
AnnaBridge 172:7d866c31b3c5 20 */
AnnaBridge 172:7d866c31b3c5 21
AnnaBridge 172:7d866c31b3c5 22 /**
AnnaBridge 172:7d866c31b3c5 23 * @brief Open Timer with Operate Mode and Frequency
AnnaBridge 172:7d866c31b3c5 24 *
AnnaBridge 172:7d866c31b3c5 25 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 26 * @param[in] u32Mode Operation mode. Possible options are
AnnaBridge 172:7d866c31b3c5 27 * - \ref TIMER_ONESHOT_MODE
AnnaBridge 172:7d866c31b3c5 28 * - \ref TIMER_PERIODIC_MODE
AnnaBridge 172:7d866c31b3c5 29 * - \ref TIMER_TOGGLE_MODE
AnnaBridge 172:7d866c31b3c5 30 * - \ref TIMER_CONTINUOUS_MODE
AnnaBridge 172:7d866c31b3c5 31 * @param[in] u32Freq Target working frequency
AnnaBridge 172:7d866c31b3c5 32 *
AnnaBridge 172:7d866c31b3c5 33 * @return Real timer working frequency
AnnaBridge 172:7d866c31b3c5 34 *
AnnaBridge 172:7d866c31b3c5 35 * @details This API is used to configure timer to operate in specified mode and frequency.
AnnaBridge 172:7d866c31b3c5 36 * If timer cannot work in target frequency, a closest frequency will be chose and returned.
AnnaBridge 172:7d866c31b3c5 37 * @note After calling this API, Timer is \b NOT running yet. But could start timer running be calling
AnnaBridge 172:7d866c31b3c5 38 * \ref TIMER_Start macro or program registers directly.
AnnaBridge 172:7d866c31b3c5 39 */
AnnaBridge 172:7d866c31b3c5 40 uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)
AnnaBridge 172:7d866c31b3c5 41 {
AnnaBridge 172:7d866c31b3c5 42 uint32_t u32Clk = TIMER_GetModuleClock(timer);
AnnaBridge 172:7d866c31b3c5 43 uint32_t u32Cmpr = 0UL, u32Prescale = 0UL;
AnnaBridge 172:7d866c31b3c5 44
AnnaBridge 172:7d866c31b3c5 45 /* Fastest possible timer working freq is (u32Clk / 2). While cmpr = 2, prescaler = 0. */
AnnaBridge 172:7d866c31b3c5 46 if(u32Freq > (u32Clk / 2UL)) {
AnnaBridge 172:7d866c31b3c5 47 u32Cmpr = 2UL;
AnnaBridge 172:7d866c31b3c5 48 } else {
AnnaBridge 172:7d866c31b3c5 49 if(u32Clk > 128000000UL) {
AnnaBridge 172:7d866c31b3c5 50 u32Prescale = 15UL; /* real prescaler value is 16 */
AnnaBridge 172:7d866c31b3c5 51 u32Clk >>= 4;
AnnaBridge 172:7d866c31b3c5 52 } else if(u32Clk > 64000000UL) {
AnnaBridge 172:7d866c31b3c5 53 u32Prescale = 7UL; /* real prescaler value is 8 */
AnnaBridge 172:7d866c31b3c5 54 u32Clk >>= 3;
AnnaBridge 172:7d866c31b3c5 55 } else if(u32Clk > 32000000UL) {
AnnaBridge 172:7d866c31b3c5 56 u32Prescale = 3UL; /* real prescaler value is 4 */
AnnaBridge 172:7d866c31b3c5 57 u32Clk >>= 2;
AnnaBridge 172:7d866c31b3c5 58 } else if(u32Clk > 16000000UL) {
AnnaBridge 172:7d866c31b3c5 59 u32Prescale = 1UL; /* real prescaler value is 2 */
AnnaBridge 172:7d866c31b3c5 60 u32Clk >>= 1;
AnnaBridge 172:7d866c31b3c5 61 }
AnnaBridge 172:7d866c31b3c5 62
AnnaBridge 172:7d866c31b3c5 63 u32Cmpr = u32Clk / u32Freq;
AnnaBridge 172:7d866c31b3c5 64 }
AnnaBridge 172:7d866c31b3c5 65
AnnaBridge 172:7d866c31b3c5 66 timer->CTL = u32Mode | u32Prescale;
AnnaBridge 172:7d866c31b3c5 67 timer->CMP = u32Cmpr;
AnnaBridge 172:7d866c31b3c5 68
AnnaBridge 172:7d866c31b3c5 69 return(u32Clk / (u32Cmpr * (u32Prescale + 1UL)));
AnnaBridge 172:7d866c31b3c5 70 }
AnnaBridge 172:7d866c31b3c5 71
AnnaBridge 172:7d866c31b3c5 72 /**
AnnaBridge 172:7d866c31b3c5 73 * @brief Stop Timer Counting
AnnaBridge 172:7d866c31b3c5 74 *
AnnaBridge 172:7d866c31b3c5 75 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 76 *
AnnaBridge 172:7d866c31b3c5 77 * @return None
AnnaBridge 172:7d866c31b3c5 78 *
AnnaBridge 172:7d866c31b3c5 79 * @details This API stops timer counting and disable all timer interrupt function.
AnnaBridge 172:7d866c31b3c5 80 */
AnnaBridge 172:7d866c31b3c5 81 void TIMER_Close(TIMER_T *timer)
AnnaBridge 172:7d866c31b3c5 82 {
AnnaBridge 172:7d866c31b3c5 83 timer->CTL = 0UL;
AnnaBridge 172:7d866c31b3c5 84 timer->EXTCTL = 0UL;
AnnaBridge 172:7d866c31b3c5 85 }
AnnaBridge 172:7d866c31b3c5 86
AnnaBridge 172:7d866c31b3c5 87 /**
AnnaBridge 172:7d866c31b3c5 88 * @brief Create a specify Delay Time
AnnaBridge 172:7d866c31b3c5 89 *
AnnaBridge 172:7d866c31b3c5 90 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 91 * @param[in] u32Usec Delay period in micro seconds. Valid values are between 100~1000000 (100 micro second ~ 1 second).
AnnaBridge 172:7d866c31b3c5 92 *
AnnaBridge 172:7d866c31b3c5 93 * @return None
AnnaBridge 172:7d866c31b3c5 94 *
AnnaBridge 172:7d866c31b3c5 95 * @details This API is used to create a delay loop for u32usec micro seconds by using timer one-shot mode.
AnnaBridge 172:7d866c31b3c5 96 * @note This API overwrites the register setting of the timer used to count the delay time.
AnnaBridge 172:7d866c31b3c5 97 * @note This API use polling mode. So there is no need to enable interrupt for the timer module used to generate delay.
AnnaBridge 172:7d866c31b3c5 98 */
AnnaBridge 172:7d866c31b3c5 99 void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec)
AnnaBridge 172:7d866c31b3c5 100 {
AnnaBridge 172:7d866c31b3c5 101 uint32_t u32Clk = TIMER_GetModuleClock(timer);
AnnaBridge 172:7d866c31b3c5 102 uint32_t u32Prescale = 0UL, delay = (SystemCoreClock / u32Clk) + 1UL;
AnnaBridge 172:7d866c31b3c5 103 uint32_t u32Cmpr, u32NsecPerTick;
AnnaBridge 172:7d866c31b3c5 104
AnnaBridge 172:7d866c31b3c5 105 /* Clear current timer configuration */
AnnaBridge 172:7d866c31b3c5 106 timer->CTL = 0UL;
AnnaBridge 172:7d866c31b3c5 107 timer->EXTCTL = 0UL;
AnnaBridge 172:7d866c31b3c5 108
AnnaBridge 172:7d866c31b3c5 109 if(u32Clk <= 1000000UL) { /* min delay is 1000 us if timer clock source is <= 1 MHz */
AnnaBridge 172:7d866c31b3c5 110 if(u32Usec < 1000UL) {
AnnaBridge 172:7d866c31b3c5 111 u32Usec = 1000UL;
AnnaBridge 172:7d866c31b3c5 112 }
AnnaBridge 172:7d866c31b3c5 113 if(u32Usec > 1000000UL) {
AnnaBridge 172:7d866c31b3c5 114 u32Usec = 1000000UL;
AnnaBridge 172:7d866c31b3c5 115 }
AnnaBridge 172:7d866c31b3c5 116 } else {
AnnaBridge 172:7d866c31b3c5 117 if(u32Usec < 100UL) {
AnnaBridge 172:7d866c31b3c5 118 u32Usec = 100UL;
AnnaBridge 172:7d866c31b3c5 119 }
AnnaBridge 172:7d866c31b3c5 120 if(u32Usec > 1000000UL) {
AnnaBridge 172:7d866c31b3c5 121 u32Usec = 1000000UL;
AnnaBridge 172:7d866c31b3c5 122 }
AnnaBridge 172:7d866c31b3c5 123 }
AnnaBridge 172:7d866c31b3c5 124
AnnaBridge 172:7d866c31b3c5 125 if(u32Clk <= 1000000UL) {
AnnaBridge 172:7d866c31b3c5 126 u32Prescale = 0UL;
AnnaBridge 172:7d866c31b3c5 127 u32NsecPerTick = 1000000000UL / u32Clk;
AnnaBridge 172:7d866c31b3c5 128 u32Cmpr = (u32Usec * 1000UL) / u32NsecPerTick;
AnnaBridge 172:7d866c31b3c5 129 } else {
AnnaBridge 172:7d866c31b3c5 130 if(u32Clk > 128000000UL) {
AnnaBridge 172:7d866c31b3c5 131 u32Prescale = 15UL; /* real prescaler value is 16 */
AnnaBridge 172:7d866c31b3c5 132 u32Clk >>= 4;
AnnaBridge 172:7d866c31b3c5 133 } else if(u32Clk > 64000000UL) {
AnnaBridge 172:7d866c31b3c5 134 u32Prescale = 7UL; /* real prescaler value is 8 */
AnnaBridge 172:7d866c31b3c5 135 u32Clk >>= 3;
AnnaBridge 172:7d866c31b3c5 136 } else if(u32Clk > 32000000UL) {
AnnaBridge 172:7d866c31b3c5 137 u32Prescale = 3UL; /* real prescaler value is 4 */
AnnaBridge 172:7d866c31b3c5 138 u32Clk >>= 2;
AnnaBridge 172:7d866c31b3c5 139 } else if(u32Clk > 16000000UL) {
AnnaBridge 172:7d866c31b3c5 140 u32Prescale = 1UL; /* real prescaler value is 2 */
AnnaBridge 172:7d866c31b3c5 141 u32Clk >>= 1;
AnnaBridge 172:7d866c31b3c5 142 }
AnnaBridge 172:7d866c31b3c5 143
AnnaBridge 172:7d866c31b3c5 144 if(u32Usec < 250UL) {
AnnaBridge 172:7d866c31b3c5 145 u32Cmpr = (u32Usec * u32Clk) / 1000000UL;
AnnaBridge 172:7d866c31b3c5 146 } else {
AnnaBridge 172:7d866c31b3c5 147 u32NsecPerTick = 1000000000UL / u32Clk;
AnnaBridge 172:7d866c31b3c5 148 u32Cmpr = (u32Usec * 1000UL) / u32NsecPerTick;
AnnaBridge 172:7d866c31b3c5 149 }
AnnaBridge 172:7d866c31b3c5 150 }
AnnaBridge 172:7d866c31b3c5 151
AnnaBridge 172:7d866c31b3c5 152 timer->CMP = u32Cmpr;
AnnaBridge 172:7d866c31b3c5 153 timer->CTL = TIMER_CTL_CNTEN_Msk | TIMER_ONESHOT_MODE | u32Prescale;
AnnaBridge 172:7d866c31b3c5 154
AnnaBridge 172:7d866c31b3c5 155 /* When system clock is faster than timer clock, it is possible timer active bit cannot set in time while we check it.
AnnaBridge 172:7d866c31b3c5 156 And the while loop below return immediately, so put a tiny delay here allowing timer start counting and raise active flag. */
AnnaBridge 172:7d866c31b3c5 157 for(; delay > 0UL; delay--) {
AnnaBridge 172:7d866c31b3c5 158 __NOP();
AnnaBridge 172:7d866c31b3c5 159 }
AnnaBridge 172:7d866c31b3c5 160
AnnaBridge 172:7d866c31b3c5 161 while(timer->CTL & TIMER_CTL_ACTSTS_Msk) {
AnnaBridge 172:7d866c31b3c5 162 ;
AnnaBridge 172:7d866c31b3c5 163 }
AnnaBridge 172:7d866c31b3c5 164 }
AnnaBridge 172:7d866c31b3c5 165
AnnaBridge 172:7d866c31b3c5 166 /**
AnnaBridge 172:7d866c31b3c5 167 * @brief Enable Timer Capture Function
AnnaBridge 172:7d866c31b3c5 168 *
AnnaBridge 172:7d866c31b3c5 169 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 170 * @param[in] u32CapMode Timer capture mode. Could be
AnnaBridge 172:7d866c31b3c5 171 * - \ref TIMER_CAPTURE_FREE_COUNTING_MODE
AnnaBridge 172:7d866c31b3c5 172 * - \ref TIMER_CAPTURE_COUNTER_RESET_MODE
AnnaBridge 172:7d866c31b3c5 173 * @param[in] u32Edge Timer capture trigger edge. Possible values are
AnnaBridge 172:7d866c31b3c5 174 * - \ref TIMER_CAPTURE_EVENT_FALLING
AnnaBridge 172:7d866c31b3c5 175 * - \ref TIMER_CAPTURE_EVENT_RISING
AnnaBridge 172:7d866c31b3c5 176 * - \ref TIMER_CAPTURE_EVENT_FALLING_RISING
AnnaBridge 172:7d866c31b3c5 177 * - \ref TIMER_CAPTURE_EVENT_RISING_FALLING
AnnaBridge 172:7d866c31b3c5 178 *
AnnaBridge 172:7d866c31b3c5 179 * @return None
AnnaBridge 172:7d866c31b3c5 180 *
AnnaBridge 172:7d866c31b3c5 181 * @details This API is used to enable timer capture function with specify capture trigger edge \n
AnnaBridge 172:7d866c31b3c5 182 * to get current counter value or reset counter value to 0.
AnnaBridge 172:7d866c31b3c5 183 * @note Timer frequency should be configured separately by using \ref TIMER_Open API, or program registers directly.
AnnaBridge 172:7d866c31b3c5 184 */
AnnaBridge 172:7d866c31b3c5 185 void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge)
AnnaBridge 172:7d866c31b3c5 186 {
AnnaBridge 172:7d866c31b3c5 187 timer->EXTCTL = (timer->EXTCTL & ~(TIMER_EXTCTL_CAPFUNCS_Msk | TIMER_EXTCTL_CAPEDGE_Msk)) |
AnnaBridge 172:7d866c31b3c5 188 u32CapMode | u32Edge | TIMER_EXTCTL_CAPEN_Msk;
AnnaBridge 172:7d866c31b3c5 189 }
AnnaBridge 172:7d866c31b3c5 190
AnnaBridge 172:7d866c31b3c5 191 /**
AnnaBridge 172:7d866c31b3c5 192 * @brief Disable Timer Capture Function
AnnaBridge 172:7d866c31b3c5 193 *
AnnaBridge 172:7d866c31b3c5 194 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 195 *
AnnaBridge 172:7d866c31b3c5 196 * @return None
AnnaBridge 172:7d866c31b3c5 197 *
AnnaBridge 172:7d866c31b3c5 198 * @details This API is used to disable the timer capture function.
AnnaBridge 172:7d866c31b3c5 199 */
AnnaBridge 172:7d866c31b3c5 200 void TIMER_DisableCapture(TIMER_T *timer)
AnnaBridge 172:7d866c31b3c5 201 {
AnnaBridge 172:7d866c31b3c5 202 timer->EXTCTL &= ~TIMER_EXTCTL_CAPEN_Msk;
AnnaBridge 172:7d866c31b3c5 203 }
AnnaBridge 172:7d866c31b3c5 204
AnnaBridge 172:7d866c31b3c5 205 /**
AnnaBridge 172:7d866c31b3c5 206 * @brief Enable Timer Counter Function
AnnaBridge 172:7d866c31b3c5 207 *
AnnaBridge 172:7d866c31b3c5 208 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 209 * @param[in] u32Edge Detection edge of counter pin. Could be ether
AnnaBridge 172:7d866c31b3c5 210 * - \ref TIMER_COUNTER_EVENT_FALLING, or
AnnaBridge 172:7d866c31b3c5 211 * - \ref TIMER_COUNTER_EVENT_RISING
AnnaBridge 172:7d866c31b3c5 212 *
AnnaBridge 172:7d866c31b3c5 213 * @return None
AnnaBridge 172:7d866c31b3c5 214 *
AnnaBridge 172:7d866c31b3c5 215 * @details This function is used to enable the timer counter function with specify detection edge.
AnnaBridge 172:7d866c31b3c5 216 * @note Timer compare value should be configured separately by using \ref TIMER_SET_CMP_VALUE macro or program registers directly.
AnnaBridge 172:7d866c31b3c5 217 * @note While using event counter function, \ref TIMER_TOGGLE_MODE cannot set as timer operation mode.
AnnaBridge 172:7d866c31b3c5 218 */
AnnaBridge 172:7d866c31b3c5 219 void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge)
AnnaBridge 172:7d866c31b3c5 220 {
AnnaBridge 172:7d866c31b3c5 221 timer->EXTCTL = (timer->EXTCTL & ~TIMER_EXTCTL_CNTPHASE_Msk) | u32Edge;
AnnaBridge 172:7d866c31b3c5 222 timer->CTL |= TIMER_CTL_EXTCNTEN_Msk;
AnnaBridge 172:7d866c31b3c5 223 }
AnnaBridge 172:7d866c31b3c5 224
AnnaBridge 172:7d866c31b3c5 225 /**
AnnaBridge 172:7d866c31b3c5 226 * @brief Disable Timer Counter Function
AnnaBridge 172:7d866c31b3c5 227 *
AnnaBridge 172:7d866c31b3c5 228 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 229 *
AnnaBridge 172:7d866c31b3c5 230 * @return None
AnnaBridge 172:7d866c31b3c5 231 *
AnnaBridge 172:7d866c31b3c5 232 * @details This API is used to disable the timer event counter function.
AnnaBridge 172:7d866c31b3c5 233 */
AnnaBridge 172:7d866c31b3c5 234 void TIMER_DisableEventCounter(TIMER_T *timer)
AnnaBridge 172:7d866c31b3c5 235 {
AnnaBridge 172:7d866c31b3c5 236 timer->CTL &= ~TIMER_CTL_EXTCNTEN_Msk;
AnnaBridge 172:7d866c31b3c5 237 }
AnnaBridge 172:7d866c31b3c5 238
AnnaBridge 172:7d866c31b3c5 239 /**
AnnaBridge 172:7d866c31b3c5 240 * @brief Get Timer Clock Frequency
AnnaBridge 172:7d866c31b3c5 241 *
AnnaBridge 172:7d866c31b3c5 242 * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
AnnaBridge 172:7d866c31b3c5 243 *
AnnaBridge 172:7d866c31b3c5 244 * @return Timer clock frequency
AnnaBridge 172:7d866c31b3c5 245 *
AnnaBridge 172:7d866c31b3c5 246 * @details This API is used to get the timer clock frequency.
AnnaBridge 172:7d866c31b3c5 247 * @note This API cannot return correct clock rate if timer source is from external clock input.
AnnaBridge 172:7d866c31b3c5 248 */
AnnaBridge 172:7d866c31b3c5 249 uint32_t TIMER_GetModuleClock(TIMER_T *timer)
AnnaBridge 172:7d866c31b3c5 250 {
AnnaBridge 172:7d866c31b3c5 251 uint32_t u32Src, u32Clk;
AnnaBridge 172:7d866c31b3c5 252 const uint32_t au32Clk[] = {__HXT, __LXT, 0UL, 0UL, 0UL, __LIRC, 0UL, __HIRC};
AnnaBridge 172:7d866c31b3c5 253
AnnaBridge 172:7d866c31b3c5 254 if(timer == TIMER0) {
AnnaBridge 172:7d866c31b3c5 255 u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR0SEL_Msk) >> CLK_CLKSEL1_TMR0SEL_Pos;
AnnaBridge 172:7d866c31b3c5 256 } else if(timer == TIMER1) {
AnnaBridge 172:7d866c31b3c5 257 u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR1SEL_Msk) >> CLK_CLKSEL1_TMR1SEL_Pos;
AnnaBridge 172:7d866c31b3c5 258 } else if(timer == TIMER2) {
AnnaBridge 172:7d866c31b3c5 259 u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR2SEL_Msk) >> CLK_CLKSEL1_TMR2SEL_Pos;
AnnaBridge 172:7d866c31b3c5 260 } else { /* Timer 3 */
AnnaBridge 172:7d866c31b3c5 261 u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR3SEL_Msk) >> CLK_CLKSEL1_TMR3SEL_Pos;
AnnaBridge 172:7d866c31b3c5 262 }
AnnaBridge 172:7d866c31b3c5 263
AnnaBridge 172:7d866c31b3c5 264 if(u32Src == 2UL) {
AnnaBridge 172:7d866c31b3c5 265 if((timer == TIMER0) || (timer == TIMER1)) {
AnnaBridge 172:7d866c31b3c5 266 u32Clk = CLK_GetPCLK0Freq();
AnnaBridge 172:7d866c31b3c5 267 } else {
AnnaBridge 172:7d866c31b3c5 268 u32Clk = CLK_GetPCLK1Freq();
AnnaBridge 172:7d866c31b3c5 269 }
AnnaBridge 172:7d866c31b3c5 270 } else {
AnnaBridge 172:7d866c31b3c5 271 u32Clk = au32Clk[u32Src];
AnnaBridge 172:7d866c31b3c5 272 }
AnnaBridge 172:7d866c31b3c5 273
AnnaBridge 172:7d866c31b3c5 274 return u32Clk;
AnnaBridge 172:7d866c31b3c5 275 }
AnnaBridge 172:7d866c31b3c5 276
AnnaBridge 172:7d866c31b3c5 277
AnnaBridge 172:7d866c31b3c5 278
AnnaBridge 172:7d866c31b3c5 279 /**
AnnaBridge 172:7d866c31b3c5 280 * @brief This function is used to enable the Timer frequency counter function
AnnaBridge 172:7d866c31b3c5 281 * @param[in] timer The base address of Timer module. Can be \ref TIMER0 or \ref TIMER2
AnnaBridge 172:7d866c31b3c5 282 * @param[in] u32DropCount This parameter has no effect in M480 series BSP
AnnaBridge 172:7d866c31b3c5 283 * @param[in] u32Timeout This parameter has no effect in M480 series BSP
AnnaBridge 172:7d866c31b3c5 284 * @param[in] u32EnableInt Enable interrupt assertion after capture complete or not. Valid values are TRUE and FALSE
AnnaBridge 172:7d866c31b3c5 285 * @return None
AnnaBridge 172:7d866c31b3c5 286 * @details This function is used to calculate input event frequency. After enable
AnnaBridge 172:7d866c31b3c5 287 * this function, a pair of timers, TIMER0 and TIMER1, or TIMER2 and TIMER3
AnnaBridge 172:7d866c31b3c5 288 * will be configured for this function. The mode used to calculate input
AnnaBridge 172:7d866c31b3c5 289 * event frequency is mentioned as "Inter Timer Trigger Mode" in Technical
AnnaBridge 172:7d866c31b3c5 290 * Reference Manual
AnnaBridge 172:7d866c31b3c5 291 */
AnnaBridge 172:7d866c31b3c5 292 void TIMER_EnableFreqCounter(TIMER_T *timer,
AnnaBridge 172:7d866c31b3c5 293 uint32_t u32DropCount,
AnnaBridge 172:7d866c31b3c5 294 uint32_t u32Timeout,
AnnaBridge 172:7d866c31b3c5 295 uint32_t u32EnableInt)
AnnaBridge 172:7d866c31b3c5 296 {
AnnaBridge 172:7d866c31b3c5 297 TIMER_T *t; /* store the timer base to configure compare value */
AnnaBridge 172:7d866c31b3c5 298
AnnaBridge 172:7d866c31b3c5 299 t = (timer == TIMER0) ? TIMER1 : TIMER3;
AnnaBridge 172:7d866c31b3c5 300
AnnaBridge 172:7d866c31b3c5 301 t->CMP = 0xFFFFFFUL;
AnnaBridge 172:7d866c31b3c5 302 t->EXTCTL = u32EnableInt ? TIMER_EXTCTL_CAPIEN_Msk : 0UL;
AnnaBridge 172:7d866c31b3c5 303 timer->CTL = TIMER_CTL_INTRGEN_Msk | TIMER_CTL_CNTEN_Msk;
AnnaBridge 172:7d866c31b3c5 304
AnnaBridge 172:7d866c31b3c5 305 return;
AnnaBridge 172:7d866c31b3c5 306 }
AnnaBridge 172:7d866c31b3c5 307 /**
AnnaBridge 172:7d866c31b3c5 308 * @brief This function is used to disable the Timer frequency counter function.
AnnaBridge 172:7d866c31b3c5 309 * @param[in] timer The base address of Timer module
AnnaBridge 172:7d866c31b3c5 310 * @return None
AnnaBridge 172:7d866c31b3c5 311 */
AnnaBridge 172:7d866c31b3c5 312 void TIMER_DisableFreqCounter(TIMER_T *timer)
AnnaBridge 172:7d866c31b3c5 313 {
AnnaBridge 172:7d866c31b3c5 314 timer->CTL &= ~TIMER_CTL_INTRGEN_Msk;
AnnaBridge 172:7d866c31b3c5 315 }
AnnaBridge 172:7d866c31b3c5 316
AnnaBridge 172:7d866c31b3c5 317
AnnaBridge 172:7d866c31b3c5 318 /**
AnnaBridge 172:7d866c31b3c5 319 * @brief This function is used to select the interrupt source used to trigger other modules.
AnnaBridge 172:7d866c31b3c5 320 * @param[in] timer The base address of Timer module
AnnaBridge 172:7d866c31b3c5 321 * @param[in] u32Src Selects the interrupt source to trigger other modules. Could be:
AnnaBridge 172:7d866c31b3c5 322 * - \ref TIMER_TRGSRC_TIMEOUT_EVENT
AnnaBridge 172:7d866c31b3c5 323 * - \ref TIMER_TRGSRC_CAPTURE_EVENT
AnnaBridge 172:7d866c31b3c5 324 * @return None
AnnaBridge 172:7d866c31b3c5 325 */
AnnaBridge 172:7d866c31b3c5 326 void TIMER_SetTriggerSource(TIMER_T *timer, uint32_t u32Src)
AnnaBridge 172:7d866c31b3c5 327 {
AnnaBridge 172:7d866c31b3c5 328 timer->TRGCTL = (timer->TRGCTL & ~TIMER_TRGCTL_TRGSSEL_Msk) | u32Src;
AnnaBridge 172:7d866c31b3c5 329 }
AnnaBridge 172:7d866c31b3c5 330
AnnaBridge 172:7d866c31b3c5 331 /**
AnnaBridge 172:7d866c31b3c5 332 * @brief This function is used to set modules trigger by timer interrupt
AnnaBridge 172:7d866c31b3c5 333 * @param[in] timer The base address of Timer module
AnnaBridge 172:7d866c31b3c5 334 * @param[in] u32Mask The mask of modules (EPWM, EADC, DAC and PDMA) trigger by timer. Is the combination of
AnnaBridge 172:7d866c31b3c5 335 * - \ref TIMER_TRG_TO_EPWM,
AnnaBridge 172:7d866c31b3c5 336 * - \ref TIMER_TRG_TO_EADC,
AnnaBridge 172:7d866c31b3c5 337 * - \ref TIMER_TRG_TO_DAC, and
AnnaBridge 172:7d866c31b3c5 338 * - \ref TIMER_TRG_TO_PDMA
AnnaBridge 172:7d866c31b3c5 339 * @return None
AnnaBridge 172:7d866c31b3c5 340 */
AnnaBridge 172:7d866c31b3c5 341 void TIMER_SetTriggerTarget(TIMER_T *timer, uint32_t u32Mask)
AnnaBridge 172:7d866c31b3c5 342 {
AnnaBridge 172:7d866c31b3c5 343 timer->TRGCTL = (timer->TRGCTL & ~(TIMER_TRGCTL_TRGEPWM_Msk | TIMER_TRGCTL_TRGDAC_Msk | TIMER_TRGCTL_TRGEADC_Msk | TIMER_TRGCTL_TRGPDMA_Msk)) | u32Mask;
AnnaBridge 172:7d866c31b3c5 344 }
AnnaBridge 172:7d866c31b3c5 345
AnnaBridge 172:7d866c31b3c5 346 /*@}*/ /* end of group M480_TIMER_EXPORTED_FUNCTIONS */
AnnaBridge 172:7d866c31b3c5 347
AnnaBridge 172:7d866c31b3c5 348 /*@}*/ /* end of group M480_TIMER_Driver */
AnnaBridge 172:7d866c31b3c5 349
AnnaBridge 172:7d866c31b3c5 350 /*@}*/ /* end of group M480_Device_Driver */
AnnaBridge 172:7d866c31b3c5 351