summaryrefslogtreecommitdiffstatshomepage
path: root/examples/asmled.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-12 18:27:23 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-12 18:27:23 +0100
commit71dcd5198944b59f8f69e4027032f8ef0346eabf (patch)
tree3e9f74eb329c6e15b1a86f56bfe7467011a021e0 /examples/asmled.py
parent6ce427755112c28f8a7efab65d329205d833f623 (diff)
downloadmicropython-71dcd5198944b59f8f69e4027032f8ef0346eabf.tar.gz
micropython-71dcd5198944b59f8f69e4027032f8ef0346eabf.zip
examples: Add example script to flash an LED using inline assembler.
Diffstat (limited to 'examples/asmled.py')
-rw-r--r--examples/asmled.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/examples/asmled.py b/examples/asmled.py
new file mode 100644
index 0000000000..e0d6c73ce4
--- /dev/null
+++ b/examples/asmled.py
@@ -0,0 +1,81 @@
+# flash LED #1 using inline assembler
+@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)
+ subs(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)
+ subs(r4, r4, 1)
+ cmp(r4, 0)
+ bgt(delay_off)
+
+ # loop r0 times
+ subs(r0, r0, 1)
+ label(loop_entry)
+ cmp(r0, 0)
+ bgt(loop1)
+
+# flash LED #1 using inline assembler
+# this version uses the convenience assembler operation 'movwt'
+@micropython.asm_thumb
+def flash_led_v2(r0):
+ movwt(r1, stm.GPIOA + stm.GPIO_BSRRL)
+ movwt(r2, 1 << 13)
+ movwt(r3, 1 << (16 + 13))
+
+ b(loop_entry)
+
+ label(loop1)
+
+ # turn LED on
+ str(r2, r1, 0)
+
+ # delay for a bit
+ movwt(r4, 5599900)
+ label(delay_on)
+ subs(r4, r4, 1)
+ cmp(r4, 0)
+ bgt(delay_on)
+
+ # turn LED off
+ str(r3, r1, 0)
+
+ # delay for a bit
+ movwt(r4, 5599900)
+ label(delay_off)
+ subs(r4, r4, 1)
+ cmp(r4, 0)
+ bgt(delay_off)
+
+ # loop r0 times
+ subs(r0, r0, 1)
+ label(loop_entry)
+ cmp(r0, 0)
+ bgt(loop1)
+
+flash_led_v2(5)