Código de parpadeo de núcleo STM32L476RGTx en ensamblaje [Preguntas de novato]

    __initial_sp    EQU 0x20000800
                PRESERVE8 ;8byte alignment of the stack (required by ARM) 
                THUMB    ; will use THUMB2 instructions
                AREA    RESET, DATA, READONLY
__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                AREA    |.text|, CODE, READONLY 
                ENTRY   
Reset_Handler   PROC    
                LDR r1, =0x4002144C         ;address of RCC_AHBENR register 
                LDR r0, =0x1
                LDR r2, [r1]
                ORRS r2,r0,r2
                STR r2, [r1]

                LDR r1, =0x48000000         ;address of GPIOA_MODER register
                LDR r0, =0x400          ;configure PA5 as output
                LDR r2, [r1]
                ORRS r2,r0,r2
                STR r2, [r1]

                LDR r1, = 0x48000018            ;address of GPIOA_BSRR register 
                LDR r0, =0x20           ;pin 5 on GPIOA set 
                LDR r2, =0x200000       ;pin 5 on GPIOA clear 
loop
                STR r0, [r1]                
                STR r2, [r1]
                B  loop                 
                ENDP
                END

El código parpadea en la MCU (1 advertencia durante la compilación) pero el LED no parpadea. Al depurar ORRS r2, r0, r2 en GPIOA_MODER, aparece el indicador negativo en PSR y el valor no se carga en GPIOA_MODER. Lo mismo sucede con BSRR.

El LED está conectado a PA5.

Dos preguntas: ¿Cuál fue la advertencia? ¿Por qué no está escribiendo esto en C y utilizando los encabezados CMSIS proporcionados por ST que manejan toda la numeración de registros y las máscaras de bits por usted?
no tiene ningún sentido escribir el código ensamblador. Este uC está optimizado para el uso del compilador y apuesto a que escribirá peor código en ensamblador que la salida del compilador C
@P__J__ no es tan malo aprender a ensamblar, porque te encontrarás en la situación en la que tendrás que analizar el ensamblado generado por el compilador.

Respuestas (1)

Creo que te equivocaste en la dirección de registro RCC_AHB 2 ENR.

La dirección base se proporciona como 0x40021000, el desplazamiento es 0x4C. Entonces la dirección del registro es 0x4002104C y no 0x4002144C.

Entonces, en efecto, no habilita el reloj para el GPIOA, por lo tanto, no pasará nada (no he verificado esas direcciones).

Otra observación: su bucle no tiene retraso, el LED no parpadeará visiblemente para los humanos, ya que se encenderá y apagará en el rango de MHz. Se verá como a la mitad.

Lección: preste especial atención a los números mágicos (siempre), trate de usar símbolos predefinidos; luego, debe prestar especial atención solo una vez.


Siguiente error:

El registro del modo GPIO del puerto A tiene un valor de reinicio de 0xABFFFFFF. ORing otro 1 en eso no cambiará nada.

Primero debe restablecer los bits de configuración para el pin que desea cambiar.

Cambié la dirección, todavía no funciona
@V.Singh Actualicé mi respuesta con el siguiente error en su código.