隨著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()
測試結果
主頻
整數加法
乘法
除法
圓周率
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
80M
15.546
18.302
19.706
41.926
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。
評論
查看更多