Help with blinking 3LEDs in Assembly

Hello,
I am trying to use assembly example given in the forum in order to blink 3 LEDs together, but so far only one of the LEDs work. Could you please give advice on proper register setting in my code?

void setup() {
    asm volatile(
    "mov r0, %[led2] \n\t" 
    "mov r1, #150999040     \n\t"
    "str r1, [r0]   \n\t" : : [led] "r" (&REG_PIOB_OER), [led2] "r" (&REG_PIOB_OER)
  );
}
 
void loop() {

    asm volatile(
      "push {r0-r3, lr}   \n\t" 
      "mov r0, %[led_set] \n\t" 
      "mov r1, #1         \n\t" 
      "lsl r1, #27        \n\t" 
      "str r1, [r0]       \n\t"
      "mov r0, #100      \n\t"
      "bl delay           \n\t"
      "mov r0, %[led_clr] \n\t"
      "mov r1, #1         \n\t"
      "lsl r1, #27        \n\t"
      "str r1, [r0]       \n\t"
      "mov r0, #100      \n\t"
      "bl delay           \n\t"
      "pop {r0-r3, lr}    \n\t"
      "bx lr              \n\t"
      : : [led_set] "r" (&REG_PIOB_SODR), [led_clr] "r" (&REG_PIOB_CODR)
    );
}

This example sketch should work for blinking 3 LEDs (PB25,26,27, not tested though):

/********************************************************/
/*  Blink 3 LEDs  PB25(pin 2),PB26(pin 1),PB27(pin 13)  */
/********************************************************/
void setup() {

  asm volatile(
    "mov r0, %[led] \n\t"
    "mov r1,#(0b111 << 25)         \n\t"
    "str r1, [r0]   \n\t"
    :
    : [led] "r" (&REG_PIOB_OER)
    :
  );

}

void loop() {

  asm volatile(
    "mov r1,#(0b111 << 25)         \n\t"
    "loopA:             \n\t"
    "mov r0, %[led_set] \n\t"
    "str r1, [r0]       \n\t"
    "mov r0, #1000      \n\t"
    "bl delay           \n\t"

    "mov r0, %[led_clr] \n\t"
    "str r1, [r0]       \n\t"
    "mov r0, #1000      \n\t"
    "bl delay           \n\t"
    "b loopA            \n\t"
    : 
    : [led_set] "r" (&REG_PIOB_SODR), [led_clr] "r" (&REG_PIOB_CODR)
    :
  );

}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.