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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2018 GigaDevice Semiconductor Inc.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 7 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 8 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 11 *
AnnaBridge 189:f392fc9709a3 12 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 13 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 15 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 16 * limitations under the License.
AnnaBridge 189:f392fc9709a3 17 */
AnnaBridge 189:f392fc9709a3 18 #include "gd32e10x.h"
AnnaBridge 189:f392fc9709a3 19 #include "us_ticker_api.h"
AnnaBridge 189:f392fc9709a3 20 #include "PeripheralNames.h"
AnnaBridge 189:f392fc9709a3 21 #include "hal_tick.h"
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 #if TICKER_TIMER_WIDTH_BIT == 16
AnnaBridge 189:f392fc9709a3 24 uint32_t time_before;
AnnaBridge 189:f392fc9709a3 25 uint32_t total_elapsed_time;
AnnaBridge 189:f392fc9709a3 26 #endif
AnnaBridge 189:f392fc9709a3 27
AnnaBridge 189:f392fc9709a3 28 /* this variable is set to 1 at the end of mbed_sdk_init function.
AnnaBridge 189:f392fc9709a3 29 the ticker_read_us() function must not be called until the mbed_sdk_init is terminated */
AnnaBridge 189:f392fc9709a3 30 extern int mbed_sdk_inited;
AnnaBridge 189:f392fc9709a3 31 uint32_t ticker_timer_cnt;
AnnaBridge 189:f392fc9709a3 32 uint32_t ticker_timer_ch0cv;
AnnaBridge 189:f392fc9709a3 33 uint32_t ticker_timer_dmainten;
AnnaBridge 189:f392fc9709a3 34
AnnaBridge 189:f392fc9709a3 35 void ticker_timer_init(void);
AnnaBridge 189:f392fc9709a3 36 #if TICKER_TIMER_WIDTH_BIT == 16
AnnaBridge 189:f392fc9709a3 37 void ticker_16bits_timer_init(void);
AnnaBridge 189:f392fc9709a3 38 #else
AnnaBridge 189:f392fc9709a3 39 void ticker_32bits_timer_init(void);
AnnaBridge 189:f392fc9709a3 40 #endif
AnnaBridge 189:f392fc9709a3 41 void ticker_timer_irq_handler(void);
AnnaBridge 189:f392fc9709a3 42 /* get TIMER clock */
AnnaBridge 189:f392fc9709a3 43 static uint32_t timer_get_clock(uint32_t timer_periph);
AnnaBridge 189:f392fc9709a3 44 uint32_t ticker_tick_get(void);
AnnaBridge 189:f392fc9709a3 45 void ticker_timer_data_save(void);
AnnaBridge 189:f392fc9709a3 46 void ticker_timer_data_save(void);
AnnaBridge 189:f392fc9709a3 47 void ticker_timer_data_restore(void);
AnnaBridge 189:f392fc9709a3 48
AnnaBridge 189:f392fc9709a3 49 void ticker_timer_init(void)
AnnaBridge 189:f392fc9709a3 50 {
AnnaBridge 189:f392fc9709a3 51 #if TICKER_TIMER_WIDTH_BIT == 16
AnnaBridge 189:f392fc9709a3 52 ticker_16bits_timer_init();
AnnaBridge 189:f392fc9709a3 53 #else
AnnaBridge 189:f392fc9709a3 54 ticker_32bits_timer_init();
AnnaBridge 189:f392fc9709a3 55 #endif
AnnaBridge 189:f392fc9709a3 56 }
AnnaBridge 189:f392fc9709a3 57
AnnaBridge 189:f392fc9709a3 58 /** get tick
AnnaBridge 189:f392fc9709a3 59 *
AnnaBridge 189:f392fc9709a3 60 * @return the tick
AnnaBridge 189:f392fc9709a3 61 */
AnnaBridge 189:f392fc9709a3 62 uint32_t ticker_tick_get(void)
AnnaBridge 189:f392fc9709a3 63 {
AnnaBridge 189:f392fc9709a3 64 #if TICKER_TIMER_WIDTH_BIT == 16
AnnaBridge 189:f392fc9709a3 65 uint32_t new_time;
AnnaBridge 189:f392fc9709a3 66 if (mbed_sdk_inited) {
AnnaBridge 189:f392fc9709a3 67 /* Apply the latest time recorded just before the sdk is inited */
AnnaBridge 189:f392fc9709a3 68 new_time = ticker_read_us(get_us_ticker_data()) + time_before;
AnnaBridge 189:f392fc9709a3 69 time_before = 0;
AnnaBridge 189:f392fc9709a3 70 return (new_time / 1000);
AnnaBridge 189:f392fc9709a3 71 } else {
AnnaBridge 189:f392fc9709a3 72 /* Prevent small values from subtracting large ones
AnnaBridge 189:f392fc9709a3 73 example:
AnnaBridge 189:f392fc9709a3 74 0x0010-0xFFEE=FFFF0022 , (0xFFFF-0xFFEE+0x10+1=0x22,1 mean CNT=0 tick)
AnnaBridge 189:f392fc9709a3 75 FFFF0022 & 0xFFFF = 0022
AnnaBridge 189:f392fc9709a3 76 */
AnnaBridge 189:f392fc9709a3 77 new_time = us_ticker_read();
AnnaBridge 189:f392fc9709a3 78 total_elapsed_time += (new_time - time_before) & 0xFFFF;
AnnaBridge 189:f392fc9709a3 79 time_before = new_time;
AnnaBridge 189:f392fc9709a3 80 return (total_elapsed_time / 1000);
AnnaBridge 189:f392fc9709a3 81 }
AnnaBridge 189:f392fc9709a3 82 #else // 32-bit timer
AnnaBridge 189:f392fc9709a3 83 if (mbed_sdk_inited) {
AnnaBridge 189:f392fc9709a3 84 return (ticker_read_us(get_us_ticker_data()) / 1000);
AnnaBridge 189:f392fc9709a3 85 } else {
AnnaBridge 189:f392fc9709a3 86 return (us_ticker_read() / 1000);
AnnaBridge 189:f392fc9709a3 87 }
AnnaBridge 189:f392fc9709a3 88 #endif
AnnaBridge 189:f392fc9709a3 89 }
AnnaBridge 189:f392fc9709a3 90
AnnaBridge 189:f392fc9709a3 91 /** Get frequency and counter bits of this ticker.
AnnaBridge 189:f392fc9709a3 92 */
AnnaBridge 189:f392fc9709a3 93 const ticker_info_t *us_ticker_get_info()
AnnaBridge 189:f392fc9709a3 94 {
AnnaBridge 189:f392fc9709a3 95 static const ticker_info_t info = {
AnnaBridge 189:f392fc9709a3 96 1000000,
AnnaBridge 189:f392fc9709a3 97 TICKER_TIMER_WIDTH_BIT
AnnaBridge 189:f392fc9709a3 98 };
AnnaBridge 189:f392fc9709a3 99 return &info;
AnnaBridge 189:f392fc9709a3 100 }
AnnaBridge 189:f392fc9709a3 101
AnnaBridge 189:f392fc9709a3 102
AnnaBridge 189:f392fc9709a3 103
AnnaBridge 189:f392fc9709a3 104 /* config for 32bits TIMER */
AnnaBridge 189:f392fc9709a3 105 #if TICKER_TIMER_WIDTH_BIT == 16
AnnaBridge 189:f392fc9709a3 106 /** config the interrupt handler
AnnaBridge 189:f392fc9709a3 107 */
AnnaBridge 189:f392fc9709a3 108 void ticker_timer_irq_handler(void)
AnnaBridge 189:f392fc9709a3 109 {
AnnaBridge 189:f392fc9709a3 110 if (SET == timer_interrupt_flag_get(TICKER_TIMER, TIMER_INT_FLAG_CH0)) {
AnnaBridge 189:f392fc9709a3 111 timer_interrupt_flag_clear(TICKER_TIMER, TIMER_INT_FLAG_CH0);
AnnaBridge 189:f392fc9709a3 112 us_ticker_irq_handler();
AnnaBridge 189:f392fc9709a3 113 }
AnnaBridge 189:f392fc9709a3 114 }
AnnaBridge 189:f392fc9709a3 115
AnnaBridge 189:f392fc9709a3 116 /** initialize the TIMER
AnnaBridge 189:f392fc9709a3 117 */
AnnaBridge 189:f392fc9709a3 118 void ticker_16bits_timer_init(void)
AnnaBridge 189:f392fc9709a3 119 {
AnnaBridge 189:f392fc9709a3 120 timer_parameter_struct timer_initpara;
AnnaBridge 189:f392fc9709a3 121 uint32_t timer_clk = timer_get_clock(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 122
AnnaBridge 189:f392fc9709a3 123 /* enable ticker timer clock */
AnnaBridge 189:f392fc9709a3 124 TICKER_TIMER_RCU_CLOCK_ENABLE;
AnnaBridge 189:f392fc9709a3 125
AnnaBridge 189:f392fc9709a3 126 /* reset ticker timer peripheral */
AnnaBridge 189:f392fc9709a3 127 TICKER_TIMER_RESET_ENABLE;
AnnaBridge 189:f392fc9709a3 128 TICKER_TIMER_RESET_DISABLE;
AnnaBridge 189:f392fc9709a3 129
AnnaBridge 189:f392fc9709a3 130 /* TICKER_TIMER configuration */
AnnaBridge 189:f392fc9709a3 131 timer_initpara.prescaler = (uint32_t)(timer_clk / 1000000) - 1;;
AnnaBridge 189:f392fc9709a3 132 timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
AnnaBridge 189:f392fc9709a3 133 timer_initpara.counterdirection = TIMER_COUNTER_UP;
AnnaBridge 189:f392fc9709a3 134 timer_initpara.period = 0xFFFF;
AnnaBridge 189:f392fc9709a3 135 timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
AnnaBridge 189:f392fc9709a3 136 timer_initpara.repetitioncounter = 0;
AnnaBridge 189:f392fc9709a3 137 timer_init(TICKER_TIMER, &timer_initpara);
AnnaBridge 189:f392fc9709a3 138
AnnaBridge 189:f392fc9709a3 139 /* auto-reload preload disable */
AnnaBridge 189:f392fc9709a3 140 timer_auto_reload_shadow_disable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 141
AnnaBridge 189:f392fc9709a3 142 /* configure TIMER channel enable state */
AnnaBridge 189:f392fc9709a3 143 timer_channel_output_state_config(TICKER_TIMER, TIMER_CH_0, TIMER_CCX_ENABLE);
AnnaBridge 189:f392fc9709a3 144
AnnaBridge 189:f392fc9709a3 145 /* configure TIMER primary output function */
AnnaBridge 189:f392fc9709a3 146 timer_primary_output_config(TICKER_TIMER, ENABLE);
AnnaBridge 189:f392fc9709a3 147
AnnaBridge 189:f392fc9709a3 148 timer_enable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 149
AnnaBridge 189:f392fc9709a3 150 /* Output compare channel 0 interrupt for mbed timeout */
AnnaBridge 189:f392fc9709a3 151 NVIC_SetVector(TICKER_TIMER_IRQ, (uint32_t)ticker_timer_irq_handler);
AnnaBridge 189:f392fc9709a3 152 NVIC_EnableIRQ(TICKER_TIMER_IRQ);
AnnaBridge 189:f392fc9709a3 153
AnnaBridge 189:f392fc9709a3 154 /* if define the FREEZE_TIMER_ON_DEBUG macro in mbed_app.json or other file,
AnnaBridge 189:f392fc9709a3 155 hold the TICKER_TIMER counter for debug when core halted
AnnaBridge 189:f392fc9709a3 156 */
AnnaBridge 189:f392fc9709a3 157 #if !defined(NDEBUG) && defined(FREEZE_TIMER_ON_DEBUG) && defined(TICKER_TIMER_DEBUG_STOP)
AnnaBridge 189:f392fc9709a3 158 TICKER_TIMER_DEBUG_STOP;
AnnaBridge 189:f392fc9709a3 159 #endif
AnnaBridge 189:f392fc9709a3 160
AnnaBridge 189:f392fc9709a3 161 timer_interrupt_disable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 162
AnnaBridge 189:f392fc9709a3 163 /* used by ticker_tick_get() */
AnnaBridge 189:f392fc9709a3 164 time_before = 0;
AnnaBridge 189:f392fc9709a3 165 total_elapsed_time = 0;
AnnaBridge 189:f392fc9709a3 166 }
AnnaBridge 189:f392fc9709a3 167 /* config for 32bits TIMER */
AnnaBridge 189:f392fc9709a3 168 #else
AnnaBridge 189:f392fc9709a3 169 /** config the interrupt handler
AnnaBridge 189:f392fc9709a3 170 */
AnnaBridge 189:f392fc9709a3 171 void ticker_timer_irq_handler(void)
AnnaBridge 189:f392fc9709a3 172 {
AnnaBridge 189:f392fc9709a3 173 if (SET == timer_interrupt_flag_get(TICKER_TIMER, TIMER_INT_FLAG_CH0)) {
AnnaBridge 189:f392fc9709a3 174 timer_interrupt_flag_clear(TICKER_TIMER, TIMER_INT_FLAG_CH0);
AnnaBridge 189:f392fc9709a3 175 us_ticker_irq_handler();
AnnaBridge 189:f392fc9709a3 176 }
AnnaBridge 189:f392fc9709a3 177 }
AnnaBridge 189:f392fc9709a3 178
AnnaBridge 189:f392fc9709a3 179 /** initialize the TIMER
AnnaBridge 189:f392fc9709a3 180 */
AnnaBridge 189:f392fc9709a3 181 void ticker_32bits_timer_init(void)
AnnaBridge 189:f392fc9709a3 182 {
AnnaBridge 189:f392fc9709a3 183 timer_parameter_struct timer_initpara;
AnnaBridge 189:f392fc9709a3 184 uint32_t timer_clk = timer_get_clock(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 185
AnnaBridge 189:f392fc9709a3 186 /* enable ticker timer clock */
AnnaBridge 189:f392fc9709a3 187 TICKER_TIMER_RCU_CLOCK_ENABLE;
AnnaBridge 189:f392fc9709a3 188
AnnaBridge 189:f392fc9709a3 189 /* reset ticker timer peripheral */
AnnaBridge 189:f392fc9709a3 190 TICKER_TIMER_RESET_ENABLE;
AnnaBridge 189:f392fc9709a3 191 TICKER_TIMER_RESET_DISABLE;
AnnaBridge 189:f392fc9709a3 192
AnnaBridge 189:f392fc9709a3 193 /* TICKER_TIMER configuration */
AnnaBridge 189:f392fc9709a3 194 timer_initpara.prescaler = (uint32_t)(timer_clk / 1000000) - 1;;
AnnaBridge 189:f392fc9709a3 195 timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
AnnaBridge 189:f392fc9709a3 196 timer_initpara.counterdirection = TIMER_COUNTER_UP;
AnnaBridge 189:f392fc9709a3 197 timer_initpara.period = 0xFFFFFFFF;
AnnaBridge 189:f392fc9709a3 198 timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
AnnaBridge 189:f392fc9709a3 199 timer_initpara.repetitioncounter = 0;
AnnaBridge 189:f392fc9709a3 200 timer_init(TICKER_TIMER, &timer_initpara);
AnnaBridge 189:f392fc9709a3 201
AnnaBridge 189:f392fc9709a3 202 /* auto-reload preload disable */
AnnaBridge 189:f392fc9709a3 203 timer_auto_reload_shadow_disable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 204
AnnaBridge 189:f392fc9709a3 205 /* configure TIMER channel enable state */
AnnaBridge 189:f392fc9709a3 206 timer_channel_output_state_config(TICKER_TIMER, TIMER_CH_0, TIMER_CCX_ENABLE);
AnnaBridge 189:f392fc9709a3 207
AnnaBridge 189:f392fc9709a3 208 /* configure TIMER primary output function */
AnnaBridge 189:f392fc9709a3 209 timer_primary_output_config(TICKER_TIMER, ENABLE);
AnnaBridge 189:f392fc9709a3 210
AnnaBridge 189:f392fc9709a3 211 timer_enable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 212
AnnaBridge 189:f392fc9709a3 213 /* Output compare channel 0 interrupt for mbed timeout */
AnnaBridge 189:f392fc9709a3 214 NVIC_SetVector(TICKER_TIMER_IRQ, (uint32_t)ticker_timer_irq_handler);
AnnaBridge 189:f392fc9709a3 215 NVIC_EnableIRQ(TICKER_TIMER_IRQ);
AnnaBridge 189:f392fc9709a3 216
AnnaBridge 189:f392fc9709a3 217 /* if define the FREEZE_TIMER_ON_DEBUG macro in mbed_app.json or other file,
AnnaBridge 189:f392fc9709a3 218 hold the TICKER_TIMER counter for debug when core halted
AnnaBridge 189:f392fc9709a3 219 */
AnnaBridge 189:f392fc9709a3 220 #if !defined(NDEBUG) && defined(FREEZE_TIMER_ON_DEBUG) && defined(TICKER_TIMER_DEBUG_STOP)
AnnaBridge 189:f392fc9709a3 221 TICKER_TIMER_DEBUG_STOP;
AnnaBridge 189:f392fc9709a3 222 #endif
AnnaBridge 189:f392fc9709a3 223
AnnaBridge 189:f392fc9709a3 224 timer_interrupt_disable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 225 }
AnnaBridge 189:f392fc9709a3 226
AnnaBridge 189:f392fc9709a3 227 #endif /* 16-bit/32-bit timer init */
AnnaBridge 189:f392fc9709a3 228
AnnaBridge 189:f392fc9709a3 229 /** Initialize the ticker
AnnaBridge 189:f392fc9709a3 230 *
AnnaBridge 189:f392fc9709a3 231 * Initialize or re-initialize the ticker. This resets all the
AnnaBridge 189:f392fc9709a3 232 * clocking and prescaler registers, along with disabling
AnnaBridge 189:f392fc9709a3 233 * the compare interrupt.
AnnaBridge 189:f392fc9709a3 234 *
AnnaBridge 189:f392fc9709a3 235 * @note Initialization properties tested by ::ticker_init_test
AnnaBridge 189:f392fc9709a3 236 */
AnnaBridge 189:f392fc9709a3 237 void us_ticker_init(void)
AnnaBridge 189:f392fc9709a3 238 {
AnnaBridge 189:f392fc9709a3 239 /* TIMER is already initialized in ticker_timer_init() */
AnnaBridge 189:f392fc9709a3 240 /* disable the TIMER interrupt */
AnnaBridge 189:f392fc9709a3 241 timer_interrupt_disable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 242 /* configure TIMER channel enable state */
AnnaBridge 189:f392fc9709a3 243 timer_channel_output_state_config(TICKER_TIMER, TIMER_CH_0, TIMER_CCX_ENABLE);
AnnaBridge 189:f392fc9709a3 244
AnnaBridge 189:f392fc9709a3 245 /* configure TIMER primary output function */
AnnaBridge 189:f392fc9709a3 246 timer_primary_output_config(TICKER_TIMER, ENABLE);
AnnaBridge 189:f392fc9709a3 247
AnnaBridge 189:f392fc9709a3 248 timer_enable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 249
AnnaBridge 189:f392fc9709a3 250 }
AnnaBridge 189:f392fc9709a3 251
AnnaBridge 189:f392fc9709a3 252 /** Read the current counter
AnnaBridge 189:f392fc9709a3 253 *
AnnaBridge 189:f392fc9709a3 254 * Read the current counter value without performing frequency conversions.
AnnaBridge 189:f392fc9709a3 255 * If no rollover has occurred, the seconds passed since us_ticker_init()
AnnaBridge 189:f392fc9709a3 256 * was called can be found by dividing the ticks returned by this function
AnnaBridge 189:f392fc9709a3 257 * by the frequency returned by ::us_ticker_get_info.
AnnaBridge 189:f392fc9709a3 258 *
AnnaBridge 189:f392fc9709a3 259 * @return The current timer's counter value in ticks
AnnaBridge 189:f392fc9709a3 260 */
AnnaBridge 189:f392fc9709a3 261 uint32_t us_ticker_read()
AnnaBridge 189:f392fc9709a3 262 {
AnnaBridge 189:f392fc9709a3 263 /* read TIMER counter value */
AnnaBridge 189:f392fc9709a3 264 uint32_t count_value = 0U;
AnnaBridge 189:f392fc9709a3 265 count_value = TIMER_CNT(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 266 return (count_value);
AnnaBridge 189:f392fc9709a3 267 }
AnnaBridge 189:f392fc9709a3 268
AnnaBridge 189:f392fc9709a3 269 /** Set interrupt for specified timestamp
AnnaBridge 189:f392fc9709a3 270 *
AnnaBridge 189:f392fc9709a3 271 * @param timestamp The time in ticks to be set
AnnaBridge 189:f392fc9709a3 272 *
AnnaBridge 189:f392fc9709a3 273 * @note no special handling needs to be done for times in the past
AnnaBridge 189:f392fc9709a3 274 * as the common timer code will detect this and call
AnnaBridge 189:f392fc9709a3 275 * us_ticker_fire_interrupt() if this is the case
AnnaBridge 189:f392fc9709a3 276 *
AnnaBridge 189:f392fc9709a3 277 * @note calling this function with timestamp of more than the supported
AnnaBridge 189:f392fc9709a3 278 * number of bits returned by ::us_ticker_get_info results in undefined
AnnaBridge 189:f392fc9709a3 279 * behavior.
AnnaBridge 189:f392fc9709a3 280 */
AnnaBridge 189:f392fc9709a3 281 void us_ticker_set_interrupt(timestamp_t timestamp)
AnnaBridge 189:f392fc9709a3 282 {
AnnaBridge 189:f392fc9709a3 283 /* configure TIMER channel output pulse value.Only set this value when you interrupt disabled */
AnnaBridge 189:f392fc9709a3 284 timer_channel_output_pulse_value_config(TICKER_TIMER, TIMER_CH_0, (uint32_t)timestamp);
AnnaBridge 189:f392fc9709a3 285 /* clear TIMER interrupt flag,enable the TIMER interrupt */
AnnaBridge 189:f392fc9709a3 286 timer_interrupt_flag_clear(TICKER_TIMER, TIMER_INT_FLAG_CH0);
AnnaBridge 189:f392fc9709a3 287 timer_interrupt_enable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 288 }
AnnaBridge 189:f392fc9709a3 289
AnnaBridge 189:f392fc9709a3 290 /** Set pending interrupt that should be fired right away.
AnnaBridge 189:f392fc9709a3 291 *
AnnaBridge 189:f392fc9709a3 292 * The ticker should be initialized prior calling this function.
AnnaBridge 189:f392fc9709a3 293 */
AnnaBridge 189:f392fc9709a3 294 void us_ticker_fire_interrupt(void)
AnnaBridge 189:f392fc9709a3 295 {
AnnaBridge 189:f392fc9709a3 296 /* clear TIMER interrupt flag */
AnnaBridge 189:f392fc9709a3 297 timer_interrupt_flag_clear(TICKER_TIMER, TIMER_INT_FLAG_CH0);
AnnaBridge 189:f392fc9709a3 298 /* channel 0 capture or compare event generation immediately,so CH0IF set for interrupt */
AnnaBridge 189:f392fc9709a3 299 timer_event_software_generate(TICKER_TIMER, TIMER_EVENT_SRC_CH0G);
AnnaBridge 189:f392fc9709a3 300 /* enable the TIMER interrupt */
AnnaBridge 189:f392fc9709a3 301 timer_interrupt_enable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 302 }
AnnaBridge 189:f392fc9709a3 303
AnnaBridge 189:f392fc9709a3 304 /** Disable us ticker interrupt
AnnaBridge 189:f392fc9709a3 305 */
AnnaBridge 189:f392fc9709a3 306 void us_ticker_disable_interrupt(void)
AnnaBridge 189:f392fc9709a3 307 {
AnnaBridge 189:f392fc9709a3 308 /* disable the TIMER interrupt */
AnnaBridge 189:f392fc9709a3 309 timer_interrupt_disable(TICKER_TIMER, TIMER_INT_CH0);
AnnaBridge 189:f392fc9709a3 310 }
AnnaBridge 189:f392fc9709a3 311
AnnaBridge 189:f392fc9709a3 312 /** Clear us ticker interrupt
AnnaBridge 189:f392fc9709a3 313 * note: must be called with interrupts disabled function
AnnaBridge 189:f392fc9709a3 314 */
AnnaBridge 189:f392fc9709a3 315 void us_ticker_clear_interrupt(void)
AnnaBridge 189:f392fc9709a3 316 {
AnnaBridge 189:f392fc9709a3 317 /* clear TIMER interrupt flag */
AnnaBridge 189:f392fc9709a3 318 timer_interrupt_flag_clear(TICKER_TIMER, TIMER_INT_FLAG_CH0);
AnnaBridge 189:f392fc9709a3 319 }
AnnaBridge 189:f392fc9709a3 320
AnnaBridge 189:f392fc9709a3 321 /** save ticker TIMER data when MCU go to deepsleep
AnnaBridge 189:f392fc9709a3 322 */
AnnaBridge 189:f392fc9709a3 323 void ticker_timer_data_save(void)
AnnaBridge 189:f392fc9709a3 324 {
AnnaBridge 189:f392fc9709a3 325 ticker_timer_cnt = TIMER_CNT(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 326 ticker_timer_ch0cv = TIMER_CH0CV(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 327 ticker_timer_dmainten = TIMER_DMAINTEN(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 328 }
AnnaBridge 189:f392fc9709a3 329
AnnaBridge 189:f392fc9709a3 330 /** restore ticker TIMER data when MCU go out deepsleep
AnnaBridge 189:f392fc9709a3 331 */
AnnaBridge 189:f392fc9709a3 332 void ticker_timer_data_restore(void)
AnnaBridge 189:f392fc9709a3 333 {
AnnaBridge 189:f392fc9709a3 334 TIMER_CNT(TICKER_TIMER) = ticker_timer_cnt;
AnnaBridge 189:f392fc9709a3 335 TIMER_CH0CV(TICKER_TIMER) = ticker_timer_ch0cv;
AnnaBridge 189:f392fc9709a3 336 TIMER_DMAINTEN(TICKER_TIMER) = ticker_timer_dmainten;
AnnaBridge 189:f392fc9709a3 337 }
AnnaBridge 189:f392fc9709a3 338
AnnaBridge 189:f392fc9709a3 339 /** Deinitialize the us ticker
AnnaBridge 189:f392fc9709a3 340 *
AnnaBridge 189:f392fc9709a3 341 * Powerdown the us ticker in preparation for sleep, powerdown, or reset.
AnnaBridge 189:f392fc9709a3 342 *
AnnaBridge 189:f392fc9709a3 343 * After this function is called, no other ticker functions should be called
AnnaBridge 189:f392fc9709a3 344 * except us_ticker_init(), calling any function other than init is undefined.
AnnaBridge 189:f392fc9709a3 345 *
AnnaBridge 189:f392fc9709a3 346 * @note This function stops the ticker from counting.
AnnaBridge 189:f392fc9709a3 347 */
AnnaBridge 189:f392fc9709a3 348 void us_ticker_free(void)
AnnaBridge 189:f392fc9709a3 349 {
AnnaBridge 189:f392fc9709a3 350 /* configure TIMER channel enable state */
AnnaBridge 189:f392fc9709a3 351 timer_channel_output_state_config(TICKER_TIMER, TIMER_CH_0, TIMER_CCX_DISABLE);
AnnaBridge 189:f392fc9709a3 352 /* configure TIMER primary output function */
AnnaBridge 189:f392fc9709a3 353 timer_primary_output_config(TICKER_TIMER, DISABLE);
AnnaBridge 189:f392fc9709a3 354 /* disable a TIMER */
AnnaBridge 189:f392fc9709a3 355 timer_disable(TICKER_TIMER);
AnnaBridge 189:f392fc9709a3 356
AnnaBridge 189:f392fc9709a3 357 us_ticker_disable_interrupt();
AnnaBridge 189:f392fc9709a3 358 }
AnnaBridge 189:f392fc9709a3 359
AnnaBridge 189:f392fc9709a3 360 /** get TIMER clock
AnnaBridge 189:f392fc9709a3 361 * @param timer_dev: TIMER device information structrue
AnnaBridge 189:f392fc9709a3 362 the structure is not necessary to be reconfigured after structrue initialization,
AnnaBridge 189:f392fc9709a3 363 the structure parameters altering is automatically configured by core
AnnaBridge 189:f392fc9709a3 364 * @return TIMER clock
AnnaBridge 189:f392fc9709a3 365 */
AnnaBridge 189:f392fc9709a3 366 static uint32_t timer_get_clock(uint32_t timer_periph)
AnnaBridge 189:f392fc9709a3 367 {
AnnaBridge 189:f392fc9709a3 368 uint32_t timerclk;
AnnaBridge 189:f392fc9709a3 369
AnnaBridge 189:f392fc9709a3 370 if ((TIMER0 == timer_periph) || (TIMER7 == timer_periph) ||
AnnaBridge 189:f392fc9709a3 371 (TIMER8 == timer_periph) || (TIMER9 == timer_periph) || (TIMER10 == timer_periph)) {
AnnaBridge 189:f392fc9709a3 372 /* get the current APB2 TIMER clock source */
AnnaBridge 189:f392fc9709a3 373 if (RCU_APB2_CKAHB_DIV1 == (RCU_CFG0 & RCU_CFG0_APB2PSC)) {
AnnaBridge 189:f392fc9709a3 374 timerclk = rcu_clock_freq_get(CK_APB2);
AnnaBridge 189:f392fc9709a3 375 } else {
AnnaBridge 189:f392fc9709a3 376 timerclk = rcu_clock_freq_get(CK_APB2) * 2;
AnnaBridge 189:f392fc9709a3 377 }
AnnaBridge 189:f392fc9709a3 378 } else {
AnnaBridge 189:f392fc9709a3 379 /* get the current APB1 TIMER clock source */
AnnaBridge 189:f392fc9709a3 380 if (RCU_APB1_CKAHB_DIV1 == (RCU_CFG0 & RCU_CFG0_APB1PSC)) {
AnnaBridge 189:f392fc9709a3 381 timerclk = rcu_clock_freq_get(CK_APB1);
AnnaBridge 189:f392fc9709a3 382 } else {
AnnaBridge 189:f392fc9709a3 383 timerclk = rcu_clock_freq_get(CK_APB1) * 2;
AnnaBridge 189:f392fc9709a3 384 }
AnnaBridge 189:f392fc9709a3 385 }
AnnaBridge 189:f392fc9709a3 386
AnnaBridge 189:f392fc9709a3 387 return timerclk;
AnnaBridge 189:f392fc9709a3 388 }