;*************************************************************************** THUMB REQUIRE8 PRESERVE8 ;************************************************************************** ; Fichier Vierge.asm ; Auteur : V.MAHOUT ; Date : 12/11/2013 ;************************************************************************** ;***************IMPORT/EXPORT********************************************** EXPORT Set_SCLK EXPORT Reset_SCLK EXPORT DriverGlobal EXPORT Tempo ;************************************************************************** ;***************CONSTANTES************************************************* include REG_UTILES.inc ;************************************************************************** ;***************VARIABLES************************************************** AREA MesDonnees, data, readwrite ;************************************************************************** SCLK EQU 5 SIN1 EQU 7 MILSEC EQU 1304 PF DCD (1<<31) DataSend DCB 1 Barette1 DCB 0xad,0xff,0 DCB 0,0xff,0 DCB 0,0,0xff DCB 0xff,0,0 DCB 0xff,0xff,0 DCB 0xff,0xff,0xff DCB 0xff,0,0 DCB 0,0xff,0 DCB 0,0,0xff DCB 0xff,0,0 DCB 0xff,0xff,0 DCB 0xff,0xff,0xff DCB 0xff,0,0 DCB 0xff,0xff,0 DCB 0xff,0xff,0xff DCB 0x0f,0xff,0x00 ;************************************************************************** ;***************CODE******************************************************* AREA moncode, code, readonly ;************************************************************************** Set_SCLK PROC PUSH {R0-R2} ;On stocke R0 à R2 LDR R1,=GPIOBASEA ;R1 -> Adresse de GPIOA LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR ORR R2, R2,#(0x01 << 5) ;similaire à GPIOA->ODR |= (1<<5) STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR BX LR ;Retour ENDP Set_X PROC PUSH {R1,R2} ;On stocke R1 et R2 dans SP MOV R1, #1 ;******* LSL R0, R1, R0 ;1< Adresse de GPIOA LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR ORR R2, R2, R0 ;similaire à GPIOA->ODR |= (1< Adresse de GPIOA LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR AND R2, R2, R0 ;similaire à GPIOA->ODR &= ~(1< Adresse de GPIOA LDRH R2,[R1,#OffsetOutput] ;Valeur à l'adresse d'ODR : R2 = GPIOA->ODR AND R2, R2,#~(0x01 << 5) ;similaire à GPIOA->ODR &= ~(1<<5) STRH R2,[R1,#OffsetOutput] ;Etat du port B (R5) stocké dans ODR BX LR ;Retour ENDP Tempo PROC MOV R1,#10 ;******* MUL R0,R0,R1 ;10*Argument MOV R2,#MILSEC ;1304, la constante pour avoir 0.01ms MOV R3,#0 ;0 WHILE_NBMIL ;for(int i=0;i<10*Arg;i++) ADD R3,R3,#1 ;i++ MOV R1,#0 ;j=0 CMP R3,R0 ;SI i==10*Arg alors on arrête la boucle BXEQ LR WHILE_NOPL ;for(int j=0;j<1304;j++) NOP ;Timing ADD R1,R1,#1 ;j++ CMP R1,R2 ;SI j==1304 alors on arrête la sous-boucle BNE WHILE_NOPL ;NON : On retourne dans cette boucle B WHILE_NBMIL ;OUI : On retourne dans la surboucle ENDP ;**************************************************************************** ;R1 = *ValCourante ;R2 = NBLed (i) ;R3 = ValCourante[i] ;**************************************************************************** DriverGlobal PROC MOV R0, #SCLK ;Argument SCLK BL Set_X; ;Set_X(SCLK) LDR R1,=Barette1;On recupère l'adresse de base MOV R2, #0; ;************************* WHILE_NBLED ;for(int i=0;i<48;i++) LDRB R3,[R1,R2] ;ValCourante[i] LSL R3,#24 ;ValCourante[i]<<24 LDR R0,=PF LDR R5,[R0,#0] ;R5 = (1<<31) MOV R4, #0 ;************************* WHILE_NBBIT ;for(int j=0;j<12;j++) MOV R0, #SCLK ;Argument SCLK BL Reset_X; ;Reset_X(SCLK) MOV R0, #SIN1 ;Argument SIN1 AND R6,R3,R5 ;ValCourante[i] &= (1<<31) (<- PF) CMP R6,R5 ;if(PF == 1) BEQ PoidFortOKIF ;{ Set_X(SIN1) } BL Reset_X; ;else { Reset_X(SIN1) } PoidFortOKJUMP ;Fin Si LSL R3,#1 ;ValeurCourante[i]<<1 MOV R0, #SCLK ;Argument SCLK BL Set_X; ;Set_X(SCLK) ADD R4, R4, #1 ;On incrémente NBBit CMP R4, #11 ;SI NBBIT==11 alors on arrête la boucle BNE WHILE_NBBIT ADD R2, R2, #1 ;On incrémente NBLed CMP R2, #47 ;SI NBLED==47 alors on arrête la boucle BNE WHILE_NBLED MOV R0, #SCLK ;Argument SCLK BL Reset_X; ;Reset_X(SCLK) LDR R0,=DataSend;Adresse de DataSend MOV R1,#0 ; DataSend STRB R1,[R0,#0] ;DataSend=0 B . ;while(1) PoidFortOKIF BL Set_X ;Set_X(SCLK) B PoidFortOKJUMP ;After Reset8X ENDP ;************************************************************************** END