STM32L476RGTx Nucleo Blinkcode in der Baugruppe [Newbie Ques]

    __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

Der Code blinkt auf der MCU (1 Warnung während der Kompilierung), aber die LED blinkt nicht. Während des Debuggens von ORRS r2, r0, r2 im GPIOA_MODER wird das negative Flag im PSR angehoben und der Wert wird nicht in GPIOA_MODER geladen. Dasselbe passiert mit BSRR.

Die LED ist mit PA5 verbunden.

Zwei Fragen: Was war die Warnung? Warum schreiben Sie das nicht in C und verwenden die von ST bereitgestellten CMSIS-Header, die alle Registernummerierungen und Bitmasken für Sie handhaben?
Es macht keinen Sinn, den Assemblercode zu schreiben. Diese uC sind für die Compiler-Nutzung optimiert und ich wette, Sie werden in Assembler schlechteren Code schreiben als die Ausgabe des C-Compilers
@P__J__ es ist gar nicht so schlecht, Assembler zu lernen, denn Sie werden sich in der Situation wiederfinden, in der Sie die vom Compiler generierte Assembly analysieren müssen.

Antworten (1)

Ich glaube, Sie haben die RCC_AHB 2 ENR-Registeradresse falsch verstanden.

Die Basisadresse wird mit 0x40021000 angegeben, der Offset ist 0x4C. Die Adresse des Registers ist also 0x4002104C und nicht 0x4002144C.

Sie aktivieren also die Uhr nicht für GPIOA, daher wird nichts passieren (ich habe diese Adressen nicht überprüft).

Noch eine Anmerkung: Ihre Schleife hat keine Verzögerung, die LED blinkt nicht für Menschen sichtbar, da sie im MHz-Bereich ein- und ausgeschaltet wird. Es wird so aussehen, als wäre es halb fertig.

Lektion: Achten Sie besonders auf magische Zahlen (immer), versuchen Sie, vordefinierte Symbole zu verwenden - dann müssen Sie nur einmal besonders aufpassen.


Nächster Fehler:

Das GPIO-Modusregister von Port A hat einen Reset-Wert von 0xABFFFFFF. ORing eine andere 1 in das wird nichts ändern.

Sie müssen zuerst die Einstellungsbits für den Pin zurücksetzen, den Sie ändern möchten.

Ich habe die Adresse geändert, funktioniert immer noch nicht
@V.Singh Ich habe meine Antwort mit dem nächsten Fehler in Ihrem Code aktualisiert.