135 lines
4.1 KiB
NASM
135 lines
4.1 KiB
NASM
|
|
|
|
;************************************************************************
|
|
THUMB
|
|
REQUIRE8
|
|
PRESERVE8
|
|
;************************************************************************
|
|
|
|
include REG_UTILES.inc
|
|
|
|
|
|
;************************************************************************
|
|
; IMPORT/EXPORT Système
|
|
;************************************************************************
|
|
|
|
IMPORT ||Lib$$Request$$armlib|| [CODE,WEAK]
|
|
|
|
|
|
|
|
|
|
; IMPORT/EXPORT de procédure
|
|
|
|
IMPORT Init_Cible
|
|
|
|
|
|
EXPORT main
|
|
|
|
;*******************************************************************************
|
|
|
|
|
|
;*******************************************************************************
|
|
AREA mesdonnees, data, readwrite
|
|
|
|
|
|
|
|
|
|
;*******************************************************************************
|
|
|
|
AREA moncode, code, readonly
|
|
|
|
|
|
|
|
;*******************************************************************************
|
|
; On eteint la LED
|
|
;*******************************************************************************
|
|
Eteint_LED PROC
|
|
|
|
PUSH {R12,R0} ;On stocke R12 dans R0
|
|
LDR R12,=GPIOBASEB ;On recupère l'adresse de base
|
|
MOV R5,#(0x01 << 10) ;1 décalé de 10 dans R5
|
|
STRH R5,[R12,#OffsetReset] ;On stocke la variable R5 à l'adresse 0x0X40010C14 (reset)
|
|
POP {R12,R0} ;On restitue R12 dans R0
|
|
BX LR ;Retour
|
|
;LDR R5,[R12,#0x0C] ;Valeur à l'adresse de l'output
|
|
;AND R5, R5,#~(0x01 << 10) ;OU LOGIQUE pour calculer la valeur a mettre dans l'output
|
|
;STRH R5,[R12,#0x0C] ;Etat du port B (R5) stocké dans l'output
|
|
ENDP
|
|
|
|
;*******************************************************************************
|
|
; On allume la LED
|
|
;*******************************************************************************
|
|
Allume_LED PROC
|
|
|
|
PUSH {R12,R0} ;On stocke R12 dans R0
|
|
LDR R12,=GPIOBASEB ;On recupère l'adresse de base
|
|
MOV R5,#(0x01 << 10) ;1 décalé de 10 dans R5
|
|
STRH R5,[R12,#OffsetSet] ;On stocke la variable R5 à l'adresse 0x0X40010C10 (set)
|
|
POP {R12,R0} ;On restitue R12 dans R0
|
|
BX LR ;Retour
|
|
;LDR R5,[R12,#0x0C] ;Valeur à l'adresse de l'output
|
|
;ORR R5, R5,#(0x01 << 10) ;OU LOGIQUE pour calculer la valeur a mettre dans l'output
|
|
;STRH R5,[R12,#0x0C] ;Etat du port B (R5) stocké dans l'output
|
|
|
|
ENDP
|
|
|
|
;*******************************************************************************
|
|
; On inverse la LED (besoin de R3)
|
|
;*******************************************************************************
|
|
Inverse_LED PROC
|
|
PUSH {R12,R0} ;On stocke R12 dans R0
|
|
LDR R12,=GPIOBASEB ;On recupère l'adresse de base
|
|
MOV R5,#(0x01 << 10) ;1 décalé de 10 dans R5
|
|
CMP R3,#0 ;Si R3=0 (default) alors on allume, sinon on eteint
|
|
;BEQ Allume
|
|
;B Eteint
|
|
BNE Eteint
|
|
Allume
|
|
STRH R5,[R12,#OffsetSet] ;On stocke la variable R5 à l'adresse 0x0X40010C10 (set)
|
|
MOV R3,#1; ;On remet la variable à 1
|
|
B Fin ;Retour
|
|
Eteint
|
|
STRH R5,[R12,#OffsetReset] ;On stocke la variable R5 à l'adresse 0x0X40010C14 (reset)
|
|
MOV R3,#0; ;On remet la variable à 0
|
|
B Fin
|
|
|
|
|
|
Fin
|
|
POP {R12,R0} ;On restitue R12 dans R0
|
|
BX LR ;Retour
|
|
|
|
|
|
;*******************************************************************************
|
|
; Procédure principale et point d'entrée du projet
|
|
;*******************************************************************************
|
|
main PROC
|
|
;*******************************************************************************
|
|
|
|
|
|
BL Init_Cible;
|
|
MOV R0,#0;
|
|
MOV R1,#0;
|
|
MOV R3,#0;
|
|
Boucle
|
|
LDR R12,=GPIOBASEA ;On récup l'adresse du GPIOA
|
|
LDR R0,[R12,#OffsetInput] ;On charge sa valeur avec l'OffsetInput
|
|
AND R0, R0, #(0x01 << 8) ;R0 est masqué pour n'avoir que le bit de l'offset input
|
|
CMP R0, #(0x01 << 8) ;On compare R0 doit etre egal à 1 pour le front montant
|
|
BNE Is_detect ;On allume
|
|
MOV R1,R0 ;R1 possède la valeur de R0 avant
|
|
BL Boucle ;Sinon on boucle
|
|
|
|
Is_detect
|
|
CMP R1, #(0x01 << 8) ;R1 doit etre egal à 0 pour le front montant
|
|
BNE Boucle
|
|
|
|
T_Oui
|
|
BL Inverse_LED ;On inverse le status de la led grace a R3
|
|
B Boucle
|
|
|
|
B . ; boucle inifinie terminale...
|
|
ENDP
|
|
|
|
END
|
|
|
|
;*******************************************************************************
|