nucleo version
Fork of PololuLedStrip by
led_strip_write_color.s
- Committer:
- DavidEGrayson
- Date:
- 2013-03-01
- Revision:
- 7:9a088f042ee0
- Parent:
- 6:9d0530b7dae2
- Child:
- 8:1578776ceac5
File content as of revision 7:9a088f042ee0:
AREA asm_func, CODE, READONLY EXPORT led_strip_write_color IMPORT led_strip_write_delays MACRO delay $id ldr r5, =led_strip_write_delays ldrb r5, [r5, $id] lsl r5, r5, #1 ldr r4, =delay_region_end sub r4, r4, r5 blx r4 MEND led_strip_write_color ; Register usage: ; These are the first 4 arguments to the method: ; R0: pointer to the color to send ; R1: pointer to the register for setting the pin ; R2: pointer to the register for clearing the pin ; R3: pin mask ; Additionally, we use these registers: ; R4: temporary register ; R5: temporary register ; R7: the number of bits we still need to send ; R12: shift register that holds the 24-bit color ; R13: Link Register, holds return addresses. push {r4, r5, r12, r7, lr} ; Push those registers so we can restore them later. ldr r12, [r0] ; Read the color. Now we have: xxBbGgRr rbit r12, r12 ; Reverse the order of the bits: rRgGbBxx rev r12, r12 ; Reverse the order of the bytes: xxbBgGrR mov r7, #24 ; Initialize the loop counter register. send_led_strip_bit str r3, [r1] ; Drive the line high. rrxs r12, r12 ; Rotate right through carry. delay #0 it cc ; If the bit to send it 0... strcc r3, [r2] ; Drive the line low. delay #1 it cs ; If the bit to send is 1... strcs r3, [r2] ; Drive the line low. delay #2 subs r7, r7, #1 ; Decrement the loop counter. bne send_led_strip_bit ; Send another bit if we have not reached zero. led_strip_asm_end pop {r4, r5, r12, r7, lr} bx lr delay_region ; The following is 128 nops. nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop delay_region_end bx lr ; return END