mbed library sources. Supersedes mbed-src.

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:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /***************************************************************************//**
<> 144:ef7eb2e8f9f7 2 * @file us_ticker.c
<> 144:ef7eb2e8f9f7 3 *******************************************************************************
<> 144:ef7eb2e8f9f7 4 * @section License
<> 148:21d94c44109e 5 * <b>(C) Copyright 2016 Silicon Labs, http://www.silabs.com</b>
<> 144:ef7eb2e8f9f7 6 *******************************************************************************
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * SPDX-License-Identifier: Apache-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
<> 144:ef7eb2e8f9f7 11 * not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 12 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 15 *
<> 144:ef7eb2e8f9f7 16 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
<> 144:ef7eb2e8f9f7 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 19 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 20 * limitations under the License.
<> 144:ef7eb2e8f9f7 21 *
<> 144:ef7eb2e8f9f7 22 ******************************************************************************/
<> 144:ef7eb2e8f9f7 23
<> 144:ef7eb2e8f9f7 24 #include <stddef.h>
<> 144:ef7eb2e8f9f7 25 #include "us_ticker_api.h"
<> 150:02e0a0aed4ec 26 #include "device.h"
<> 144:ef7eb2e8f9f7 27 #include "mbed_assert.h"
<> 144:ef7eb2e8f9f7 28 #include "em_cmu.h"
<> 144:ef7eb2e8f9f7 29 #include "em_timer.h"
<> 144:ef7eb2e8f9f7 30 #include "clocking.h"
<> 144:ef7eb2e8f9f7 31
Anna Bridge 186:707f6e361f3e 32 #define TICKER_FREQUENCY ((REFERENCE_FREQUENCY > 24000000) ? REFERENCE_FREQUENCY / 16 : REFERENCE_FREQUENCY / 8)
<> 144:ef7eb2e8f9f7 33
Anna Bridge 186:707f6e361f3e 34 const ticker_info_t* us_ticker_get_info(void)
<> 144:ef7eb2e8f9f7 35 {
Anna Bridge 186:707f6e361f3e 36 static const ticker_info_t info = {
Anna Bridge 186:707f6e361f3e 37 TICKER_FREQUENCY,
Anna Bridge 186:707f6e361f3e 38 16
Anna Bridge 186:707f6e361f3e 39 };
Anna Bridge 186:707f6e361f3e 40 return &info;
Anna Bridge 186:707f6e361f3e 41 }
AnnaBridge 179:b0033dcd6934 42
Anna Bridge 186:707f6e361f3e 43 static bool us_ticker_inited = false; // Is ticker initialized yet
<> 144:ef7eb2e8f9f7 44
<> 144:ef7eb2e8f9f7 45 void us_ticker_init(void)
<> 144:ef7eb2e8f9f7 46 {
<> 144:ef7eb2e8f9f7 47 if (us_ticker_inited) {
Anna Bridge 186:707f6e361f3e 48 /* calling init again should cancel current interrupt */
Anna Bridge 186:707f6e361f3e 49 us_ticker_disable_interrupt();
<> 144:ef7eb2e8f9f7 50 return;
<> 144:ef7eb2e8f9f7 51 }
Anna Bridge 186:707f6e361f3e 52 us_ticker_inited = true;
<> 144:ef7eb2e8f9f7 53
<> 144:ef7eb2e8f9f7 54 /* Enable clock for TIMERs */
<> 144:ef7eb2e8f9f7 55 CMU_ClockEnable(US_TICKER_TIMER_CLOCK, true);
<> 144:ef7eb2e8f9f7 56
Anna Bridge 186:707f6e361f3e 57 if (REFERENCE_FREQUENCY > 24000000) {
Anna Bridge 186:707f6e361f3e 58 US_TICKER_TIMER->CTRL = (US_TICKER_TIMER->CTRL & ~_TIMER_CTRL_PRESC_MASK) | (4 << _TIMER_CTRL_PRESC_SHIFT);
Anna Bridge 186:707f6e361f3e 59 } else {
Anna Bridge 186:707f6e361f3e 60 US_TICKER_TIMER->CTRL = (US_TICKER_TIMER->CTRL & ~_TIMER_CTRL_PRESC_MASK) | (3 << _TIMER_CTRL_PRESC_SHIFT);
Anna Bridge 186:707f6e361f3e 61 }
Anna Bridge 186:707f6e361f3e 62
<> 144:ef7eb2e8f9f7 63 /* Clear TIMER counter value */
<> 144:ef7eb2e8f9f7 64 TIMER_CounterSet(US_TICKER_TIMER, 0);
<> 144:ef7eb2e8f9f7 65
Anna Bridge 186:707f6e361f3e 66 /* Start TIMER */
Anna Bridge 186:707f6e361f3e 67 TIMER_Enable(US_TICKER_TIMER, true);
<> 148:21d94c44109e 68
<> 144:ef7eb2e8f9f7 69 /* Select Compare Channel parameters */
<> 144:ef7eb2e8f9f7 70 TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT;
<> 144:ef7eb2e8f9f7 71 timerCCInit.mode = timerCCModeCompare;
<> 144:ef7eb2e8f9f7 72
<> 144:ef7eb2e8f9f7 73 /* Configure Compare Channel 0 */
<> 144:ef7eb2e8f9f7 74 TIMER_InitCC(US_TICKER_TIMER, 0, &timerCCInit);
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 /* Enable interrupt vector in NVIC */
Anna Bridge 186:707f6e361f3e 77 TIMER_IntClear(US_TICKER_TIMER, TIMER_IEN_CC0);
Anna Bridge 186:707f6e361f3e 78 NVIC_SetVector(US_TICKER_TIMER_IRQ, (uint32_t) us_ticker_irq_handler);
<> 144:ef7eb2e8f9f7 79 NVIC_EnableIRQ(US_TICKER_TIMER_IRQ);
Anna Bridge 186:707f6e361f3e 80 }
<> 144:ef7eb2e8f9f7 81
Anna Bridge 186:707f6e361f3e 82 void us_ticker_free(void)
Anna Bridge 186:707f6e361f3e 83 {
Anna Bridge 186:707f6e361f3e 84 if (us_ticker_inited) {
Anna Bridge 186:707f6e361f3e 85 us_ticker_disable_interrupt();
Anna Bridge 186:707f6e361f3e 86 NVIC_DisableIRQ(US_TICKER_TIMER_IRQ);
<> 144:ef7eb2e8f9f7 87
Anna Bridge 186:707f6e361f3e 88 TIMER_Enable(US_TICKER_TIMER, false);
Anna Bridge 186:707f6e361f3e 89
Anna Bridge 186:707f6e361f3e 90 CMU_ClockEnable(US_TICKER_TIMER_CLOCK, false);
Anna Bridge 186:707f6e361f3e 91
Anna Bridge 186:707f6e361f3e 92 us_ticker_inited = false;
Anna Bridge 186:707f6e361f3e 93 }
<> 144:ef7eb2e8f9f7 94 }
<> 144:ef7eb2e8f9f7 95
<> 144:ef7eb2e8f9f7 96 uint32_t us_ticker_read()
<> 144:ef7eb2e8f9f7 97 {
<> 144:ef7eb2e8f9f7 98 if (!us_ticker_inited) {
<> 144:ef7eb2e8f9f7 99 us_ticker_init();
<> 144:ef7eb2e8f9f7 100 }
<> 144:ef7eb2e8f9f7 101
Anna Bridge 186:707f6e361f3e 102 return US_TICKER_TIMER->CNT;
<> 144:ef7eb2e8f9f7 103 }
<> 144:ef7eb2e8f9f7 104
<> 144:ef7eb2e8f9f7 105 void us_ticker_set_interrupt(timestamp_t timestamp)
<> 144:ef7eb2e8f9f7 106 {
<> 144:ef7eb2e8f9f7 107 TIMER_IntDisable(US_TICKER_TIMER, TIMER_IEN_CC0);
<> 144:ef7eb2e8f9f7 108
AnnaBridge 179:b0033dcd6934 109 TIMER_IntClear(US_TICKER_TIMER, TIMER_IEN_CC0);
<> 148:21d94c44109e 110
Anna Bridge 186:707f6e361f3e 111 TIMER_CompareSet(US_TICKER_TIMER, 0, timestamp);
<> 148:21d94c44109e 112
<> 144:ef7eb2e8f9f7 113 TIMER_IntEnable(US_TICKER_TIMER, TIMER_IEN_CC0);
<> 144:ef7eb2e8f9f7 114 }
<> 144:ef7eb2e8f9f7 115
AnnaBridge 174:b96e65c34a4d 116 void us_ticker_fire_interrupt(void)
AnnaBridge 174:b96e65c34a4d 117 {
AnnaBridge 174:b96e65c34a4d 118 NVIC_SetPendingIRQ(US_TICKER_TIMER_IRQ);
AnnaBridge 174:b96e65c34a4d 119 }
AnnaBridge 174:b96e65c34a4d 120
<> 144:ef7eb2e8f9f7 121 void us_ticker_disable_interrupt(void)
<> 144:ef7eb2e8f9f7 122 {
<> 144:ef7eb2e8f9f7 123 /* Disable compare channel interrupts */
<> 144:ef7eb2e8f9f7 124 TIMER_IntDisable(US_TICKER_TIMER, TIMER_IEN_CC0);
<> 144:ef7eb2e8f9f7 125 }
<> 144:ef7eb2e8f9f7 126
<> 144:ef7eb2e8f9f7 127 void us_ticker_clear_interrupt(void)
<> 144:ef7eb2e8f9f7 128 {
<> 144:ef7eb2e8f9f7 129 /* Clear compare channel interrupts */
<> 144:ef7eb2e8f9f7 130 TIMER_IntClear(US_TICKER_TIMER, TIMER_IFC_CC0);
<> 144:ef7eb2e8f9f7 131 }