随着micropython 1.9.4版本的发布,micropython开始正式支持stm32h7微控制器。stm32h7作为目前stm32 cotex-m系列控制器中性能最高的系列,micropython在它上面的表现如何呢?和其它型号相比,有什么优势?下面我们就在nucelo_h743开发板上,看看micropython的表现。
从 1.9.4版开始,micropython在支持的开发板中增加了nucleo-h743zi开发板,不过官网上并没有提供开发板的二进制固件文件,要运行micropython就需要自己编译源码。如果安装过micropyhon编译环境,那么只要在micropython目录下,输入下面命令进行编译:
make -c ports/stm32 board=nucleo_h743zi
如果没有安装编译环境,可以参考另外一篇文章《在win10的ubuntu子系统下编译micropython》,按照文中的方法就可以安装编译环境。这个方法也可以用于其它虚拟机,或者ubuntu系统。
如果觉得安装编译环境太麻烦,或者网速太慢安装不了,可以直接下载我编译好的固件,将固件通过板载的stlink下载到芯片,就可以运行了。
在使用前,我们需要准备两根microusb数据线(安卓手机的数据线),以及串口终端软件,如putty、kitty、mobaxterm等。注意不能使用串口助手之类的软件,因为它们不支持终端模式。
为什么需要两个数据线呢?因为st-link需要使用一个数据线,而开发板上的stm32h743的usb可以接入另外一个usb。写入固件后,先断电一次,然后连接st-link,再连接另外一边的用户usb。如果一切操作步骤正常,这时就会显示一个pybflash磁盘,我们可以往这个磁盘中写入文件,运行编写好的程序。默认情况下,会从main.py文件开始运行,所以我们可以将编写的程序放入main.py,让它自动运行。
如果是win10或者macos、linux系统,无需安装任何驱动,如果是win7系统,还需要安装一个串口驱动,驱动程序就在这个pybflash磁盘中。安装后,我们可以看到有两个串口,一个是st-link的串口,另外一个就是micropython的串口了。
运行一个终端软件,串口可以设置为上面两个串口中的任何一个,并设置波特率是115200,流量控制选择none。下面以kitty软件为例,其它软件的使用也是类似的:
设置好参数后,点open按钮,就可以打开终端了。按下回车键,如果出现>>>提示,就代表运行成功了。这时按下ctrl-b键,就可以看到版本提示。
按照习惯,我们先从点灯开始。在micropython中,默认定义了led类型,我们可以通过pyb.led进行控制,如:
pyb.led(1).on()pyb.led(1).off()
因为nucleo_h743开发板上有3个led,所以我们也可以使用它们做一个跑马灯:
while 1: for i in range(1, 4): pyb.led(i).toggle() pyb.delay(500) pyb.led(i).toggle() pyb.delay(500)
按键的使用也非常容易,micropython中有一个内置的switch类,可以用来读取按键。下面的程序通过按键来控制led1的状态:
sw=pyb.switch()sw()while 1: if sw(): pyb.led(1).on() else: pyb.led(1).off()
定时器也是我们在编程时最常用的功能之一,下面的程序中,分别在定时器6和定时器7的回调函数中控制led1和led3,并使用不同的频率闪烁。
tm = pyb.timer(6, freq=2)tm.callback(lambda t: pyb.led(1).toggle())tm2 = pyb.timer(7, freq=5)tm2.callback(lambda t: pyb.led(3).toggle())虽然stm32h743有22个定时器,但是micropython目前只支持到定时器14,超过14的定时器可以定义,但是一旦使用就会死机。
pwm也是很常用的功能,它是通过定时器控制gpio实现的,是定时器的一种特殊工作模式。下面是在micropython中使用pwm的方法,下面程序通过定时器3的ch3控制led1(pb0),通过周期改变占空比实现了一个呼吸灯。
tm = pyb.timer(3, freq=1000)pwm = tm.channel(3, mode=pyb.timer.pwm, pin=pyb.pin('b0'))pwm.pulse_width_percent(20)while 1: for i in range(100): pwm.pulse_width_percent(i) pyb.delay(20)
stm32h743带有两路dac,分别是pa4和pa5,通过dac我们可以输出模拟电压、产生各种波形。如下面分别使用8位(默认情况)和12位方式控制dac的输出:
d1 = pyb.dac(1)d1.write(100)d1 = pyb.dac(1, 12)d1.write(3000)
除了直接输出模拟电压,也可以输出不同波形:
三角波
d1.triangle(2048)
白噪声
d1.noise(1000)
还可以输出预定义的用户波形。利用这个特点和stm32h7的高速特性,完全可以将它作为一个简易的波形发生器。
micropython还有很多功能,这里就不一一介绍了,大家可以自己运行一下,体验micrpython带来的方便。
最后,为了测试micropython在stm32h743上的性能,我们做了一个计算性能对比测试,在不同的硬件平台上,进行加法、乘法、除法、圆周率计算,并记录下计算消耗的时间。通过不同硬件计算时间的对比,就可以直观的比较性能了(这可能是目前最全面的micropython计算性能对比测试,将目前常见的硬件都包括了)。
完整的测试程序
from microbit import running_timedef pi(places=100): # 3 + 3*(1/24) + 3*(1/24)*(9/80) + 3*(1/24)*(9/80)*(25/168) # the numerators 1, 9, 25, ... are given by (2x + 1) ^ 2 # the denominators 24, 80, 168 are given by (16x^2 -24x + 8) extra = 8 one = 10 ** (places+extra) t, c, n, na, d, da = 3*one, 3*one, 1, 0, 0, 24 while t > 1: n, na, d, da = n+na, na+8, d+da, da+32 t = t * n // d c += t return c // (10 ** extra)def pi_test(n=5000): t1=running_time() t=pi(n) t2=running_time() print('pi test: ', (t2-t1)/1000, 's')def add_test(n=1000000, a = 1234, b = 5678): t1=running_time() sum = 0 for i in range(n): sum = a + b t2=running_time() print('add test: ', (t2-t1)/1000, 's')def mul_test(n=1000000, a = 1234, b = 5678): t1=running_time() sum = 0 for i in range(n): sum = a * b t2=running_time() print('mul test: ', (t2-t1)/1000, 's')def div_test(n=1000000, a = 1234, b = 5678): t1=running_time() sum = 0 for i in range(n): sum = a / b t2=running_time() print('div test: ', (t2-t1)/1000, 's')print('speed test starting...')add_test()add_test()mul_test()mul_test()div_test()div_test()pi_test()pi_test()
测试结果
mcu
主频
整数加法
乘法
除法
圆周率
microbit
nrf51822
16m
61.888
74.075
103.935
nucleo_f091
stm32f091
48m
19.882
25.89
51.78
82.851
pybnano
stm32f401
84m
6.959
7.222
12.524
18.236
nucleo_f411
stm32f411
96m
5.858
6.076
10.478
16.467
pybv10
stm32f405
168m
3.436
3.563
6.067
10.18
stm32l476disc
stm32l476
80m
8.586
8.989
14.913
18.932
stm32f7disc
stm32f746
192m
1.946
2.304
3.68
4.579
nucleo_h743
stm32h743
400m
0.856
0.942
1.534
2.835
esp8266
esp8266
80m
15.546
18.302
19.706
41.926
esp32
esp32
240m
2.607
2.794
3.839
7.729
esp32_psram
esp32
240m
3.365
3.553
18.902
15.012
esp32_lobo
esp32
240m
3.396
3.499
13.02
9.607
esp32_psram_lobo
esp32
240m
4.228
4.15
18.902
18.757
计算结果的单位是秒
所有固件都更新到最新版本,除了microbit、esp32 lobo外,固件版本都是1.9.4-479。
利用串行RapidIO实现FPGA协处理
以新模式赋能高速发展 共享经济传播第一人石宙灵提供新解法
智慧交通高速公路高清雷达测速仪的介绍
NVIDIA GPU助力复亚智能为无人机行业应用赋能
安达发|APS系统帮助家具行业建立精益生产计划
在NUCLEO_H743上玩MicroPython
厉害了我的华为p10能和小米5s飚性能,又能和iPhone7Plus比双摄像头
Note7噩梦空前:三星的表现反而逆天了?低价的note7是否能救三星?
基于RFID AS3990芯片的超高频手持读写器设计
如何利用单片机PWM实现各种波的输出呢?
Digi-Key Electronics与Option和GetWireless合作为其所有现场员工部署安全距离保持解决方案
HTC VIVE推出一大批AR与VR硬件设备
人工智能会威胁我们在地球的地位吗
vivo X9s质量怎么样?vivo X9s真机拆解教程
对于云计算领域来说 2019年是具有标志性的一年
新型的电力负荷控制与监测系统的设计
GE公布CEO人选,股价迎来难得的上扬
cfo是什么意思
炬芯周正宇博士出席2022中国IC领袖峰会发表主题演讲
翎翔余压监控系统借助物联网让火灾防控变得更科学