mbed library sources. With a patch for the can_api
Fork of mbed-dev by
Diff: targets/TARGET_STM/TARGET_STM32F1/us_ticker.c
- Revision:
- 150:02e0a0aed4ec
- Parent:
- 149:156823d33999
--- a/targets/TARGET_STM/TARGET_STM32F1/us_ticker.c Fri Oct 28 11:17:30 2016 +0100 +++ b/targets/TARGET_STM/TARGET_STM32F1/us_ticker.c Tue Nov 08 17:45:16 2016 +0000 @@ -38,7 +38,6 @@ volatile uint32_t SlaveCounter = 0; volatile uint32_t oc_int_part = 0; volatile uint16_t oc_rem_part = 0; -volatile uint16_t cnt_val = 0; void set_compare(uint16_t count) { @@ -59,15 +58,24 @@ uint32_t us_ticker_read() { - uint32_t counter; + uint32_t counter, counter2; if (!us_ticker_inited) us_ticker_init(); - - //Current value of TIM_MST->CNT is stored in cnt_val and is - //updated in interrupt context + // A situation might appear when Master overflows right after Slave is read and before the + // new (overflowed) value of Master is read. Which would make the code below consider the + // previous (incorrect) value of Slave and the new value of Master, which would return a + // value in the past. Avoid this by computing consecutive values of the timer until they + // are properly ordered. counter = (uint32_t)(SlaveCounter << 16); - counter += cnt_val; - - return counter; + counter += TIM_MST->CNT; + while (1) { + counter2 = (uint32_t)(SlaveCounter << 16); + counter2 += TIM_MST->CNT; + if (counter2 > counter) { + break; + } + counter = counter2; + } + return counter2; } void us_ticker_set_interrupt(timestamp_t timestamp)