From e03b6ec68895604597dcd9957c5261b42dc62f73 Mon Sep 17 00:00:00 2001
From: Daniele Cattaneo <daniele3.cattaneo@mail.polimi.it>
Date: Sat, 11 Mar 2023 22:35:30 +0100
Subject: [PATCH] Recalibrate delay loops for stm3220g-eval board when code is
 in XRAM.

CMSIS update improved FSMC configuration to use lower delays.

Signed-off-by: Terraneo Federico <fede.tft@miosix.org>
---
 .../interfaces-impl/delays.cpp                | 51 +++++++++----------
 1 file changed, 24 insertions(+), 27 deletions(-)

diff --git a/miosix/arch/cortexM3_stm32f2/stm32f207ig_stm3220g-eval/interfaces-impl/delays.cpp b/miosix/arch/cortexM3_stm32f2/stm32f207ig_stm3220g-eval/interfaces-impl/delays.cpp
index 956ee803..0b5161de 100644
--- a/miosix/arch/cortexM3_stm32f2/stm32f207ig_stm3220g-eval/interfaces-impl/delays.cpp
+++ b/miosix/arch/cortexM3_stm32f2/stm32f207ig_stm3220g-eval/interfaces-impl/delays.cpp
@@ -43,17 +43,17 @@ void delayMs(unsigned int mseconds)
     {
         // This delay has been calibrated to take 1 millisecond
         // It is written in assembler to be independent on compiler optimization
-        asm volatile("           mov   r1, #0     \n"
-                     "___loop_m: cmp   r1, %0     \n"
-                     "           itt   lo         \n"
-                     "           addlo r1, r1, #1 \n"
-                     "           blo   ___loop_m  \n"::"r"(count):"r1");
+        asm volatile("   mov   r1, #0     \n"
+                     "1: cmp   r1, %0     \n"
+                     "   itt   lo         \n"
+                     "   addlo r1, r1, #1 \n"
+                     "   blo   1b         \n"::"r"(count):"r1");
     }
 
     #else //__CODE_IN_XRAM
 
     #ifdef SYSCLK_FREQ_120MHz
-    register const unsigned int count=2662;
+    register const unsigned int count=4998;
     #else
     #warning "Delays are uncalibrated for this clock frequency"    
     #endif
@@ -62,13 +62,12 @@ void delayMs(unsigned int mseconds)
     {
         // This delay has been calibrated to take 1 millisecond
         // It is written in assembler to be independent on compiler optimization
-        asm volatile("           mov   r1, #0     \n"
-                     "___loop_m: cmp   r1, %0     \n"
-                     "           itt   lo         \n"
-                     "           addlo r1, r1, #1 \n"
-                     "           blo   ___loop_m  \n"::"r"(count):"r1");
+        asm volatile("   mov   r1, %0     \n"
+                     "   .align 2         \n" // <- important!
+                     "1: subs  r1, r1, #1 \n"
+                     "   bpl   1b         \n"::"r"(count):"r1");
     }
-    
+
     #endif //__CODE_IN_XRAM
 }
 
@@ -78,26 +77,24 @@ void delayUs(unsigned int useconds)
 
     // This delay has been calibrated to take x microseconds
     // It is written in assembler to be independent on compiler optimization
-    asm volatile("           mov   r1, #30    \n"
-                 "           mul   r2, %0, r1 \n"
-                 "           mov   r1, #0     \n"
-                 "___loop_u: cmp   r1, r2     \n"
-                 "           itt   lo         \n"
-                 "           addlo r1, r1, #1 \n"
-                 "           blo   ___loop_u  \n"::"r"(useconds):"r1","r2");
+    asm volatile("   mov   r1, #30    \n"
+                 "   mul   r2, %0, r1 \n"
+                 "   mov   r1, #0     \n"
+                 "1: cmp   r1, r2     \n"
+                 "   itt   lo         \n"
+                 "   addlo r1, r1, #1 \n"
+                 "   blo   1b         \n"::"r"(useconds):"r1","r2");
 
     #else //__CODE_IN_XRAM
 
     // This delay has been calibrated to take x microseconds
     // It is written in assembler to be independent on compiler optimization
-    asm volatile("           mov   r1, #2     \n"
-                 "           mul   r2, %0, r1 \n"
-                 "           mov   r1, #0     \n"
-                 "___loop_u: cmp   r1, r2     \n"
-                 "           nop              \n"
-                 "           itt   lo         \n"
-                 "           addlo r1, r1, #1 \n"
-                 "           blo   ___loop_u  \n"::"r"(useconds):"r1","r2");
+    asm volatile("   mov   r1, #5     \n"
+                 "   mul   r1, %0, r1 \n"
+                 "   sub   r1, r1, #1 \n"
+                 "   .align 2         \n" // <- important!
+                 "1: subs  r1, r1, #1 \n"
+                 "   bpl   1b      \n"::"r"(useconds):"r1");
     
     #endif //__CODE_IN_XRAM
 }
-- 
GitLab