added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
80:bdf1132a57cf
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 80:bdf1132a57cf 1 /* mbed Microcontroller Library
mbed_official 80:bdf1132a57cf 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 80:bdf1132a57cf 3 *
mbed_official 80:bdf1132a57cf 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 80:bdf1132a57cf 5 * you may not use this file except in compliance with the License.
mbed_official 80:bdf1132a57cf 6 * You may obtain a copy of the License at
mbed_official 80:bdf1132a57cf 7 *
mbed_official 80:bdf1132a57cf 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 80:bdf1132a57cf 9 *
mbed_official 80:bdf1132a57cf 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 80:bdf1132a57cf 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 80:bdf1132a57cf 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 80:bdf1132a57cf 13 * See the License for the specific language governing permissions and
mbed_official 80:bdf1132a57cf 14 * limitations under the License.
mbed_official 80:bdf1132a57cf 15 */
mbed_official 80:bdf1132a57cf 16 #include <stddef.h>
mbed_official 80:bdf1132a57cf 17 #include "us_ticker_api.h"
mbed_official 80:bdf1132a57cf 18 #include "PeripheralNames.h"
mbed_official 80:bdf1132a57cf 19
mbed_official 80:bdf1132a57cf 20 #define US_TICKER_TIMER1 CMSDK_DUALTIMER1
mbed_official 80:bdf1132a57cf 21 #define US_TICKER_TIMER2 CMSDK_DUALTIMER2
mbed_official 80:bdf1132a57cf 22 #define US_TICKER_TIMER_IRQn DUALTIMER_IRQn
mbed_official 80:bdf1132a57cf 23
mbed_official 80:bdf1132a57cf 24 int us_ticker_inited = 0;
mbed_official 80:bdf1132a57cf 25
mbed_official 80:bdf1132a57cf 26 void us_ticker_init(void) {
mbed_official 80:bdf1132a57cf 27 if (us_ticker_inited) return;
mbed_official 80:bdf1132a57cf 28 us_ticker_inited = 1;
mbed_official 80:bdf1132a57cf 29
mbed_official 80:bdf1132a57cf 30 US_TICKER_TIMER1->TimerControl = 0x0; // disable timer
mbed_official 80:bdf1132a57cf 31 US_TICKER_TIMER2->TimerControl = 0x00; // disable timer
mbed_official 80:bdf1132a57cf 32 US_TICKER_TIMER1->TimerLoad = 0xFFFFFFFF;
mbed_official 80:bdf1132a57cf 33 US_TICKER_TIMER2->TimerLoad = 0xFFFFFFFF;
mbed_official 80:bdf1132a57cf 34
mbed_official 80:bdf1132a57cf 35 US_TICKER_TIMER1->TimerControl = 0x62; // enable interrupt and set to 32 bit counter and set to periodic mode
mbed_official 80:bdf1132a57cf 36 US_TICKER_TIMER2->TimerControl = 0x42; // enable interrupt and set to 32 bit counter
mbed_official 80:bdf1132a57cf 37
mbed_official 80:bdf1132a57cf 38 US_TICKER_TIMER1->TimerControl |= 0x80; // enable counter
mbed_official 80:bdf1132a57cf 39 US_TICKER_TIMER2->TimerControl |= 0x80; // enable counter
mbed_official 80:bdf1132a57cf 40
mbed_official 80:bdf1132a57cf 41 NVIC_SetVector(US_TICKER_TIMER_IRQn, (uint32_t)us_ticker_irq_handler);
mbed_official 80:bdf1132a57cf 42 NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
mbed_official 80:bdf1132a57cf 43 }
mbed_official 80:bdf1132a57cf 44
mbed_official 80:bdf1132a57cf 45 uint32_t us_ticker_read() {
mbed_official 80:bdf1132a57cf 46 uint32_t return_value = 0;
mbed_official 80:bdf1132a57cf 47
mbed_official 80:bdf1132a57cf 48 if (!us_ticker_inited)
mbed_official 80:bdf1132a57cf 49 us_ticker_init();
mbed_official 80:bdf1132a57cf 50 return_value = ((~US_TICKER_TIMER2->TimerValue)/24);
mbed_official 80:bdf1132a57cf 51 return return_value;
mbed_official 80:bdf1132a57cf 52 }
mbed_official 80:bdf1132a57cf 53
mbed_official 80:bdf1132a57cf 54 void us_ticker_set_interrupt(timestamp_t timestamp) {
mbed_official 80:bdf1132a57cf 55 int delta = 0;
mbed_official 80:bdf1132a57cf 56
mbed_official 80:bdf1132a57cf 57 if (!us_ticker_inited)
mbed_official 80:bdf1132a57cf 58 us_ticker_init();
mbed_official 80:bdf1132a57cf 59 delta = (int)(timestamp - us_ticker_read());
mbed_official 80:bdf1132a57cf 60 if (delta <= 0) {
mbed_official 80:bdf1132a57cf 61 // This event was in the past:
mbed_official 80:bdf1132a57cf 62 us_ticker_irq_handler();
mbed_official 80:bdf1132a57cf 63 return;
mbed_official 80:bdf1132a57cf 64 }
mbed_official 80:bdf1132a57cf 65 // enable interrupt
mbed_official 80:bdf1132a57cf 66 US_TICKER_TIMER1->TimerControl = 0x0; // disable timer
mbed_official 80:bdf1132a57cf 67 US_TICKER_TIMER1->TimerControl = 0x62; // enable interrupt and set to 32 bit counter and set to periodic mode
mbed_official 80:bdf1132a57cf 68 US_TICKER_TIMER1->TimerLoad = (delta)*24; //initialise the timer value
mbed_official 80:bdf1132a57cf 69 US_TICKER_TIMER1->TimerControl |= 0x80; //enable timer
mbed_official 80:bdf1132a57cf 70 }
mbed_official 80:bdf1132a57cf 71
mbed_official 80:bdf1132a57cf 72 void us_ticker_disable_interrupt(void) {
mbed_official 80:bdf1132a57cf 73
mbed_official 80:bdf1132a57cf 74 US_TICKER_TIMER1->TimerControl &= 0xDF;
mbed_official 80:bdf1132a57cf 75 US_TICKER_TIMER2->TimerControl &= 0xDF;
mbed_official 80:bdf1132a57cf 76
mbed_official 80:bdf1132a57cf 77 }
mbed_official 80:bdf1132a57cf 78
mbed_official 80:bdf1132a57cf 79 void us_ticker_clear_interrupt(void) {
mbed_official 80:bdf1132a57cf 80
mbed_official 80:bdf1132a57cf 81 US_TICKER_TIMER1->TimerIntClr = 0x1;
mbed_official 80:bdf1132a57cf 82 US_TICKER_TIMER2->TimerIntClr = 0x1;
mbed_official 80:bdf1132a57cf 83
mbed_official 80:bdf1132a57cf 84 }