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:
184:08ed48f1de7f
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 184:08ed48f1de7f 1 /* mbed Microcontroller Library
AnnaBridge 184:08ed48f1de7f 2 * Copyright (c) 2017 ARM Limited
AnnaBridge 184:08ed48f1de7f 3 *
AnnaBridge 184:08ed48f1de7f 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 184:08ed48f1de7f 5 * you may not use this file except in compliance with the License.
AnnaBridge 184:08ed48f1de7f 6 * You may obtain a copy of the License at
AnnaBridge 184:08ed48f1de7f 7 *
AnnaBridge 184:08ed48f1de7f 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 184:08ed48f1de7f 9 *
AnnaBridge 184:08ed48f1de7f 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 184:08ed48f1de7f 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 184:08ed48f1de7f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 184:08ed48f1de7f 13 * See the License for the specific language governing permissions and
AnnaBridge 184:08ed48f1de7f 14 * limitations under the License.
AnnaBridge 184:08ed48f1de7f 15 */
AnnaBridge 184:08ed48f1de7f 16
AnnaBridge 189:f392fc9709a3 17 #if DEVICE_ITM
AnnaBridge 184:08ed48f1de7f 18
AnnaBridge 184:08ed48f1de7f 19 #include "hal/itm_api.h"
AnnaBridge 184:08ed48f1de7f 20 #include "cmsis.h"
AnnaBridge 184:08ed48f1de7f 21 #include "em_cmu.h"
AnnaBridge 184:08ed48f1de7f 22
AnnaBridge 184:08ed48f1de7f 23 #include <stdbool.h>
AnnaBridge 184:08ed48f1de7f 24
AnnaBridge 184:08ed48f1de7f 25 /* SWO frequency: 875 kHz */
AnnaBridge 184:08ed48f1de7f 26 static void setupSWOForPrint(void)
AnnaBridge 184:08ed48f1de7f 27 {
AnnaBridge 184:08ed48f1de7f 28 #if defined( _GPIO_ROUTE_SWOPEN_MASK ) || defined( _GPIO_ROUTEPEN_SWVPEN_MASK )
AnnaBridge 184:08ed48f1de7f 29 // Enable GPIO clock.
AnnaBridge 184:08ed48f1de7f 30 #if defined( _CMU_HFPERCLKEN0_GPIO_MASK )
AnnaBridge 184:08ed48f1de7f 31 CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
AnnaBridge 184:08ed48f1de7f 32 #elif defined( _CMU_HFBUSCLKEN0_GPIO_MASK )
AnnaBridge 184:08ed48f1de7f 33 CMU->HFBUSCLKEN0 |= CMU_HFBUSCLKEN0_GPIO;
AnnaBridge 184:08ed48f1de7f 34 #endif
AnnaBridge 184:08ed48f1de7f 35
AnnaBridge 184:08ed48f1de7f 36 // Enable Serial wire output pin
AnnaBridge 184:08ed48f1de7f 37 #if defined( _GPIO_ROUTE_SWOPEN_MASK )
AnnaBridge 184:08ed48f1de7f 38 GPIO->ROUTE |= GPIO_ROUTE_SWOPEN;
AnnaBridge 184:08ed48f1de7f 39 #elif defined( _GPIO_ROUTEPEN_SWVPEN_MASK )
AnnaBridge 184:08ed48f1de7f 40 GPIO->ROUTEPEN |= GPIO_ROUTEPEN_SWVPEN;
AnnaBridge 184:08ed48f1de7f 41 #endif
AnnaBridge 184:08ed48f1de7f 42 #endif
AnnaBridge 184:08ed48f1de7f 43
AnnaBridge 184:08ed48f1de7f 44 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_LEOPARD_FAMILY) || defined(_EFM32_WONDER_FAMILY) || defined(_EFM32_PEARL_FAMILY)
AnnaBridge 184:08ed48f1de7f 45 // Set location 0
AnnaBridge 184:08ed48f1de7f 46 #if defined( _GPIO_ROUTE_SWOPEN_MASK )
AnnaBridge 184:08ed48f1de7f 47 GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC0;
AnnaBridge 184:08ed48f1de7f 48 #elif defined( _GPIO_ROUTEPEN_SWVPEN_MASK )
AnnaBridge 184:08ed48f1de7f 49 GPIO->ROUTELOC0 = (GPIO->ROUTELOC0 & ~(_GPIO_ROUTELOC0_SWVLOC_MASK)) | GPIO_ROUTELOC0_SWVLOC_LOC0;
AnnaBridge 184:08ed48f1de7f 50 #endif
AnnaBridge 184:08ed48f1de7f 51
AnnaBridge 184:08ed48f1de7f 52 // Enable output on pin - GPIO Port F, Pin 2
AnnaBridge 184:08ed48f1de7f 53 GPIO->P[5].MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
AnnaBridge 184:08ed48f1de7f 54 GPIO->P[5].MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
AnnaBridge 184:08ed48f1de7f 55 #else
AnnaBridge 184:08ed48f1de7f 56 // Set location 1
AnnaBridge 184:08ed48f1de7f 57 GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;
AnnaBridge 184:08ed48f1de7f 58
AnnaBridge 184:08ed48f1de7f 59 // Enable output on pin
AnnaBridge 184:08ed48f1de7f 60 GPIO->P[2].MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
AnnaBridge 184:08ed48f1de7f 61 GPIO->P[2].MODEH |= GPIO_P_MODEH_MODE15_PUSHPULL;
AnnaBridge 184:08ed48f1de7f 62 #endif
AnnaBridge 184:08ed48f1de7f 63
AnnaBridge 184:08ed48f1de7f 64 // Enable debug clock AUXHFRCO
AnnaBridge 184:08ed48f1de7f 65 CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;
AnnaBridge 184:08ed48f1de7f 66
AnnaBridge 184:08ed48f1de7f 67 // Wait until clock is ready
AnnaBridge 184:08ed48f1de7f 68 while (!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));
AnnaBridge 184:08ed48f1de7f 69
AnnaBridge 184:08ed48f1de7f 70 // Enable trace in core debug
AnnaBridge 184:08ed48f1de7f 71 CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
AnnaBridge 184:08ed48f1de7f 72
AnnaBridge 184:08ed48f1de7f 73 /* Set TPIU prescaler for the current debug clock frequency. Target frequency
AnnaBridge 184:08ed48f1de7f 74 is 875 kHz so we choose a divider that gives us the closest match.
AnnaBridge 184:08ed48f1de7f 75 Actual divider is TPI->ACPR + 1. */
AnnaBridge 184:08ed48f1de7f 76 uint32_t freq = CMU_ClockFreqGet(cmuClock_DBG) + (875000 / 2);
AnnaBridge 184:08ed48f1de7f 77 uint32_t div = freq / 875000;
AnnaBridge 184:08ed48f1de7f 78 TPI->ACPR = div - 1;
AnnaBridge 184:08ed48f1de7f 79 }
AnnaBridge 184:08ed48f1de7f 80
AnnaBridge 184:08ed48f1de7f 81 static bool swoIsInitd()
AnnaBridge 184:08ed48f1de7f 82 {
AnnaBridge 184:08ed48f1de7f 83 #if defined( _CMU_HFPERCLKEN0_GPIO_MASK )
AnnaBridge 184:08ed48f1de7f 84 return ((CMU->HFPERCLKEN0 & CMU_HFPERCLKEN0_GPIO) &&
AnnaBridge 184:08ed48f1de7f 85 (GPIO->ROUTE & GPIO_ROUTE_SWOPEN) &&
AnnaBridge 184:08ed48f1de7f 86 (CMU->STATUS & CMU_STATUS_AUXHFRCORDY) &&
AnnaBridge 184:08ed48f1de7f 87 (CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk));
AnnaBridge 184:08ed48f1de7f 88 #elif defined( _CMU_HFBUSCLKEN0_GPIO_MASK )
AnnaBridge 184:08ed48f1de7f 89 return ((CMU->HFBUSCLKEN0 & CMU_HFBUSCLKEN0_GPIO) &&
AnnaBridge 184:08ed48f1de7f 90 (GPIO->ROUTEPEN |= GPIO_ROUTEPEN_SWVPEN) &&
AnnaBridge 184:08ed48f1de7f 91 (CMU->STATUS & CMU_STATUS_AUXHFRCORDY) &&
AnnaBridge 184:08ed48f1de7f 92 (CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk));
AnnaBridge 184:08ed48f1de7f 93 #endif
AnnaBridge 184:08ed48f1de7f 94 }
AnnaBridge 184:08ed48f1de7f 95
AnnaBridge 184:08ed48f1de7f 96 // As SWO has to be accessible everywhere, including ISRs, we can't easily
AnnaBridge 184:08ed48f1de7f 97 // communicate the dependency on clocks etc. to other components - so this
AnnaBridge 184:08ed48f1de7f 98 // function checks that things appear to be set up, and if not re-configures
AnnaBridge 184:08ed48f1de7f 99 // everything
AnnaBridge 184:08ed48f1de7f 100 void itm_init(void)
AnnaBridge 184:08ed48f1de7f 101 {
AnnaBridge 184:08ed48f1de7f 102 if(!swoIsInitd()) {
AnnaBridge 184:08ed48f1de7f 103 setupSWOForPrint();
AnnaBridge 184:08ed48f1de7f 104 }
AnnaBridge 184:08ed48f1de7f 105 }
AnnaBridge 184:08ed48f1de7f 106
AnnaBridge 184:08ed48f1de7f 107 #endif