mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 154:37f96f9d4de2 1 /* mbed Microcontroller Library
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2006-2018 ARM Limited
<> 154:37f96f9d4de2 3 *
<> 154:37f96f9d4de2 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 154:37f96f9d4de2 5 * you may not use this file except in compliance with the License.
<> 154:37f96f9d4de2 6 * You may obtain a copy of the License at
<> 154:37f96f9d4de2 7 *
<> 154:37f96f9d4de2 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 154:37f96f9d4de2 9 *
<> 154:37f96f9d4de2 10 * Unless required by applicable law or agreed to in writing, software
<> 154:37f96f9d4de2 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 154:37f96f9d4de2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 154:37f96f9d4de2 13 * See the License for the specific language governing permissions and
<> 154:37f96f9d4de2 14 * limitations under the License.
<> 154:37f96f9d4de2 15 */
<> 154:37f96f9d4de2 16 #include <stddef.h>
<> 154:37f96f9d4de2 17 #include "us_ticker_api.h"
<> 154:37f96f9d4de2 18 #include "PeripheralNames.h"
<> 154:37f96f9d4de2 19 #include "fsl_pit.h"
<> 154:37f96f9d4de2 20 #include "fsl_clock_config.h"
<> 154:37f96f9d4de2 21
Anna Bridge 186:707f6e361f3e 22 const ticker_info_t* us_ticker_get_info()
Anna Bridge 186:707f6e361f3e 23 {
Anna Bridge 186:707f6e361f3e 24 static const ticker_info_t info = {
Anna Bridge 186:707f6e361f3e 25 1000000, // 1 MHz
Anna Bridge 186:707f6e361f3e 26 32 // 32 bit counter
Anna Bridge 186:707f6e361f3e 27 };
Anna Bridge 186:707f6e361f3e 28 return &info;
Anna Bridge 186:707f6e361f3e 29 }
Anna Bridge 186:707f6e361f3e 30
Anna Bridge 186:707f6e361f3e 31 static bool us_ticker_inited = false;
<> 154:37f96f9d4de2 32
AnnaBridge 177:d650f5d4c87a 33 static void pit_isr(void)
AnnaBridge 177:d650f5d4c87a 34 {
AnnaBridge 177:d650f5d4c87a 35 PIT_ClearStatusFlags(PIT, kPIT_Chnl_3, PIT_TFLG_TIF_MASK);
AnnaBridge 177:d650f5d4c87a 36 PIT_ClearStatusFlags(PIT, kPIT_Chnl_2, PIT_TFLG_TIF_MASK);
AnnaBridge 177:d650f5d4c87a 37 PIT_StopTimer(PIT, kPIT_Chnl_2);
AnnaBridge 177:d650f5d4c87a 38 PIT_StopTimer(PIT, kPIT_Chnl_3);
AnnaBridge 177:d650f5d4c87a 39
AnnaBridge 177:d650f5d4c87a 40 us_ticker_irq_handler();
AnnaBridge 177:d650f5d4c87a 41 }
AnnaBridge 177:d650f5d4c87a 42
Anna Bridge 186:707f6e361f3e 43 /** Initialize the high frequency ticker
Anna Bridge 186:707f6e361f3e 44 *
Anna Bridge 186:707f6e361f3e 45 */
<> 154:37f96f9d4de2 46 void us_ticker_init(void)
<> 154:37f96f9d4de2 47 {
Anna Bridge 186:707f6e361f3e 48 /* Common for ticker/timer. */
<> 154:37f96f9d4de2 49 uint32_t busClock;
Anna Bridge 186:707f6e361f3e 50 /* Structure to initialize PIT. */
<> 154:37f96f9d4de2 51 pit_config_t pitConfig;
<> 154:37f96f9d4de2 52
<> 154:37f96f9d4de2 53 PIT_GetDefaultConfig(&pitConfig);
<> 154:37f96f9d4de2 54 PIT_Init(PIT, &pitConfig);
<> 154:37f96f9d4de2 55
<> 154:37f96f9d4de2 56 busClock = CLOCK_GetFreq(kCLOCK_BusClk);
<> 154:37f96f9d4de2 57
Anna Bridge 186:707f6e361f3e 58 /* Let the timer to count if re-init. */
Anna Bridge 186:707f6e361f3e 59 if (!us_ticker_inited) {
<> 154:37f96f9d4de2 60
Anna Bridge 186:707f6e361f3e 61 PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, busClock / 1000000 - 1);
Anna Bridge 186:707f6e361f3e 62 PIT_SetTimerPeriod(PIT, kPIT_Chnl_1, 0xFFFFFFFF);
Anna Bridge 186:707f6e361f3e 63 PIT_SetTimerChainMode(PIT, kPIT_Chnl_1, true);
Anna Bridge 186:707f6e361f3e 64 PIT_StartTimer(PIT, kPIT_Chnl_0);
Anna Bridge 186:707f6e361f3e 65 PIT_StartTimer(PIT, kPIT_Chnl_1);
Anna Bridge 186:707f6e361f3e 66 }
Anna Bridge 186:707f6e361f3e 67
Anna Bridge 186:707f6e361f3e 68 /* Configure interrupt generation counters and disable ticker interrupts. */
Anna Bridge 186:707f6e361f3e 69 PIT_StopTimer(PIT, kPIT_Chnl_3);
Anna Bridge 186:707f6e361f3e 70 PIT_StopTimer(PIT, kPIT_Chnl_2);
<> 154:37f96f9d4de2 71 PIT_SetTimerPeriod(PIT, kPIT_Chnl_2, busClock / 1000000 - 1);
<> 154:37f96f9d4de2 72 PIT_SetTimerChainMode(PIT, kPIT_Chnl_3, true);
Anna Bridge 186:707f6e361f3e 73 NVIC_SetVector(PIT3_IRQn, (uint32_t) pit_isr);
<> 154:37f96f9d4de2 74 NVIC_EnableIRQ(PIT3_IRQn);
Anna Bridge 186:707f6e361f3e 75 PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
Anna Bridge 186:707f6e361f3e 76
Anna Bridge 186:707f6e361f3e 77 us_ticker_inited = true;
<> 154:37f96f9d4de2 78 }
<> 154:37f96f9d4de2 79
Anna Bridge 186:707f6e361f3e 80 /** Read the current counter
Anna Bridge 186:707f6e361f3e 81 *
Anna Bridge 186:707f6e361f3e 82 * @return The current timer's counter value in ticks
Anna Bridge 186:707f6e361f3e 83 */
<> 154:37f96f9d4de2 84 uint32_t us_ticker_read()
<> 154:37f96f9d4de2 85 {
<> 154:37f96f9d4de2 86 return ~(PIT_GetCurrentTimerCount(PIT, kPIT_Chnl_1));
<> 154:37f96f9d4de2 87 }
<> 154:37f96f9d4de2 88
Anna Bridge 186:707f6e361f3e 89 /** Disable us ticker interrupt
Anna Bridge 186:707f6e361f3e 90 *
Anna Bridge 186:707f6e361f3e 91 */
<> 154:37f96f9d4de2 92 void us_ticker_disable_interrupt(void)
<> 154:37f96f9d4de2 93 {
<> 154:37f96f9d4de2 94 PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
<> 154:37f96f9d4de2 95 }
<> 154:37f96f9d4de2 96
Anna Bridge 186:707f6e361f3e 97 /** Clear us ticker interrupt
Anna Bridge 186:707f6e361f3e 98 *
Anna Bridge 186:707f6e361f3e 99 */
<> 154:37f96f9d4de2 100 void us_ticker_clear_interrupt(void)
<> 154:37f96f9d4de2 101 {
<> 154:37f96f9d4de2 102 PIT_ClearStatusFlags(PIT, kPIT_Chnl_3, PIT_TFLG_TIF_MASK);
<> 154:37f96f9d4de2 103 }
<> 154:37f96f9d4de2 104
Anna Bridge 186:707f6e361f3e 105 /** Set interrupt for specified timestamp
Anna Bridge 186:707f6e361f3e 106 *
Anna Bridge 186:707f6e361f3e 107 * @param timestamp The time in ticks when interrupt should be generated
Anna Bridge 186:707f6e361f3e 108 */
<> 154:37f96f9d4de2 109 void us_ticker_set_interrupt(timestamp_t timestamp)
<> 154:37f96f9d4de2 110 {
Anna Bridge 186:707f6e361f3e 111 /* We get here absolute interrupt time which takes into account counter overflow.
Anna Bridge 186:707f6e361f3e 112 * Since we use additional count-down timer to generate interrupt we need to calculate
Anna Bridge 186:707f6e361f3e 113 * load value based on time-stamp.
Anna Bridge 186:707f6e361f3e 114 */
Anna Bridge 186:707f6e361f3e 115 const uint32_t now_ticks = us_ticker_read();
Anna Bridge 186:707f6e361f3e 116 uint32_t delta_ticks =
Anna Bridge 186:707f6e361f3e 117 timestamp >= now_ticks ? timestamp - now_ticks : (uint32_t)((uint64_t) timestamp + 0xFFFFFFFF - now_ticks);
AnnaBridge 182:a56a73fd2a6f 118
Anna Bridge 186:707f6e361f3e 119 if (delta_ticks == 0) {
Anna Bridge 186:707f6e361f3e 120 /* The requested delay is less than the minimum resolution of this counter. */
Anna Bridge 186:707f6e361f3e 121 delta_ticks = 1;
Anna Bridge 186:707f6e361f3e 122 }
AnnaBridge 182:a56a73fd2a6f 123
<> 154:37f96f9d4de2 124 PIT_StopTimer(PIT, kPIT_Chnl_3);
<> 154:37f96f9d4de2 125 PIT_StopTimer(PIT, kPIT_Chnl_2);
Anna Bridge 186:707f6e361f3e 126 PIT_SetTimerPeriod(PIT, kPIT_Chnl_3, delta_ticks);
<> 154:37f96f9d4de2 127 PIT_EnableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
<> 154:37f96f9d4de2 128 PIT_StartTimer(PIT, kPIT_Chnl_3);
<> 154:37f96f9d4de2 129 PIT_StartTimer(PIT, kPIT_Chnl_2);
<> 154:37f96f9d4de2 130 }
AnnaBridge 174:b96e65c34a4d 131
Anna Bridge 186:707f6e361f3e 132 /** Fire us ticker interrupt
Anna Bridge 186:707f6e361f3e 133 *
Anna Bridge 186:707f6e361f3e 134 */
AnnaBridge 174:b96e65c34a4d 135 void us_ticker_fire_interrupt(void)
AnnaBridge 174:b96e65c34a4d 136 {
AnnaBridge 174:b96e65c34a4d 137 NVIC_SetPendingIRQ(PIT3_IRQn);
AnnaBridge 174:b96e65c34a4d 138 }
AnnaBridge 188:bcfe06ba3d64 139
AnnaBridge 188:bcfe06ba3d64 140 void us_ticker_free(void)
AnnaBridge 188:bcfe06ba3d64 141 {
AnnaBridge 188:bcfe06ba3d64 142
AnnaBridge 188:bcfe06ba3d64 143 }