mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

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)