chti23/git/PjtKEIL_StepSon/Src/GestionSon.s

113 lines
No EOL
1.8 KiB
ArmAsm

PRESERVE8
THUMB
include DriverJeuLaser.inc
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly
;Section RAM (read write):
area maram,data,readwrite
SortieSon dcw 0
Index dcd 0
Res dcw 719
export CallbackSon
export StartSon
extern Son
extern LongueurSon
extern TIM4
EXPORT SortieSon
EXPORT Index
; ===============================================================================================
;Section ROM code (read only) :
area moncode,code,readonly
; écrire le code ici
;int tab Son
;int index
;short sortieSon
;int callBack
; int decalage = 1<<15;
; double echelle = 719/(1<<16) //decalage*2
; if(index < LongueurSon) {
; sortieSon = (Son[index] +decalage)*echelle
;
; index += 1;
; }
; return sortieSon
;
StartSon proc
push {lr}
ldr r0,=Index
mov r1,#0
str r1,[r0]
pop {pc}
endp
;CallbackSon mov r0,=Son
CallbackSon proc
; On récupère l'adresse du tableau Son et de l'index
push {lr}
ldr r0,=Son
ldr r2,=Index
ldr r3,[r2]
; if(index < LongueurSon)
push {r0}
ldr r0,=LongueurSon
cmp r0, r2
bge exit
pop{r0}
; sortieSon = (Son[index] +decalage)*echelle
; On lit Son[index]
ldrsh r1, [r0,r3,lsl #1]
ldr r0,=SortieSon
;mise à echelle
push {r0,r2,r3}
; Variable décalage
mov r3,#1
lsl r0,r3,#15
add r1,r1,r0
;Calcul mise à l'échelle (719/2^16)
ldr r2,=Res
ldrh r2,[r2]
mul r1,r1,r2
lsr r1,r1,#16
pop {r0,r2,r3}
;fin mise à échelle
strh r1,[r0] ; On écrit cette valeur dans SortieSon
mov r0,r1
bl PWM_Set_Value_TIM3_Ch3
; index += 1;
add r3,r3,#1
str r3,[r2] ; On ajoute 2 à l'index
exit pop {pc}
endp
END