added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Fri Jan 15 07:45:16 2016 +0000
Revision:
50:a417edff4437
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision 6010f32619bfcbb01cc73747d4ff9040863482d9

Full URL: https://github.com/mbedmicro/mbed/commit/6010f32619bfcbb01cc73747d4ff9040863482d9/

Remove doubling of buffer size in realiseEndpoint()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 2 * @file rtc_api.c
bogdanm 0:9b334a45a8ff 3 *******************************************************************************
bogdanm 0:9b334a45a8ff 4 * @section License
bogdanm 0:9b334a45a8ff 5 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
bogdanm 0:9b334a45a8ff 6 *******************************************************************************
bogdanm 0:9b334a45a8ff 7 *
bogdanm 0:9b334a45a8ff 8 * Permission is granted to anyone to use this software for any purpose,
bogdanm 0:9b334a45a8ff 9 * including commercial applications, and to alter it and redistribute it
bogdanm 0:9b334a45a8ff 10 * freely, subject to the following restrictions:
bogdanm 0:9b334a45a8ff 11 *
bogdanm 0:9b334a45a8ff 12 * 1. The origin of this software must not be misrepresented; you must not
bogdanm 0:9b334a45a8ff 13 * claim that you wrote the original software.
bogdanm 0:9b334a45a8ff 14 * 2. Altered source versions must be plainly marked as such, and must not be
bogdanm 0:9b334a45a8ff 15 * misrepresented as being the original software.
bogdanm 0:9b334a45a8ff 16 * 3. This notice may not be removed or altered from any source distribution.
bogdanm 0:9b334a45a8ff 17 *
bogdanm 0:9b334a45a8ff 18 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
bogdanm 0:9b334a45a8ff 19 * obligation to support this Software. Silicon Labs is providing the
bogdanm 0:9b334a45a8ff 20 * Software "AS IS", with no express or implied warranties of any kind,
bogdanm 0:9b334a45a8ff 21 * including, but not limited to, any implied warranties of merchantability
bogdanm 0:9b334a45a8ff 22 * or fitness for any particular purpose or warranties against infringement
bogdanm 0:9b334a45a8ff 23 * of any proprietary rights of a third party.
bogdanm 0:9b334a45a8ff 24 *
bogdanm 0:9b334a45a8ff 25 * Silicon Labs will not be liable for any consequential, incidental, or
bogdanm 0:9b334a45a8ff 26 * special damages, or any other relief, or for any claim by any third party,
bogdanm 0:9b334a45a8ff 27 * arising from your use of this Software.
bogdanm 0:9b334a45a8ff 28 *
bogdanm 0:9b334a45a8ff 29 ******************************************************************************/
bogdanm 0:9b334a45a8ff 30
bogdanm 0:9b334a45a8ff 31 #include "device.h"
bogdanm 0:9b334a45a8ff 32 #if DEVICE_RTC
bogdanm 0:9b334a45a8ff 33
bogdanm 0:9b334a45a8ff 34 #include "rtc_api.h"
bogdanm 0:9b334a45a8ff 35 #include "rtc_api_HAL.h"
bogdanm 0:9b334a45a8ff 36 #include "em_cmu.h"
bogdanm 0:9b334a45a8ff 37 #include "sleep_api.h"
bogdanm 0:9b334a45a8ff 38 #include "sleepmodes.h"
bogdanm 0:9b334a45a8ff 39
mbed_official 50:a417edff4437 40 #if (defined RTC_COUNT) && (RTC_COUNT > 0)
mbed_official 50:a417edff4437 41 #include "em_rtc.h"
mbed_official 50:a417edff4437 42 #endif
mbed_official 50:a417edff4437 43
mbed_official 50:a417edff4437 44 #if (defined RTCC_COUNT) && (RTCC_COUNT > 0)
mbed_official 50:a417edff4437 45 #include "em_rtcc.h"
mbed_official 50:a417edff4437 46 #endif
mbed_official 50:a417edff4437 47
bogdanm 0:9b334a45a8ff 48 static bool rtc_inited = false;
bogdanm 0:9b334a45a8ff 49 static time_t time_base = 0;
bogdanm 0:9b334a45a8ff 50 static uint32_t useflags = 0;
bogdanm 0:9b334a45a8ff 51 static uint32_t time_extend = 0;
bogdanm 0:9b334a45a8ff 52
bogdanm 0:9b334a45a8ff 53 static void (*comp0_handler)(void) = NULL;
bogdanm 0:9b334a45a8ff 54
mbed_official 50:a417edff4437 55 #ifndef RTCC_COUNT
mbed_official 50:a417edff4437 56
mbed_official 50:a417edff4437 57 /* Using RTC API */
mbed_official 50:a417edff4437 58
bogdanm 0:9b334a45a8ff 59 #define RTC_LEAST_ACTIVE_SLEEPMODE EM2
bogdanm 0:9b334a45a8ff 60 #define RTC_NUM_BITS (24)
bogdanm 0:9b334a45a8ff 61
bogdanm 0:9b334a45a8ff 62 void RTC_IRQHandler(void)
bogdanm 0:9b334a45a8ff 63 {
bogdanm 0:9b334a45a8ff 64 uint32_t flags;
bogdanm 0:9b334a45a8ff 65 flags = RTC_IntGet();
bogdanm 0:9b334a45a8ff 66 if (flags & RTC_IF_OF) {
bogdanm 0:9b334a45a8ff 67 RTC_IntClear(RTC_IF_OF);
bogdanm 0:9b334a45a8ff 68 /* RTC has overflowed (24 bits). Use time_extend as software counter for 32 more bits. */
bogdanm 0:9b334a45a8ff 69 time_extend += 1;
bogdanm 0:9b334a45a8ff 70 }
bogdanm 0:9b334a45a8ff 71 if (flags & RTC_IF_COMP0) {
bogdanm 0:9b334a45a8ff 72 RTC_IntClear(RTC_IF_COMP0);
bogdanm 0:9b334a45a8ff 73 if (comp0_handler != NULL) {
bogdanm 0:9b334a45a8ff 74 comp0_handler();
bogdanm 0:9b334a45a8ff 75 }
bogdanm 0:9b334a45a8ff 76 }
bogdanm 0:9b334a45a8ff 77 }
bogdanm 0:9b334a45a8ff 78
mbed_official 50:a417edff4437 79 uint32_t rtc_get_32bit(void)
bogdanm 0:9b334a45a8ff 80 {
bogdanm 0:9b334a45a8ff 81 return (RTC_CounterGet() + (time_extend << RTC_NUM_BITS));
bogdanm 0:9b334a45a8ff 82 }
bogdanm 0:9b334a45a8ff 83
mbed_official 50:a417edff4437 84 uint64_t rtc_get_full(void)
bogdanm 0:9b334a45a8ff 85 {
bogdanm 0:9b334a45a8ff 86 uint64_t ticks = 0;
bogdanm 0:9b334a45a8ff 87 ticks += time_extend;
bogdanm 0:9b334a45a8ff 88 ticks = ticks << RTC_NUM_BITS;
bogdanm 0:9b334a45a8ff 89 ticks += RTC_CounterGet();
bogdanm 0:9b334a45a8ff 90 return ticks;
bogdanm 0:9b334a45a8ff 91 }
bogdanm 0:9b334a45a8ff 92
bogdanm 0:9b334a45a8ff 93 void rtc_init_real(uint32_t flags)
bogdanm 0:9b334a45a8ff 94 {
bogdanm 0:9b334a45a8ff 95 useflags |= flags;
bogdanm 0:9b334a45a8ff 96
bogdanm 0:9b334a45a8ff 97 if (!rtc_inited) {
bogdanm 0:9b334a45a8ff 98 CMU_ClockEnable(cmuClock_RTC, true);
bogdanm 0:9b334a45a8ff 99
bogdanm 0:9b334a45a8ff 100 /* Enable clock to the interface of the low energy modules */
bogdanm 0:9b334a45a8ff 101 CMU_ClockEnable(cmuClock_CORELE, true);
bogdanm 0:9b334a45a8ff 102
bogdanm 0:9b334a45a8ff 103 /* Scale clock to save power */
bogdanm 0:9b334a45a8ff 104 CMU_ClockDivSet(cmuClock_RTC, RTC_CLOCKDIV);
bogdanm 0:9b334a45a8ff 105
bogdanm 0:9b334a45a8ff 106 /* Initialize RTC */
bogdanm 0:9b334a45a8ff 107 RTC_Init_TypeDef init = RTC_INIT_DEFAULT;
bogdanm 0:9b334a45a8ff 108 init.enable = 1;
bogdanm 0:9b334a45a8ff 109 /* Don't use compare register 0 as top value */
bogdanm 0:9b334a45a8ff 110 init.comp0Top = 0;
bogdanm 0:9b334a45a8ff 111
bogdanm 0:9b334a45a8ff 112 /* Enable Interrupt from RTC */
bogdanm 0:9b334a45a8ff 113 RTC_IntEnable(RTC_IEN_OF);
bogdanm 0:9b334a45a8ff 114 NVIC_EnableIRQ(RTC_IRQn);
bogdanm 0:9b334a45a8ff 115 NVIC_SetVector(RTC_IRQn, (uint32_t)RTC_IRQHandler);
bogdanm 0:9b334a45a8ff 116
bogdanm 0:9b334a45a8ff 117 /* Initialize */
bogdanm 0:9b334a45a8ff 118 RTC_Init(&init);
bogdanm 0:9b334a45a8ff 119
bogdanm 0:9b334a45a8ff 120 blockSleepMode(RTC_LEAST_ACTIVE_SLEEPMODE);
bogdanm 0:9b334a45a8ff 121 rtc_inited = true;
bogdanm 0:9b334a45a8ff 122 }
bogdanm 0:9b334a45a8ff 123 }
bogdanm 0:9b334a45a8ff 124
bogdanm 0:9b334a45a8ff 125 void rtc_free(void)
bogdanm 0:9b334a45a8ff 126 {
bogdanm 0:9b334a45a8ff 127 rtc_free_real(RTC_INIT_RTC);
bogdanm 0:9b334a45a8ff 128 }
bogdanm 0:9b334a45a8ff 129
bogdanm 0:9b334a45a8ff 130 void rtc_free_real(uint32_t flags)
bogdanm 0:9b334a45a8ff 131 {
bogdanm 0:9b334a45a8ff 132 /* Clear use flag */
bogdanm 0:9b334a45a8ff 133 useflags &= ~flags;
bogdanm 0:9b334a45a8ff 134
bogdanm 0:9b334a45a8ff 135 /* Disable the RTC if it was inited and is no longer in use by anyone. */
bogdanm 0:9b334a45a8ff 136 if (rtc_inited && (useflags == 0)) {
bogdanm 0:9b334a45a8ff 137 NVIC_DisableIRQ(RTC_IRQn);
bogdanm 0:9b334a45a8ff 138 RTC_Reset();
bogdanm 0:9b334a45a8ff 139 CMU_ClockEnable(cmuClock_RTC, false);
bogdanm 0:9b334a45a8ff 140 unblockSleepMode(RTC_LEAST_ACTIVE_SLEEPMODE);
bogdanm 0:9b334a45a8ff 141 rtc_inited = false;
bogdanm 0:9b334a45a8ff 142 }
bogdanm 0:9b334a45a8ff 143 }
bogdanm 0:9b334a45a8ff 144
mbed_official 50:a417edff4437 145 #else
mbed_official 50:a417edff4437 146
mbed_official 50:a417edff4437 147 /* Using RTCC API */
mbed_official 50:a417edff4437 148
mbed_official 50:a417edff4437 149 #define RTCC_LEAST_ACTIVE_SLEEPMODE EM2
mbed_official 50:a417edff4437 150 #define RTCC_NUM_BITS (32)
mbed_official 50:a417edff4437 151
mbed_official 50:a417edff4437 152 void RTCC_IRQHandler(void)
mbed_official 50:a417edff4437 153 {
mbed_official 50:a417edff4437 154 uint32_t flags;
mbed_official 50:a417edff4437 155 flags = RTCC_IntGet();
mbed_official 50:a417edff4437 156
mbed_official 50:a417edff4437 157 if (flags & RTCC_IF_OF) {
mbed_official 50:a417edff4437 158 RTCC_IntClear(RTCC_IF_OF);
mbed_official 50:a417edff4437 159 /* RTC has overflowed (32 bits). Use time_extend as software counter for 32 more bits. */
mbed_official 50:a417edff4437 160 time_extend += 1;
mbed_official 50:a417edff4437 161 }
mbed_official 50:a417edff4437 162
mbed_official 50:a417edff4437 163 if (flags & RTCC_IF_CC0) {
mbed_official 50:a417edff4437 164 RTCC_IntClear(RTCC_IF_CC0);
mbed_official 50:a417edff4437 165 if (comp0_handler != NULL) {
mbed_official 50:a417edff4437 166 comp0_handler();
mbed_official 50:a417edff4437 167 }
mbed_official 50:a417edff4437 168 }
mbed_official 50:a417edff4437 169 }
mbed_official 50:a417edff4437 170
mbed_official 50:a417edff4437 171 uint32_t rtc_get_32bit(void)
mbed_official 50:a417edff4437 172 {
mbed_official 50:a417edff4437 173 return RTCC_CounterGet();
mbed_official 50:a417edff4437 174 }
mbed_official 50:a417edff4437 175
mbed_official 50:a417edff4437 176 uint64_t rtc_get_full(void)
mbed_official 50:a417edff4437 177 {
mbed_official 50:a417edff4437 178 uint64_t ticks = 0;
mbed_official 50:a417edff4437 179 ticks += time_extend;
mbed_official 50:a417edff4437 180 ticks = ticks << RTCC_NUM_BITS;
mbed_official 50:a417edff4437 181 ticks += RTCC_CounterGet();
mbed_official 50:a417edff4437 182 return ticks;
mbed_official 50:a417edff4437 183 }
mbed_official 50:a417edff4437 184
mbed_official 50:a417edff4437 185 void rtc_init_real(uint32_t flags)
mbed_official 50:a417edff4437 186 {
mbed_official 50:a417edff4437 187 useflags |= flags;
mbed_official 50:a417edff4437 188
mbed_official 50:a417edff4437 189 if (!rtc_inited) {
mbed_official 50:a417edff4437 190 CMU_ClockEnable(cmuClock_RTCC, true);
mbed_official 50:a417edff4437 191
mbed_official 50:a417edff4437 192 /* Enable clock to the interface of the low energy modules */
mbed_official 50:a417edff4437 193 CMU_ClockEnable(cmuClock_CORELE, true);
mbed_official 50:a417edff4437 194
mbed_official 50:a417edff4437 195 /* Initialize RTC */
mbed_official 50:a417edff4437 196 RTCC_Init_TypeDef init = RTCC_INIT_DEFAULT;
mbed_official 50:a417edff4437 197 init.enable = 1;
mbed_official 50:a417edff4437 198 init.precntWrapOnCCV0 = false;
mbed_official 50:a417edff4437 199 init.cntWrapOnCCV1 = false;
mbed_official 50:a417edff4437 200 #if RTC_CLOCKDIV_INT == 8
mbed_official 50:a417edff4437 201 init.presc = rtccCntPresc_8;
mbed_official 50:a417edff4437 202 #else
mbed_official 50:a417edff4437 203 #error invalid prescaler value RTC_CLOCKDIV_INT
mbed_official 50:a417edff4437 204 #endif
mbed_official 50:a417edff4437 205
mbed_official 50:a417edff4437 206 /* Enable Interrupt from RTC */
mbed_official 50:a417edff4437 207 RTCC_IntEnable(RTCC_IEN_OF);
mbed_official 50:a417edff4437 208 NVIC_EnableIRQ(RTCC_IRQn);
mbed_official 50:a417edff4437 209 NVIC_SetVector(RTCC_IRQn, (uint32_t)RTCC_IRQHandler);
mbed_official 50:a417edff4437 210
mbed_official 50:a417edff4437 211 /* Initialize */
mbed_official 50:a417edff4437 212 RTCC_Init(&init);
mbed_official 50:a417edff4437 213
mbed_official 50:a417edff4437 214 blockSleepMode(RTCC_LEAST_ACTIVE_SLEEPMODE);
mbed_official 50:a417edff4437 215 rtc_inited = true;
mbed_official 50:a417edff4437 216 }
mbed_official 50:a417edff4437 217 }
mbed_official 50:a417edff4437 218
mbed_official 50:a417edff4437 219 void rtc_free(void)
mbed_official 50:a417edff4437 220 {
mbed_official 50:a417edff4437 221 rtc_free_real(RTC_INIT_RTC);
mbed_official 50:a417edff4437 222 }
mbed_official 50:a417edff4437 223
mbed_official 50:a417edff4437 224 void rtc_free_real(uint32_t flags)
mbed_official 50:a417edff4437 225 {
mbed_official 50:a417edff4437 226 /* Clear use flag */
mbed_official 50:a417edff4437 227 useflags &= ~flags;
mbed_official 50:a417edff4437 228
mbed_official 50:a417edff4437 229 /* Disable the RTC if it was inited and is no longer in use by anyone. */
mbed_official 50:a417edff4437 230 if (rtc_inited && (useflags == 0)) {
mbed_official 50:a417edff4437 231 NVIC_DisableIRQ(RTCC_IRQn);
mbed_official 50:a417edff4437 232 RTCC_Reset();
mbed_official 50:a417edff4437 233 CMU_ClockEnable(cmuClock_RTCC, false);
mbed_official 50:a417edff4437 234 unblockSleepMode(RTCC_LEAST_ACTIVE_SLEEPMODE);
mbed_official 50:a417edff4437 235 rtc_inited = false;
mbed_official 50:a417edff4437 236 }
mbed_official 50:a417edff4437 237 }
mbed_official 50:a417edff4437 238
mbed_official 50:a417edff4437 239 #endif /* RTCC_COUNT */
mbed_official 50:a417edff4437 240
mbed_official 50:a417edff4437 241 void rtc_set_comp0_handler(uint32_t handler)
mbed_official 50:a417edff4437 242 {
mbed_official 50:a417edff4437 243 comp0_handler = (void (*)(void)) handler;
mbed_official 50:a417edff4437 244 }
mbed_official 50:a417edff4437 245
mbed_official 50:a417edff4437 246 void rtc_init(void)
mbed_official 50:a417edff4437 247 {
mbed_official 50:a417edff4437 248 /* Register that the RTC is used for timekeeping. */
mbed_official 50:a417edff4437 249 rtc_init_real(RTC_INIT_RTC);
mbed_official 50:a417edff4437 250 }
mbed_official 50:a417edff4437 251
bogdanm 0:9b334a45a8ff 252 int rtc_isenabled(void)
bogdanm 0:9b334a45a8ff 253 {
bogdanm 0:9b334a45a8ff 254 return rtc_inited;
bogdanm 0:9b334a45a8ff 255 }
bogdanm 0:9b334a45a8ff 256
bogdanm 0:9b334a45a8ff 257 time_t rtc_read(void)
bogdanm 0:9b334a45a8ff 258 {
bogdanm 0:9b334a45a8ff 259 return (time_t) (rtc_get_full() >> RTC_FREQ_SHIFT) + time_base;
bogdanm 0:9b334a45a8ff 260 }
bogdanm 0:9b334a45a8ff 261
mbed_official 50:a417edff4437 262 time_t rtc_read_uncompensated(void)
bogdanm 0:9b334a45a8ff 263 {
bogdanm 0:9b334a45a8ff 264 return (time_t) (rtc_get_full() >> RTC_FREQ_SHIFT);
bogdanm 0:9b334a45a8ff 265 }
bogdanm 0:9b334a45a8ff 266
bogdanm 0:9b334a45a8ff 267 void rtc_write(time_t t)
bogdanm 0:9b334a45a8ff 268 {
bogdanm 0:9b334a45a8ff 269 /* We have to check that the RTC did not tick while doing this. */
bogdanm 0:9b334a45a8ff 270 /* If the RTC ticks we just redo this. */
bogdanm 0:9b334a45a8ff 271 uint32_t time;
bogdanm 0:9b334a45a8ff 272 do {
bogdanm 0:9b334a45a8ff 273 time = rtc_read_uncompensated();
bogdanm 0:9b334a45a8ff 274 time_base = t - time;
mbed_official 50:a417edff4437 275 } while (time != (uint32_t)rtc_read_uncompensated());
bogdanm 0:9b334a45a8ff 276 }
bogdanm 0:9b334a45a8ff 277
bogdanm 0:9b334a45a8ff 278 #endif