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:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /* mbed Microcontroller Library
AnnaBridge 187:0387e8f68319 2 * Copyright (c) 2006-2018 ARM Limited
Anna Bridge 186:707f6e361f3e 3 *
Anna Bridge 186:707f6e361f3e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Anna Bridge 186:707f6e361f3e 5 * you may not use this file except in compliance with the License.
Anna Bridge 186:707f6e361f3e 6 * You may obtain a copy of the License at
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * http://www.apache.org/licenses/LICENSE-2.0
Anna Bridge 186:707f6e361f3e 9 *
Anna Bridge 186:707f6e361f3e 10 * Unless required by applicable law or agreed to in writing, software
Anna Bridge 186:707f6e361f3e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Anna Bridge 186:707f6e361f3e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Anna Bridge 186:707f6e361f3e 13 * See the License for the specific language governing permissions and
Anna Bridge 186:707f6e361f3e 14 * limitations under the License.
Anna Bridge 186:707f6e361f3e 15 */
Anna Bridge 186:707f6e361f3e 16 #include <stddef.h>
Anna Bridge 186:707f6e361f3e 17 #include "us_ticker_api.h"
Anna Bridge 186:707f6e361f3e 18 #include "PeripheralNames.h"
AnnaBridge 187:0387e8f68319 19 #include "us_ticker_data.h"
Anna Bridge 186:707f6e361f3e 20
Anna Bridge 186:707f6e361f3e 21 TIM_HandleTypeDef TimMasterHandle;
Anna Bridge 186:707f6e361f3e 22
AnnaBridge 187:0387e8f68319 23 uint32_t timer_cnt_reg;
AnnaBridge 187:0387e8f68319 24 uint32_t timer_ccr1_reg;
AnnaBridge 187:0387e8f68319 25 uint32_t timer_dier_reg;
AnnaBridge 187:0387e8f68319 26
AnnaBridge 187:0387e8f68319 27 const ticker_info_t *us_ticker_get_info()
Anna Bridge 186:707f6e361f3e 28 {
Anna Bridge 186:707f6e361f3e 29 static const ticker_info_t info = {
Anna Bridge 186:707f6e361f3e 30 1000000,
AnnaBridge 187:0387e8f68319 31 TIM_MST_BIT_WIDTH
Anna Bridge 186:707f6e361f3e 32 };
Anna Bridge 186:707f6e361f3e 33 return &info;
Anna Bridge 186:707f6e361f3e 34 }
Anna Bridge 186:707f6e361f3e 35
AnnaBridge 187:0387e8f68319 36 void us_ticker_irq_handler(void);
AnnaBridge 187:0387e8f68319 37
AnnaBridge 187:0387e8f68319 38 // ************************************ 16-bit timer ************************************
AnnaBridge 187:0387e8f68319 39 #if TIM_MST_BIT_WIDTH == 16
AnnaBridge 187:0387e8f68319 40
AnnaBridge 187:0387e8f68319 41 extern uint32_t prev_time;
AnnaBridge 187:0387e8f68319 42 extern uint32_t elapsed_time;
AnnaBridge 187:0387e8f68319 43
AnnaBridge 187:0387e8f68319 44 #if defined(TARGET_STM32F0)
AnnaBridge 187:0387e8f68319 45 void timer_update_irq_handler(void)
AnnaBridge 187:0387e8f68319 46 {
AnnaBridge 187:0387e8f68319 47 #else
AnnaBridge 187:0387e8f68319 48 void timer_irq_handler(void)
AnnaBridge 187:0387e8f68319 49 {
AnnaBridge 187:0387e8f68319 50 #endif
AnnaBridge 187:0387e8f68319 51 TimMasterHandle.Instance = TIM_MST;
AnnaBridge 187:0387e8f68319 52
AnnaBridge 187:0387e8f68319 53 #if defined(TARGET_STM32F0)
AnnaBridge 187:0387e8f68319 54 } // end timer_update_irq_handler function
AnnaBridge 187:0387e8f68319 55
AnnaBridge 187:0387e8f68319 56 void timer_oc_irq_handler(void)
AnnaBridge 187:0387e8f68319 57 {
AnnaBridge 187:0387e8f68319 58 TimMasterHandle.Instance = TIM_MST;
AnnaBridge 187:0387e8f68319 59 #endif
AnnaBridge 187:0387e8f68319 60 if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
AnnaBridge 187:0387e8f68319 61 if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
AnnaBridge 187:0387e8f68319 62 __HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
AnnaBridge 187:0387e8f68319 63 us_ticker_irq_handler();
AnnaBridge 187:0387e8f68319 64 }
AnnaBridge 187:0387e8f68319 65 }
AnnaBridge 187:0387e8f68319 66 }
AnnaBridge 187:0387e8f68319 67
AnnaBridge 187:0387e8f68319 68 void init_16bit_timer(void)
AnnaBridge 187:0387e8f68319 69 {
AnnaBridge 187:0387e8f68319 70 // Enable timer clock
AnnaBridge 187:0387e8f68319 71 TIM_MST_RCC;
AnnaBridge 187:0387e8f68319 72
AnnaBridge 187:0387e8f68319 73 // Reset timer
AnnaBridge 187:0387e8f68319 74 TIM_MST_RESET_ON;
AnnaBridge 187:0387e8f68319 75 TIM_MST_RESET_OFF;
AnnaBridge 187:0387e8f68319 76
AnnaBridge 187:0387e8f68319 77 // Update the SystemCoreClock variable
AnnaBridge 187:0387e8f68319 78 SystemCoreClockUpdate();
AnnaBridge 187:0387e8f68319 79
AnnaBridge 187:0387e8f68319 80 // Configure time base
AnnaBridge 187:0387e8f68319 81 TimMasterHandle.Instance = TIM_MST;
AnnaBridge 187:0387e8f68319 82 TimMasterHandle.Init.Period = 0xFFFF;
AnnaBridge 187:0387e8f68319 83 TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
AnnaBridge 187:0387e8f68319 84 TimMasterHandle.Init.ClockDivision = 0;
AnnaBridge 187:0387e8f68319 85 TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
AnnaBridge 187:0387e8f68319 86 #if !defined(TARGET_STM32L0) && !defined(TARGET_STM32L1)
AnnaBridge 187:0387e8f68319 87 TimMasterHandle.Init.RepetitionCounter = 0;
AnnaBridge 187:0387e8f68319 88 #endif
AnnaBridge 187:0387e8f68319 89 #ifdef TIM_AUTORELOAD_PRELOAD_DISABLE
AnnaBridge 187:0387e8f68319 90 TimMasterHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
AnnaBridge 187:0387e8f68319 91 #endif
AnnaBridge 187:0387e8f68319 92 HAL_TIM_Base_Init(&TimMasterHandle);
AnnaBridge 187:0387e8f68319 93
AnnaBridge 187:0387e8f68319 94 // Configure output compare channel 1 for mbed timeout (enabled later when used)
AnnaBridge 187:0387e8f68319 95 HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1);
AnnaBridge 187:0387e8f68319 96
AnnaBridge 187:0387e8f68319 97 // Output compare channel 1 interrupt for mbed timeout
AnnaBridge 187:0387e8f68319 98 #if defined(TARGET_STM32F0)
AnnaBridge 187:0387e8f68319 99 NVIC_SetVector(TIM_MST_UP_IRQ, (uint32_t)timer_update_irq_handler);
AnnaBridge 187:0387e8f68319 100 NVIC_EnableIRQ(TIM_MST_UP_IRQ);
AnnaBridge 187:0387e8f68319 101 NVIC_SetPriority(TIM_MST_UP_IRQ, 0);
AnnaBridge 187:0387e8f68319 102 NVIC_SetVector(TIM_MST_OC_IRQ, (uint32_t)timer_oc_irq_handler);
AnnaBridge 187:0387e8f68319 103 NVIC_EnableIRQ(TIM_MST_OC_IRQ);
AnnaBridge 187:0387e8f68319 104 NVIC_SetPriority(TIM_MST_OC_IRQ, 1);
AnnaBridge 187:0387e8f68319 105 #else
AnnaBridge 187:0387e8f68319 106 NVIC_SetVector(TIM_MST_IRQ, (uint32_t)timer_irq_handler);
AnnaBridge 187:0387e8f68319 107 NVIC_EnableIRQ(TIM_MST_IRQ);
AnnaBridge 187:0387e8f68319 108 #endif
AnnaBridge 187:0387e8f68319 109
AnnaBridge 187:0387e8f68319 110 // Enable timer
AnnaBridge 187:0387e8f68319 111 HAL_TIM_Base_Start(&TimMasterHandle);
AnnaBridge 187:0387e8f68319 112
AnnaBridge 187:0387e8f68319 113 // Freeze timer on stop/breakpoint
AnnaBridge 187:0387e8f68319 114 // Define the FREEZE_TIMER_ON_DEBUG macro in mbed_app.json for example
AnnaBridge 187:0387e8f68319 115 #if !defined(NDEBUG) && defined(FREEZE_TIMER_ON_DEBUG) && defined(TIM_MST_DBGMCU_FREEZE)
AnnaBridge 187:0387e8f68319 116 TIM_MST_DBGMCU_FREEZE;
AnnaBridge 187:0387e8f68319 117 #endif
AnnaBridge 187:0387e8f68319 118
AnnaBridge 187:0387e8f68319 119 __HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
AnnaBridge 187:0387e8f68319 120
AnnaBridge 187:0387e8f68319 121 // Used by HAL_GetTick()
AnnaBridge 187:0387e8f68319 122 prev_time = 0;
AnnaBridge 187:0387e8f68319 123 elapsed_time = 0;
AnnaBridge 187:0387e8f68319 124 }
AnnaBridge 187:0387e8f68319 125
AnnaBridge 187:0387e8f68319 126 // ************************************ 32-bit timer ************************************
AnnaBridge 187:0387e8f68319 127 #else
AnnaBridge 187:0387e8f68319 128
AnnaBridge 187:0387e8f68319 129 void timer_irq_handler(void)
AnnaBridge 187:0387e8f68319 130 {
AnnaBridge 187:0387e8f68319 131 TimMasterHandle.Instance = TIM_MST;
AnnaBridge 187:0387e8f68319 132 if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
AnnaBridge 187:0387e8f68319 133 if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
AnnaBridge 187:0387e8f68319 134 __HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
AnnaBridge 187:0387e8f68319 135 us_ticker_irq_handler();
AnnaBridge 187:0387e8f68319 136 }
AnnaBridge 187:0387e8f68319 137 }
AnnaBridge 187:0387e8f68319 138 }
AnnaBridge 187:0387e8f68319 139
AnnaBridge 187:0387e8f68319 140 void init_32bit_timer(void)
AnnaBridge 187:0387e8f68319 141 {
AnnaBridge 187:0387e8f68319 142 RCC_ClkInitTypeDef RCC_ClkInitStruct;
AnnaBridge 187:0387e8f68319 143 uint32_t PclkFreq;
AnnaBridge 187:0387e8f68319 144
AnnaBridge 187:0387e8f68319 145 // Get clock configuration
AnnaBridge 187:0387e8f68319 146 // Note: PclkFreq contains here the Latency (not used after)
AnnaBridge 187:0387e8f68319 147 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &PclkFreq);
AnnaBridge 187:0387e8f68319 148
AnnaBridge 187:0387e8f68319 149 // Get timer clock value
AnnaBridge 187:0387e8f68319 150 #if TIM_MST_PCLK == 1
AnnaBridge 187:0387e8f68319 151 PclkFreq = HAL_RCC_GetPCLK1Freq();
AnnaBridge 187:0387e8f68319 152 #else
AnnaBridge 187:0387e8f68319 153 PclkFreq = HAL_RCC_GetPCLK2Freq();
AnnaBridge 187:0387e8f68319 154 #endif
AnnaBridge 187:0387e8f68319 155
AnnaBridge 187:0387e8f68319 156 // Enable timer clock
AnnaBridge 187:0387e8f68319 157 TIM_MST_RCC;
AnnaBridge 187:0387e8f68319 158
AnnaBridge 187:0387e8f68319 159 // Reset timer
AnnaBridge 187:0387e8f68319 160 TIM_MST_RESET_ON;
AnnaBridge 187:0387e8f68319 161 TIM_MST_RESET_OFF;
AnnaBridge 187:0387e8f68319 162
AnnaBridge 187:0387e8f68319 163 // Configure time base
AnnaBridge 187:0387e8f68319 164 TimMasterHandle.Instance = TIM_MST;
AnnaBridge 187:0387e8f68319 165 TimMasterHandle.Init.Period = 0xFFFFFFFF;
AnnaBridge 187:0387e8f68319 166
AnnaBridge 187:0387e8f68319 167 // TIMxCLK = PCLKx when the APB prescaler = 1 else TIMxCLK = 2 * PCLKx
AnnaBridge 187:0387e8f68319 168 #if TIM_MST_PCLK == 1
AnnaBridge 187:0387e8f68319 169 if (RCC_ClkInitStruct.APB1CLKDivider == RCC_HCLK_DIV1) {
AnnaBridge 187:0387e8f68319 170 #else
AnnaBridge 187:0387e8f68319 171 if (RCC_ClkInitStruct.APB2CLKDivider == RCC_HCLK_DIV1) {
AnnaBridge 187:0387e8f68319 172 #endif
AnnaBridge 187:0387e8f68319 173 TimMasterHandle.Init.Prescaler = (uint16_t)((PclkFreq) / 1000000) - 1; // 1 us tick
AnnaBridge 187:0387e8f68319 174 } else {
AnnaBridge 187:0387e8f68319 175 TimMasterHandle.Init.Prescaler = (uint16_t)((PclkFreq * 2) / 1000000) - 1; // 1 us tick
AnnaBridge 187:0387e8f68319 176 }
AnnaBridge 187:0387e8f68319 177
AnnaBridge 187:0387e8f68319 178 TimMasterHandle.Init.ClockDivision = 0;
AnnaBridge 187:0387e8f68319 179 TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
AnnaBridge 187:0387e8f68319 180 #if !TARGET_STM32L1
AnnaBridge 187:0387e8f68319 181 TimMasterHandle.Init.RepetitionCounter = 0;
AnnaBridge 187:0387e8f68319 182 #endif
AnnaBridge 187:0387e8f68319 183 #ifdef TIM_AUTORELOAD_PRELOAD_DISABLE
AnnaBridge 187:0387e8f68319 184 TimMasterHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
AnnaBridge 187:0387e8f68319 185 #endif
AnnaBridge 187:0387e8f68319 186 HAL_TIM_OC_Init(&TimMasterHandle);
AnnaBridge 187:0387e8f68319 187
AnnaBridge 187:0387e8f68319 188 NVIC_SetVector(TIM_MST_IRQ, (uint32_t)timer_irq_handler);
AnnaBridge 187:0387e8f68319 189 NVIC_EnableIRQ(TIM_MST_IRQ);
AnnaBridge 187:0387e8f68319 190
AnnaBridge 187:0387e8f68319 191 // Channel 1 for mbed timeout
AnnaBridge 187:0387e8f68319 192 HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1);
AnnaBridge 187:0387e8f68319 193
AnnaBridge 187:0387e8f68319 194 // Freeze timer on stop/breakpoint
AnnaBridge 187:0387e8f68319 195 // Define the FREEZE_TIMER_ON_DEBUG macro in mbed_app.json for example
AnnaBridge 187:0387e8f68319 196 #if !defined(NDEBUG) && defined(FREEZE_TIMER_ON_DEBUG) && defined(TIM_MST_DBGMCU_FREEZE)
AnnaBridge 187:0387e8f68319 197 TIM_MST_DBGMCU_FREEZE;
AnnaBridge 187:0387e8f68319 198 #endif
AnnaBridge 187:0387e8f68319 199
AnnaBridge 187:0387e8f68319 200 __HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
AnnaBridge 187:0387e8f68319 201 }
AnnaBridge 187:0387e8f68319 202
AnnaBridge 187:0387e8f68319 203 #endif // 16-bit/32-bit timer
AnnaBridge 187:0387e8f68319 204
Anna Bridge 186:707f6e361f3e 205 void us_ticker_init(void)
Anna Bridge 186:707f6e361f3e 206 {
AnnaBridge 187:0387e8f68319 207 // Timer is already initialized in HAL_InitTick()
Anna Bridge 186:707f6e361f3e 208 __HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
AnnaBridge 188:bcfe06ba3d64 209 HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1);
Anna Bridge 186:707f6e361f3e 210 }
Anna Bridge 186:707f6e361f3e 211
Anna Bridge 186:707f6e361f3e 212 uint32_t us_ticker_read()
Anna Bridge 186:707f6e361f3e 213 {
Anna Bridge 186:707f6e361f3e 214 return TIM_MST->CNT;
Anna Bridge 186:707f6e361f3e 215 }
Anna Bridge 186:707f6e361f3e 216
Anna Bridge 186:707f6e361f3e 217 void us_ticker_set_interrupt(timestamp_t timestamp)
Anna Bridge 186:707f6e361f3e 218 {
Anna Bridge 186:707f6e361f3e 219 // NOTE: This function must be called with interrupts disabled to keep our
Anna Bridge 186:707f6e361f3e 220 // timer interrupt setup atomic
Anna Bridge 186:707f6e361f3e 221 // Set new output compare value
Anna Bridge 186:707f6e361f3e 222 __HAL_TIM_SET_COMPARE(&TimMasterHandle, TIM_CHANNEL_1, (uint32_t)timestamp);
Anna Bridge 186:707f6e361f3e 223 // Ensure the compare event starts clear
Anna Bridge 186:707f6e361f3e 224 __HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
Anna Bridge 186:707f6e361f3e 225 // Enable IT
Anna Bridge 186:707f6e361f3e 226 __HAL_TIM_ENABLE_IT(&TimMasterHandle, TIM_IT_CC1);
Anna Bridge 186:707f6e361f3e 227 }
Anna Bridge 186:707f6e361f3e 228
Anna Bridge 186:707f6e361f3e 229 void us_ticker_fire_interrupt(void)
Anna Bridge 186:707f6e361f3e 230 {
Anna Bridge 186:707f6e361f3e 231 __HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
Anna Bridge 186:707f6e361f3e 232 LL_TIM_GenerateEvent_CC1(TimMasterHandle.Instance);
Anna Bridge 186:707f6e361f3e 233 __HAL_TIM_ENABLE_IT(&TimMasterHandle, TIM_IT_CC1);
Anna Bridge 186:707f6e361f3e 234 }
Anna Bridge 186:707f6e361f3e 235
Anna Bridge 186:707f6e361f3e 236 void us_ticker_disable_interrupt(void)
Anna Bridge 186:707f6e361f3e 237 {
Anna Bridge 186:707f6e361f3e 238 __HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
Anna Bridge 186:707f6e361f3e 239 }
Anna Bridge 186:707f6e361f3e 240
Anna Bridge 186:707f6e361f3e 241 /* NOTE: must be called with interrupts disabled! */
Anna Bridge 186:707f6e361f3e 242 void us_ticker_clear_interrupt(void)
Anna Bridge 186:707f6e361f3e 243 {
Anna Bridge 186:707f6e361f3e 244 __HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
Anna Bridge 186:707f6e361f3e 245 }
Anna Bridge 186:707f6e361f3e 246
AnnaBridge 187:0387e8f68319 247 void save_timer_ctx(void)
AnnaBridge 187:0387e8f68319 248 {
AnnaBridge 187:0387e8f68319 249 timer_cnt_reg = __HAL_TIM_GET_COUNTER(&TimMasterHandle);
AnnaBridge 187:0387e8f68319 250 timer_ccr1_reg = __HAL_TIM_GET_COMPARE(&TimMasterHandle, TIM_CHANNEL_1);
AnnaBridge 187:0387e8f68319 251 timer_dier_reg = TIM_MST->DIER;
AnnaBridge 187:0387e8f68319 252 }
AnnaBridge 187:0387e8f68319 253
AnnaBridge 187:0387e8f68319 254 void restore_timer_ctx(void)
AnnaBridge 187:0387e8f68319 255 {
AnnaBridge 187:0387e8f68319 256 __HAL_TIM_SET_COUNTER(&TimMasterHandle, timer_cnt_reg);
AnnaBridge 187:0387e8f68319 257 __HAL_TIM_SET_COMPARE(&TimMasterHandle, TIM_CHANNEL_1, timer_ccr1_reg);
AnnaBridge 187:0387e8f68319 258 TIM_MST->DIER = timer_dier_reg;
AnnaBridge 187:0387e8f68319 259 }
AnnaBridge 188:bcfe06ba3d64 260
AnnaBridge 188:bcfe06ba3d64 261 void us_ticker_free(void)
AnnaBridge 188:bcfe06ba3d64 262 {
AnnaBridge 188:bcfe06ba3d64 263 HAL_TIM_OC_Stop(&TimMasterHandle, TIM_CHANNEL_1);
AnnaBridge 188:bcfe06ba3d64 264 us_ticker_disable_interrupt();
AnnaBridge 188:bcfe06ba3d64 265 }
AnnaBridge 188:bcfe06ba3d64 266