# blink.s - Parpadeo en ensamblador # Acceso al controlador del PIO B .syntax unified .cpu cortex-m3 .text .align 2 .thumb .thumb_func .extern delay @ No es necesario .global blink @ Función externa .type blink, %function .equ PIOB, 0x400E1000 @ Dir. base del puerto B .equ SODR, 0x030 @ OFFSET Set Output Data Reg .equ CODR, 0x034 @ OFFSET Clear Output Data Reg .equ CHIPID, 0x400E0940 @ Registro CHIP ID .equ LEDMSK, 0x08000000 @ El LED está en el pin 27 /* int blink(int times, int delay) r0 = times. Número de veces que parpadea r1 = delay. Retardo del parpadeo Devuelve el CHIP_ID, porque sí Los parámetros se pasan en r0-r3 El valor devuelto en r0 ó r0-r1 si ocupa 8 bytes Cualquier función puede modificar r0-r3 El resto se han de preservar */ blink: push {r4-r7, lr} @ Vamos a usar de r4 a r7 @ porque llamamos a delay mov r4, r0 @ r4 contiene el número de veces mov r5, r1 @ r5 contiene el retardo a pasar a delay ldr r6, =PIOB @ Dirección base del Controlador PIO B ldr r7, =LEDMSK @ Máscara con el bit 27 a 1 (pin del LED) principio: str r7, [r6, #SODR] @ Encendemos el LED escribiendo en SET mov r0, r5 @ Preparamos el parámetro de delay en r0 bl delay @ Invocamos a la función delay str r7, [r6, #CODR] @ Apagamos el LED escribiendo en CLEAR mov r0, r5 @ Volvemos a llamar a delay como antes bl delay subs r4, r4, #1 @ Decrementamos el número de veces bne principio @ y si no es cero seguimos. ¡Ojo a la s! ldr r6, =CHIPID @ Leemos CHIPID_CIDR ldr r0, [r6] @ y devolvemos el valor en r0 pop {r4-r7, pc} @ ret con pop al pc. .end