b luo / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Tue Nov 08 17:45:16 2016 +0000
Revision:
150:02e0a0aed4ec
This updates the lib to the mbed lib v129

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 150:02e0a0aed4ec 1 /* mbed Microcontroller Library
<> 150:02e0a0aed4ec 2 * Copyright (c) 2006-2013 ARM Limited
<> 150:02e0a0aed4ec 3 *
<> 150:02e0a0aed4ec 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 150:02e0a0aed4ec 5 * you may not use this file except in compliance with the License.
<> 150:02e0a0aed4ec 6 * You may obtain a copy of the License at
<> 150:02e0a0aed4ec 7 *
<> 150:02e0a0aed4ec 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 150:02e0a0aed4ec 9 *
<> 150:02e0a0aed4ec 10 * Unless required by applicable law or agreed to in writing, software
<> 150:02e0a0aed4ec 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 150:02e0a0aed4ec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 150:02e0a0aed4ec 13 * See the License for the specific language governing permissions and
<> 150:02e0a0aed4ec 14 * limitations under the License.
<> 150:02e0a0aed4ec 15 */
<> 150:02e0a0aed4ec 16 #include <stddef.h>
<> 150:02e0a0aed4ec 17 #include "us_ticker_api.h"
<> 150:02e0a0aed4ec 18 #include "PeripheralNames.h"
<> 150:02e0a0aed4ec 19 #include "fsl_pit.h"
<> 150:02e0a0aed4ec 20 #include "fsl_clock_config.h"
<> 150:02e0a0aed4ec 21
<> 150:02e0a0aed4ec 22 static int us_ticker_inited = 0;
<> 150:02e0a0aed4ec 23
<> 150:02e0a0aed4ec 24 void us_ticker_init(void) {
<> 150:02e0a0aed4ec 25 if (us_ticker_inited) {
<> 150:02e0a0aed4ec 26 return;
<> 150:02e0a0aed4ec 27 }
<> 150:02e0a0aed4ec 28 us_ticker_inited = 1;
<> 150:02e0a0aed4ec 29 //Common for ticker/timer
<> 150:02e0a0aed4ec 30 uint32_t busClock;
<> 150:02e0a0aed4ec 31 // Structure to initialize PIT
<> 150:02e0a0aed4ec 32 pit_config_t pitConfig;
<> 150:02e0a0aed4ec 33
<> 150:02e0a0aed4ec 34 PIT_GetDefaultConfig(&pitConfig);
<> 150:02e0a0aed4ec 35 PIT_Init(PIT, &pitConfig);
<> 150:02e0a0aed4ec 36
<> 150:02e0a0aed4ec 37 busClock = CLOCK_GetFreq(kCLOCK_BusClk);
<> 150:02e0a0aed4ec 38
<> 150:02e0a0aed4ec 39 //Timer
<> 150:02e0a0aed4ec 40 PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, busClock / 1000000 - 1);
<> 150:02e0a0aed4ec 41 PIT_SetTimerPeriod(PIT, kPIT_Chnl_1, 0xFFFFFFFF);
<> 150:02e0a0aed4ec 42 PIT_SetTimerChainMode(PIT, kPIT_Chnl_1, true);
<> 150:02e0a0aed4ec 43 PIT_StartTimer(PIT, kPIT_Chnl_0);
<> 150:02e0a0aed4ec 44 PIT_StartTimer(PIT, kPIT_Chnl_1);
<> 150:02e0a0aed4ec 45
<> 150:02e0a0aed4ec 46 //Ticker
<> 150:02e0a0aed4ec 47 PIT_SetTimerPeriod(PIT, kPIT_Chnl_2, busClock / 1000000 - 1);
<> 150:02e0a0aed4ec 48 PIT_SetTimerChainMode(PIT, kPIT_Chnl_3, true);
<> 150:02e0a0aed4ec 49 NVIC_SetVector(PIT3_IRQn, (uint32_t)us_ticker_irq_handler);
<> 150:02e0a0aed4ec 50 NVIC_EnableIRQ(PIT3_IRQn);
<> 150:02e0a0aed4ec 51 }
<> 150:02e0a0aed4ec 52
<> 150:02e0a0aed4ec 53
<> 150:02e0a0aed4ec 54 uint32_t us_ticker_read() {
<> 150:02e0a0aed4ec 55 if (!us_ticker_inited) {
<> 150:02e0a0aed4ec 56 us_ticker_init();
<> 150:02e0a0aed4ec 57 }
<> 150:02e0a0aed4ec 58
<> 150:02e0a0aed4ec 59 return ~(PIT_GetCurrentTimerCount(PIT, kPIT_Chnl_1));
<> 150:02e0a0aed4ec 60 }
<> 150:02e0a0aed4ec 61
<> 150:02e0a0aed4ec 62 void us_ticker_disable_interrupt(void) {
<> 150:02e0a0aed4ec 63 PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
<> 150:02e0a0aed4ec 64 }
<> 150:02e0a0aed4ec 65
<> 150:02e0a0aed4ec 66 void us_ticker_clear_interrupt(void) {
<> 150:02e0a0aed4ec 67 PIT_ClearStatusFlags(PIT, kPIT_Chnl_3, PIT_TFLG_TIF_MASK);
<> 150:02e0a0aed4ec 68 }
<> 150:02e0a0aed4ec 69
<> 150:02e0a0aed4ec 70 void us_ticker_set_interrupt(timestamp_t timestamp) {
<> 150:02e0a0aed4ec 71 int delta = (int)(timestamp - us_ticker_read());
<> 150:02e0a0aed4ec 72 if (delta <= 0) {
<> 150:02e0a0aed4ec 73 // This event was in the past.
<> 150:02e0a0aed4ec 74 // Set the interrupt as pending, but don't process it here.
<> 150:02e0a0aed4ec 75 // This prevents a recurive loop under heavy load
<> 150:02e0a0aed4ec 76 // which can lead to a stack overflow.
<> 150:02e0a0aed4ec 77 NVIC_SetPendingIRQ(PIT3_IRQn);
<> 150:02e0a0aed4ec 78 return;
<> 150:02e0a0aed4ec 79 }
<> 150:02e0a0aed4ec 80
<> 150:02e0a0aed4ec 81 PIT_StopTimer(PIT, kPIT_Chnl_3);
<> 150:02e0a0aed4ec 82 PIT_StopTimer(PIT, kPIT_Chnl_2);
<> 150:02e0a0aed4ec 83 PIT_SetTimerPeriod(PIT, kPIT_Chnl_3, (uint32_t)delta);
<> 150:02e0a0aed4ec 84 PIT_EnableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
<> 150:02e0a0aed4ec 85 PIT_StartTimer(PIT, kPIT_Chnl_3);
<> 150:02e0a0aed4ec 86 PIT_StartTimer(PIT, kPIT_Chnl_2);
<> 150:02e0a0aed4ec 87 }