added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 *******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file lpticker.c
<> 144:ef7eb2e8f9f7 4 * @brief Implementation of a Low Power Ticker functionality based on RTC
<> 144:ef7eb2e8f9f7 5 * @internal
<> 144:ef7eb2e8f9f7 6 * @author ON Semiconductor
<> 144:ef7eb2e8f9f7 7 * $Rev: $
<> 144:ef7eb2e8f9f7 8 * $Date: $
<> 144:ef7eb2e8f9f7 9 ******************************************************************************
<> 144:ef7eb2e8f9f7 10 * @copyright (c) 2015 ON Semiconductor. All rights reserved.
<> 144:ef7eb2e8f9f7 11 * ON Semiconductor is supplying this software for use with ON Semiconductor
<> 144:ef7eb2e8f9f7 12 * processor based microcontrollers only.
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
<> 144:ef7eb2e8f9f7 15 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
<> 144:ef7eb2e8f9f7 16 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
<> 144:ef7eb2e8f9f7 17 * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
<> 144:ef7eb2e8f9f7 18 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
<> 144:ef7eb2e8f9f7 19 * @endinternal
<> 144:ef7eb2e8f9f7 20 *
<> 144:ef7eb2e8f9f7 21 * @ingroup lpticker
<> 144:ef7eb2e8f9f7 22 *
<> 144:ef7eb2e8f9f7 23 * @details
<> 144:ef7eb2e8f9f7 24 * This is Low Power ticker derived from RTC
<> 144:ef7eb2e8f9f7 25 *
<> 144:ef7eb2e8f9f7 26 */
<> 144:ef7eb2e8f9f7 27
<> 144:ef7eb2e8f9f7 28 #include "device.h"
<> 144:ef7eb2e8f9f7 29 #if DEVICE_LOWPOWERTIMER
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 #include "sleep_api.h"
<> 144:ef7eb2e8f9f7 32 #include "cmsis_nvic.h"
<> 144:ef7eb2e8f9f7 33 #include "lp_ticker_api.h"
<> 144:ef7eb2e8f9f7 34 #include "rtc.h"
<> 144:ef7eb2e8f9f7 35 #include "rtc_map.h"
<> 144:ef7eb2e8f9f7 36 #include "sleep.h"
<> 144:ef7eb2e8f9f7 37
<> 144:ef7eb2e8f9f7 38 /* Initialize the RTC for low power ticker */
<> 144:ef7eb2e8f9f7 39 void lp_ticker_init()
<> 144:ef7eb2e8f9f7 40 {
<> 144:ef7eb2e8f9f7 41 fRtcInit();
<> 144:ef7eb2e8f9f7 42 }
<> 144:ef7eb2e8f9f7 43
<> 144:ef7eb2e8f9f7 44 /* Return the current RTC counter value in us */
<> 144:ef7eb2e8f9f7 45 uint32_t lp_ticker_read()
<> 144:ef7eb2e8f9f7 46 {
<> 144:ef7eb2e8f9f7 47 return (uint32_t)(fRtcRead() & 0xFFFFFFFF); /* TODO Truncating 64 bit value to 32 bit */
<> 144:ef7eb2e8f9f7 48 }
<> 144:ef7eb2e8f9f7 49
<> 144:ef7eb2e8f9f7 50 /* Set interrupt for specified time */
<> 144:ef7eb2e8f9f7 51 void lp_ticker_set_interrupt(timestamp_t timestamp)
<> 144:ef7eb2e8f9f7 52 {
<> 144:ef7eb2e8f9f7 53 /* The RTC Match register needs to be Set to the RTC alarm value */
<> 144:ef7eb2e8f9f7 54 fRtcSetInterrupt(timestamp);
<> 144:ef7eb2e8f9f7 55 }
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 /*Return the time that gets cut off when you return just a 32 bit us resolution number */
<> 144:ef7eb2e8f9f7 58 uint32_t lp_ticker_get_overflows_counter(void)
<> 144:ef7eb2e8f9f7 59 {
<> 144:ef7eb2e8f9f7 60 /* To check; do we need an counter in software in RTC to find overflows */
<> 144:ef7eb2e8f9f7 61 uint64_t now = fRtcRead();
<> 144:ef7eb2e8f9f7 62 uint32_t overflow = (now & 0xFFFFFFFF00000000) >> 32;
<> 144:ef7eb2e8f9f7 63 return overflow;
<> 144:ef7eb2e8f9f7 64 }
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 /* Return the RTC Match counter contents */
<> 144:ef7eb2e8f9f7 67 uint32_t lp_ticker_get_compare_match()
<> 144:ef7eb2e8f9f7 68 {
<> 144:ef7eb2e8f9f7 69 /* read the alarms and convert to us */
<> 144:ef7eb2e8f9f7 70 uint16_t sub_second_alarm = RTCREG->SUB_SECOND_ALARM;
<> 144:ef7eb2e8f9f7 71 uint32_t second_alarm = RTCREG->SECOND_ALARM;
<> 144:ef7eb2e8f9f7 72 uint64_t alarm_us = (uint64_t)((((float)sub_second_alarm / RTC_CLOCK_HZ) * RTC_SEC_TO_US) +
<> 144:ef7eb2e8f9f7 73 (second_alarm * RTC_SEC_TO_US));
<> 144:ef7eb2e8f9f7 74 /* TODO truncating to 32 bits */
<> 144:ef7eb2e8f9f7 75 return (uint32_t)(alarm_us & 0xFFFFFFFF);
<> 144:ef7eb2e8f9f7 76 }
<> 144:ef7eb2e8f9f7 77
<> 144:ef7eb2e8f9f7 78 /* sleep until alarm */
<> 144:ef7eb2e8f9f7 79 void lp_ticker_sleep_until(uint32_t now, uint32_t time)
<> 144:ef7eb2e8f9f7 80 {
<> 144:ef7eb2e8f9f7 81 /* Set the interrupt */
<> 144:ef7eb2e8f9f7 82 lp_ticker_set_interrupt(time);
<> 144:ef7eb2e8f9f7 83
<> 144:ef7eb2e8f9f7 84 /* Go to sleep */
<> 144:ef7eb2e8f9f7 85 sleep_t obj;
<> 144:ef7eb2e8f9f7 86 obj.SleepType = SLEEP_TYPE_NONE;
<> 144:ef7eb2e8f9f7 87 obj.timeToSleep = time - now;
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 mbed_enter_sleep(&obj);
<> 144:ef7eb2e8f9f7 90 /* TBD: This is dummy exit for now; once the entered sleep it should be
<> 144:ef7eb2e8f9f7 91 removed and sleep exit should happen through interrupt */
<> 144:ef7eb2e8f9f7 92 mbed_exit_sleep(&obj);
<> 144:ef7eb2e8f9f7 93 }
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 /** Disable low power ticker interrupt
<> 144:ef7eb2e8f9f7 96 *
<> 144:ef7eb2e8f9f7 97 */
<> 144:ef7eb2e8f9f7 98 void lp_ticker_disable_interrupt(void)
<> 144:ef7eb2e8f9f7 99 {
<> 144:ef7eb2e8f9f7 100 /* TODO : This is an empty implementation for now */
<> 144:ef7eb2e8f9f7 101 }
<> 144:ef7eb2e8f9f7 102
<> 144:ef7eb2e8f9f7 103 /** Clear the low power ticker interrupt
<> 144:ef7eb2e8f9f7 104 *
<> 144:ef7eb2e8f9f7 105 */
<> 144:ef7eb2e8f9f7 106 void lp_ticker_clear_interrupt(void)
<> 144:ef7eb2e8f9f7 107 {
<> 144:ef7eb2e8f9f7 108 /* TODO : This is an empty implementation for now */
<> 144:ef7eb2e8f9f7 109 }
<> 144:ef7eb2e8f9f7 110
<> 144:ef7eb2e8f9f7 111 #endif /* DEVICE_LOWPOWERTIMER */