3025|0

440

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【翻译】Micropy 官方教程 10 嵌入汇编 [复制链接]

 
10 .嵌入汇编
本篇教程将学习如何在 MicroPython 里边嵌入汇编语言。
注意:本篇教程属于进阶教程,用户最好知道了解处理器结构和汇编语言的相关知识。
MicroPython 包涵可内联的汇编,允许用户使用汇编语言作为 Python 的子程序,且你可以像正常使用函数般使用它们。

10.1 返回值
内联汇编函数用特定的函数装饰器标示。我们从最简单的例子下手:
  1. @micropython.asm_thumb
  2. def fun():
  3.     movw(r0, 42)
复制代码

你可以在脚本或是解释器里边使用该函数。该函数没有任何参数且返回数值42 。r0 是一个寄存器,其中的数值在函数返回值返回时被更改。MicroPython 一直将 r0视为一个整数并将其作为整数变量供使用者调用。
如果使用了命令 print(fun( )) 将能看到数值42被打印出来。

10.2 汇编语言基础
稍微复杂一些些,我们尝试点亮一盏灯:
  1. @micropython.asm_thumb
  2. def led_on():
  3.     movwt(r0, stm.GPIOA)
  4.     movw(r1, 1 << 13)
  5.     strh(r1, [r0, stm.GPIO_BSRRL])
复制代码

上述代码使用了一些新的概念:
. stm 为 pyboard 的微处理器提供了一系列内容以便于连接寄存器。尝试在 REPL 里运行 import stm 和 help(stm) 。这将得到一清单的有用内容:
. stm.GPIOA 对应外围设备GPIOA 在内存中的地址。在 pyboard 板上红色的led 灯对应 A端口,PA13 引脚;
. movwt 将32位数值放入寄存器中。其可视为由两个指令集组成的简便函数:先是 movw 然后 movt 。movt 将16位立即数移 动。
.strh 存储半字数据。上述代码里将r1的低16位数值存入 r0 +stm.GPIO_BSRRL 的内存地址中。这将按照 r0 里设定的数值将 A 端口对应的引脚设置为高。例程中r0的第13位值被置位,故PA13 被拉高。因此红色LED 灯被点亮。

10.3 接受参数
内联汇编语言最多可以接收四个参数。一旦被使用,必须为 r0,r1,r2,r3 的寄存器或其里边的调用内容。
以下是使用了这些参数的函数:
  1. @micropython.asm_thumb
  2. def asm_add(r0, r1):
  3.     add(r0, r0, r1)
复制代码

这里使用了 r0=r0+r1 的计算。由于将结果放入了 r0 中,故其为返回结果。尝试运行asm(1,2),将能得到 3 的返回值。

10.4 循环
我们可以分配 label(my_label)的标号,然后使用 b(my_label) 跳转到该分支,或者用 bgt(my_lable)进行有条件的跳转。
下面例程使绿色的 LED 灯闪烁,闪烁次数存放在 r0 里边。
  1. @micropython.asm_thumbdef flash_led(r0):
  2.     # get the GPIOA address in r1
  3.     movwt(r1, stm.GPIOA)

  4.     # get the bit mask for PA14 (the pin LED #2 is on)
  5.     movw(r2, 1 << 14)

  6.     b(loop_entry)

  7.     label(loop1)

  8.     # turn LED on
  9.     strh(r2, [r1, stm.GPIO_BSRRL])

  10.     # delay for a bit
  11.     movwt(r4, 5599900)
  12.     label(delay_on)
  13.     sub(r4, r4, 1)
  14.     cmp(r4, 0)
  15.     bgt(delay_on)

  16.     # turn LED off
  17.     strh(r2, [r1, stm.GPIO_BSRRH])

  18.     # delay for a bit
  19.     movwt(r4, 5599900)
  20.     label(delay_off)
  21.     sub(r4, r4, 1)
  22.     cmp(r4, 0)
  23.     bgt(delay_off)

  24.     # loop r0 times
  25.     sub(r0, r0, 1)
  26.     label(loop_entry)
  27.     cmp(r0, 0)
  28.     bgt(loop1)
复制代码

10.5 进一步扩展
更多内联汇编指令可以参考: reference documentation


赞赏

1

查看全部赞赏

点赞 关注
个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表