asmled.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # flash LED #1 using inline assembler
  2. # this version is overly verbose and uses word stores
  3. @micropython.asm_thumb
  4. def flash_led(r0):
  5. movw(r1, (stm.GPIOA + stm.GPIO_BSRRL) & 0xffff)
  6. movt(r1, ((stm.GPIOA + stm.GPIO_BSRRL) >> 16) & 0x7fff)
  7. movw(r2, 1 << 13)
  8. movt(r2, 0)
  9. movw(r3, 0)
  10. movt(r3, 1 << 13)
  11. b(loop_entry)
  12. label(loop1)
  13. # turn LED on
  14. str(r2, [r1, 0])
  15. # delay for a bit
  16. movw(r4, 5599900 & 0xffff)
  17. movt(r4, (5599900 >> 16) & 0xffff)
  18. label(delay_on)
  19. sub(r4, r4, 1)
  20. cmp(r4, 0)
  21. bgt(delay_on)
  22. # turn LED off
  23. str(r3, [r1, 0])
  24. # delay for a bit
  25. movw(r4, 5599900 & 0xffff)
  26. movt(r4, (5599900 >> 16) & 0xffff)
  27. label(delay_off)
  28. sub(r4, r4, 1)
  29. cmp(r4, 0)
  30. bgt(delay_off)
  31. # loop r0 times
  32. sub(r0, r0, 1)
  33. label(loop_entry)
  34. cmp(r0, 0)
  35. bgt(loop1)
  36. # flash LED #2 using inline assembler
  37. # this version uses half-word sortes, and the convenience assembler operation 'movwt'
  38. @micropython.asm_thumb
  39. def flash_led_v2(r0):
  40. # get the GPIOA address in r1
  41. movwt(r1, stm.GPIOA)
  42. # get the bit mask for PA14 (the pin LED #2 is on)
  43. movw(r2, 1 << 14)
  44. b(loop_entry)
  45. label(loop1)
  46. # turn LED on
  47. strh(r2, [r1, stm.GPIO_BSRRL])
  48. # delay for a bit
  49. movwt(r4, 5599900)
  50. label(delay_on)
  51. sub(r4, r4, 1)
  52. cmp(r4, 0)
  53. bgt(delay_on)
  54. # turn LED off
  55. strh(r2, [r1, stm.GPIO_BSRRH])
  56. # delay for a bit
  57. movwt(r4, 5599900)
  58. label(delay_off)
  59. sub(r4, r4, 1)
  60. cmp(r4, 0)
  61. bgt(delay_off)
  62. # loop r0 times
  63. sub(r0, r0, 1)
  64. label(loop_entry)
  65. cmp(r0, 0)
  66. bgt(loop1)
  67. flash_led(5)
  68. flash_led_v2(5)