__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.
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.
Los Frijoles
0___________
Arsenal