在NUCLEO_H743上玩MicroPython

H743 mpy
shaoziyang
发布时间: 2018-08-24
阅读: 2589
随着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下载到芯片,就可以运行了。固件的下载地址是:


下载可以使用STM32 ST-LINK Utility,通过板载的ST-Link/v2,将HEX文件下载到芯片。下载后,就可以运行micropythhon了。


在使用前,我们需要准备两根microUSB数据线(安卓手机的数据线),以及串口终端软件,如putty、kitty、MobaXterm等。注意不能使用串口助手之类的软件,因为它们不支持终端模式。


为什么需要两个数据线呢?因为ST-Link需要使用一个数据线,而开发板上的STM32H743的USB可以接入另外一个USB。写入固件后,先断电一次,然后连接ST-Link,再连接另外一边的用户USB。如果一切操作步骤正常,这时就会显示一个pybflash磁盘,我们可以往这个磁盘中写入文件,运行编写好的程序。默认情况下,会从main.py文件开始运行,所以我们可以将编写的程序放入main.py,让它自动运行。


01.jpg


如果是win10或者macos、Linux系统,无需安装任何驱动,如果是win7系统,还需要安装一个串口驱动,驱动程序就在这个PYBFLASH磁盘中。安装后,我们可以看到有两个串口,一个是ST-Link的串口,另外一个就是MicroPython的串口了。


02.jpg


运行一个终端软件,串口可以设置为上面两个串口中的任何一个,并设置波特率是115200,流量控制选择None。下面以kitty软件为例,其它软件的使用也是类似的:


03.jpg


04.jpg


设置好参数后,点 open 按钮,就可以打开终端了。按下回车键,如果出现>>>提示,就代表运行成功了。这时按下ctrl-B键,就可以看到版本提示。


05.jpg


按照习惯,我们先从点灯开始。在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_time

def 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。



更多关于MicroPython的使用方法,可以参考《MicroPython入门指南》一书。







原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (0)
shaoziyang
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)