8721087661
Improved the Thumb assembler back end. Added many more Thumb instructions to the inline assembler. Improved parsing of assembler instructions and arguments. Assembler functions can now be passed the address of any object that supports the buffer protocol (to get the address of the buffer). Added an example of how to sum numbers from an array in assembler.
86 lines
1.6 KiB
Python
86 lines
1.6 KiB
Python
# flash LED #1 using inline assembler
|
|
# this version is overly verbose and uses word stores
|
|
@micropython.asm_thumb
|
|
def flash_led(r0):
|
|
movw(r1, (stm.GPIOA + stm.GPIO_BSRRL) & 0xffff)
|
|
movt(r1, ((stm.GPIOA + stm.GPIO_BSRRL) >> 16) & 0x7fff)
|
|
movw(r2, 1 << 13)
|
|
movt(r2, 0)
|
|
movw(r3, 0)
|
|
movt(r3, 1 << 13)
|
|
|
|
b(loop_entry)
|
|
|
|
label(loop1)
|
|
|
|
# turn LED on
|
|
str(r2, [r1, 0])
|
|
|
|
# delay for a bit
|
|
movw(r4, 5599900 & 0xffff)
|
|
movt(r4, (5599900 >> 16) & 0xffff)
|
|
label(delay_on)
|
|
sub(r4, r4, 1)
|
|
cmp(r4, 0)
|
|
bgt(delay_on)
|
|
|
|
# turn LED off
|
|
str(r3, [r1, 0])
|
|
|
|
# delay for a bit
|
|
movw(r4, 5599900 & 0xffff)
|
|
movt(r4, (5599900 >> 16) & 0xffff)
|
|
label(delay_off)
|
|
sub(r4, r4, 1)
|
|
cmp(r4, 0)
|
|
bgt(delay_off)
|
|
|
|
# loop r0 times
|
|
sub(r0, r0, 1)
|
|
label(loop_entry)
|
|
cmp(r0, 0)
|
|
bgt(loop1)
|
|
|
|
# flash LED #2 using inline assembler
|
|
# this version uses half-word sortes, and the convenience assembler operation 'movwt'
|
|
@micropython.asm_thumb
|
|
def flash_led_v2(r0):
|
|
# get the GPIOA address in r1
|
|
movwt(r1, stm.GPIOA)
|
|
|
|
# get the bit mask for PA14 (the pin LED #2 is on)
|
|
movw(r2, 1 << 14)
|
|
|
|
b(loop_entry)
|
|
|
|
label(loop1)
|
|
|
|
# turn LED on
|
|
strh(r2, [r1, stm.GPIO_BSRRL])
|
|
|
|
# delay for a bit
|
|
movwt(r4, 5599900)
|
|
label(delay_on)
|
|
sub(r4, r4, 1)
|
|
cmp(r4, 0)
|
|
bgt(delay_on)
|
|
|
|
# turn LED off
|
|
strh(r2, [r1, stm.GPIO_BSRRH])
|
|
|
|
# delay for a bit
|
|
movwt(r4, 5599900)
|
|
label(delay_off)
|
|
sub(r4, r4, 1)
|
|
cmp(r4, 0)
|
|
bgt(delay_off)
|
|
|
|
# loop r0 times
|
|
sub(r0, r0, 1)
|
|
label(loop_entry)
|
|
cmp(r0, 0)
|
|
bgt(loop1)
|
|
|
|
flash_led(5)
|
|
flash_led_v2(5)
|