diff --git a/src/arch/msp430fr5969lp/arch.cc b/src/arch/msp430fr5969lp/arch.cc
index 8281e66f3fc9e3eb515730b5a3bdef40ee9f6ca4..aee46f30934b6f2f608fb9adfcc3de598f920c76 100644
--- a/src/arch/msp430fr5969lp/arch.cc
+++ b/src/arch/msp430fr5969lp/arch.cc
@@ -67,11 +67,24 @@ void Arch::setup(void)
 extern void wakeup();
 #endif
 
+#if defined(WITH_LOOP)
+extern void loop();
+volatile char run_loop = 0;
+#endif
+
 void Arch::idle_loop(void)
 {
 	while (1) {
 		__eint();
-		__bis_SR_register(LPM0_bits);
+		asm volatile("nop");
+		__bis_SR_register(LPM2_bits);
+		asm volatile("nop");
+#if defined(WITH_LOOP)
+		if (run_loop) {
+			loop();
+			run_loop = 0;
+		}
+#endif
 #ifdef WITH_WAKEUP
 		wakeup();
 #endif
@@ -83,13 +96,12 @@ Arch arch;
 #if defined(WITH_LOOP) || defined(TIMER_S)
 
 #include "driver/uptime.h"
-extern void loop();
 
 __attribute__((interrupt(TIMER1_A1_VECTOR))) __attribute__((wakeup)) void handle_timer0_overflow()
 {
 	if (TA1IV == 0x0e) {
 #ifdef WITH_LOOP
-		loop();
+		run_loop = 1;
 #endif
 #ifdef TIMER_S
 		uptime.tick_s();