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:
8:69ce7aaad4c4
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 8:69ce7aaad4c4 1 /* mbed Microcontroller Library
mbed_official 8:69ce7aaad4c4 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 8:69ce7aaad4c4 3 *
mbed_official 8:69ce7aaad4c4 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 8:69ce7aaad4c4 5 * you may not use this file except in compliance with the License.
mbed_official 8:69ce7aaad4c4 6 * You may obtain a copy of the License at
mbed_official 8:69ce7aaad4c4 7 *
mbed_official 8:69ce7aaad4c4 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 8:69ce7aaad4c4 9 *
mbed_official 8:69ce7aaad4c4 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 8:69ce7aaad4c4 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 8:69ce7aaad4c4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 8:69ce7aaad4c4 13 * See the License for the specific language governing permissions and
mbed_official 8:69ce7aaad4c4 14 * limitations under the License.
mbed_official 8:69ce7aaad4c4 15 */
mbed_official 8:69ce7aaad4c4 16 #include <stddef.h>
mbed_official 8:69ce7aaad4c4 17 #include "us_ticker_api.h"
mbed_official 8:69ce7aaad4c4 18 #include "PeripheralNames.h"
mbed_official 8:69ce7aaad4c4 19 #include "clk_freqs.h"
mbed_official 8:69ce7aaad4c4 20
mbed_official 8:69ce7aaad4c4 21 static int us_ticker_inited = 0;
mbed_official 8:69ce7aaad4c4 22
mbed_official 8:69ce7aaad4c4 23 void us_ticker_init(void) {
mbed_official 8:69ce7aaad4c4 24 if (us_ticker_inited)
mbed_official 8:69ce7aaad4c4 25 return;
mbed_official 8:69ce7aaad4c4 26 us_ticker_inited = 1;
mbed_official 8:69ce7aaad4c4 27
mbed_official 8:69ce7aaad4c4 28 SIM->SCGC6 |= SIM_SCGC6_PIT_MASK; // Clock PIT
mbed_official 8:69ce7aaad4c4 29 PIT->MCR = 0; // Enable PIT
mbed_official 8:69ce7aaad4c4 30
mbed_official 8:69ce7aaad4c4 31 //Timer on PIT0+1, ticker on PIT 2+3
mbed_official 8:69ce7aaad4c4 32 //Init timer
mbed_official 8:69ce7aaad4c4 33 PIT->CHANNEL[1].LDVAL = 0xFFFFFFFF;
mbed_official 8:69ce7aaad4c4 34 PIT->CHANNEL[1].TCTRL = PIT_TCTRL_CHN_MASK | PIT_TCTRL_TEN_MASK; // Start timer 1, chained to timer 0
mbed_official 8:69ce7aaad4c4 35
mbed_official 8:69ce7aaad4c4 36 // Use channel 0 as a prescaler for channel 1
mbed_official 8:69ce7aaad4c4 37 uint32_t ldval = (bus_frequency() + 500000) / 1000000 - 1;
mbed_official 8:69ce7aaad4c4 38 PIT->CHANNEL[0].LDVAL = ldval;
mbed_official 8:69ce7aaad4c4 39 PIT->CHANNEL[0].TCTRL = PIT_TCTRL_TEN_MASK; // Start timer
mbed_official 8:69ce7aaad4c4 40
mbed_official 8:69ce7aaad4c4 41 //Init ticker
mbed_official 8:69ce7aaad4c4 42 PIT->CHANNEL[2].LDVAL = ldval;
mbed_official 8:69ce7aaad4c4 43 PIT->CHANNEL[2].TCTRL = PIT_TCTRL_TEN_MASK; // Start timer 2 as prescaler
mbed_official 8:69ce7aaad4c4 44
mbed_official 8:69ce7aaad4c4 45 NVIC_SetVector(PIT3_IRQn, (uint32_t)us_ticker_irq_handler);
mbed_official 8:69ce7aaad4c4 46 NVIC_EnableIRQ(PIT3_IRQn);
mbed_official 8:69ce7aaad4c4 47 }
mbed_official 8:69ce7aaad4c4 48
mbed_official 8:69ce7aaad4c4 49 /******************************************************************************
mbed_official 8:69ce7aaad4c4 50 * Timer for us timing.
mbed_official 8:69ce7aaad4c4 51 ******************************************************************************/
mbed_official 8:69ce7aaad4c4 52
mbed_official 8:69ce7aaad4c4 53 uint32_t us_ticker_read() {
mbed_official 8:69ce7aaad4c4 54 if (!us_ticker_inited)
mbed_official 8:69ce7aaad4c4 55 us_ticker_init();
mbed_official 8:69ce7aaad4c4 56
mbed_official 8:69ce7aaad4c4 57 return ~(PIT->CHANNEL[1].CVAL);
mbed_official 8:69ce7aaad4c4 58 }
mbed_official 8:69ce7aaad4c4 59
mbed_official 8:69ce7aaad4c4 60 /******************************************************************************
mbed_official 8:69ce7aaad4c4 61 * Ticker Event
mbed_official 8:69ce7aaad4c4 62 ******************************************************************************/
mbed_official 8:69ce7aaad4c4 63
mbed_official 8:69ce7aaad4c4 64 void us_ticker_disable_interrupt(void) {
mbed_official 8:69ce7aaad4c4 65 PIT->CHANNEL[3].TCTRL &= ~PIT_TCTRL_TIE_MASK;
mbed_official 8:69ce7aaad4c4 66 }
mbed_official 8:69ce7aaad4c4 67
mbed_official 8:69ce7aaad4c4 68 void us_ticker_clear_interrupt(void) {
mbed_official 8:69ce7aaad4c4 69 PIT->CHANNEL[3].TFLG = 1;
mbed_official 8:69ce7aaad4c4 70 }
mbed_official 8:69ce7aaad4c4 71
mbed_official 8:69ce7aaad4c4 72 void us_ticker_set_interrupt(timestamp_t timestamp) {
mbed_official 8:69ce7aaad4c4 73 int delta = (int)((uint32_t)timestamp - us_ticker_read());
mbed_official 8:69ce7aaad4c4 74 if (delta <= 0) {
mbed_official 8:69ce7aaad4c4 75 // This event was in the past:
mbed_official 8:69ce7aaad4c4 76 us_ticker_irq_handler();
mbed_official 8:69ce7aaad4c4 77 return;
mbed_official 8:69ce7aaad4c4 78 }
mbed_official 8:69ce7aaad4c4 79
mbed_official 8:69ce7aaad4c4 80 PIT->CHANNEL[3].TCTRL = 0;
mbed_official 8:69ce7aaad4c4 81 PIT->CHANNEL[3].LDVAL = delta;
mbed_official 8:69ce7aaad4c4 82 PIT->CHANNEL[3].TCTRL = PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK | PIT_TCTRL_CHN_MASK;
mbed_official 8:69ce7aaad4c4 83
mbed_official 8:69ce7aaad4c4 84 }