MicroPython基礎知識總匯


MicroPython的系統結構

MicroPython系統的經典結構由三部分組成,分別是微控制器硬件、MicroPython固件、用戶程序

MicroPython支持的其它類型開發板,需要自己編譯源代碼,產生固件,並將固件下載到微控制器中才能運行MicroPython。(此內容我們后面會講解到,千萬別好高騖遠!)

MicroPython連接電腦

STM32微控制器的pyboard系列的開發板,通常都是帶有原生USB 功能的開發板,在通過USB連接計算機后,默認情況下會出現兩個設備:

  1. 虛擬磁盤(MSD)
  2. 虛擬串口(USB Comm Port)

Windows系統的設備管理器中顯示的pyboard設備

虛擬磁盤設備可自動被系統識別出來,就想普通的U盤一樣,無論是Windows、Linux、MacOS,都會識別出一個可移動磁盤設備。如圖虛擬磁盤和串口顯示了Windows系統的設備管理器中發現的uPy microSD Flash USB Device磁盤設備。(如圖:虛擬磁盤里面默認的四個文件

pyboard虛擬磁盤

如圖虛擬磁盤的卷標是“PYBFLASH”,里面默認有4個文件。這個虛擬磁盤可以像普通的U盤一樣使用,能夠復制文件,存放程序和數據。我們可以將編寫好的 Python 程序直接復制運行,系統復位后默認從 boot.py 加載基本參數,然后從main.py開始運行。(如圖:虛擬磁盤里面默認的四個文件

pyboardUSB串口

正常情況下,串口識別出來后系統會多出一個pyboard USB Comm Port設備,具體的串口號與計算機已安裝的其他設備有關。(如圖:虛擬磁盤和串口)

虛擬磁盤里面pybcdc.inf文件有什么作用?

在Windows10、Linux、MacOS操作系統上(包括32位和64位操作系統),虛擬串口會自動識別,無須安裝額外的驅動。但是在Win10以下的系統中,虛擬串口需要安裝一個設備驅動文件才能被正確識別和使用。MicroPython的作者使用了一個非常巧妙的方法,將這個驅動文件放在了自帶的虛擬磁盤中(文件名是pybcdc.inf),這樣不用到網上下載就能直接安裝了,非常方便。(如圖:虛擬磁盤里面默認的四個文件

注:什么是原生USB功能?

串口是指利用串行方式傳輸數據的接口,它是一大類接口,USB接口、RS232接口、網線RJ45接口、RS485接口、SATA接口等等都屬於串口。各種串口之間的通訊協議、接口電平等並不完全相同,因此有一種串口得到另一種串口時需要轉換。一般來說,串口默認是指RS232接口,所謂的USB轉串口實際上就是USB轉RS232裝置。USB接口隸屬於串口。而所謂原生,指的是芯片自身提供的接口。

虛擬磁盤和串口:

 

 虛擬磁盤:

 

 

 虛擬磁盤里面默認的四個文件:

調試工具

MicroPython和PC的標准連接是通過USB接口,使用虛擬磁盤和虛擬串口(VCP)方式。其中虛擬串口(在pyboard和STM32上可以同時使用USB虛擬串口和物理串口兩種方式)是調試中最常用的方式,無須頻繁復制文件避免造成Flash的損耗。

虛擬串口

USB虛擬串口通信是USB設備使用CDC類在主機上虛擬出一個串口來。在主機上使用完全和標准串口一樣。CDC類定義的是設備上下文對象的類。(了解一下就行,不必深究

REPL人機交互

在MicroPython上我們使用串口終端軟件和MicroPython的REPL進行交互,發送命令。通過串口終端軟件,我們可以方便地在 REPL(Read Evaluate Print Loop)中輸入代碼,運行和調試程序,打印結果。

Putty串口終端軟件

怎樣打開REPL人機交互界面? 可以使用Putty串口終端軟件打開

其它常用的終端軟件有:

Windows
● 超級終端(WinXP,可以在Win7/Win10下使用)
● putty
● kitty
● SecureCRT
● MobaXterm
Linux
● putty
● screen
● picocom
● minicom
MacOS
● screen

MicroPython已經移植到了很多硬件平台上,有很多不同的移植版本。但是無論哪種MicroPython的移植版本,對於串口參數的設置都是一樣的:

 特別要注意流量控制(Flow Control)參數,很多軟件默認使用硬件方式或者Xon/Xoff,在使用MicroPython時需要改為None,否則在有的終端軟件中將無法輸入數據。

putty串口終端軟件:

 注:

● REPL可以和虛擬串口或者標准串口通信,它們的串口參數是一樣的。

● 在一些操作系統中,虛擬串口的波特率可以隨便設置,效果和設置為115200的相同。因為虛擬串口沒有真正的物理串口信號,是通過驅動程序轉換USB的數據。

● 極少數的 MicroPython 移植版因為硬件限制使用了不同的波特率,如Ameba RTL8915A開發板使用波特率為38400。

USB串口 = 虛擬串口 + 物理串口

 上面我們有提到的虛擬串口和物理串口,其實就是USB串口,我們后面就直接叫做USB串口。我們不管它是虛擬串口還是物理串口,只要知道它就是一個USB串口,功能是通訊和數據傳輸,需要設置波特率和串口號就行,具體細分時再考慮虛擬串口和物理串口的區別,省的自己稀里糊塗。

打開REPL人機交互界面

在Putty里面按圖(putty串口終端軟件)設置好波特率和串口的端口號,然后回車就會進入REPL人機交互界面:(你可以按ctrl + c 或 ctrl + b測試是否連接上pyboard,連接上了就會有一串英文字符出現)

 成功連接:

 

MicroPython v1.11 on 2019-05-29; PYBv1.1 with STM32F405RG
Type "help()" for more information.

 

MicroPython的REPL(read-evaluate-print-loop)

REPL是Read-Evaluate-Print Loop(讀取-計算-輸出循環)的縮寫。很多編程語言都帶有REPL(名稱可能不完全相同),它像是一個小型的Shell,可以方便地在解釋器(內核)和命令之間交互,可以方便輸入各種命令,觀察運行狀態,因此在程序調試的時候能夠起到非常大的作用。

Python語言的REPL功能非常強大,MicroPython雖然是一個微型的Python,但是它的REPL功能同樣強大,通過REPL交互環境,我們可以訪問pyboard,輸入程序,測試代碼,查找問題,查看幫助,查看磁盤文件……因為MicroPython是面向嵌入式應用的,所以MicroPython的REPL與Python的標准REPL相比,還有一些差異,快捷鍵不同,還提供了額外的功能和用法,如果熟練掌握這些功能就可以幫助我們更好地使用MicroPython。

快捷鍵的好處:在 REPL 提供了不少快捷鍵,使用這些快捷鍵可以有效減少按鍵的次數,提高代碼輸入效率。

REPL的快捷鍵:

 使用help()函數

在Python中可以使用help()函數查看簡單的幫助,在MicroPython中同樣支持help()函數。在REPL下直接輸入help(),可以顯示基本的幫助界面,內容是pyboard基本函數和REPL用法,可以幫助我們了解基本的命令和函數。

>>> help()
Welcome to MicroPython!

For online help please visit http://micropython.org/help/.

Quick overview of commands for the board:
  pyb.info()    -- print some general information
  pyb.delay(n)  -- wait for n milliseconds
  pyb.millis()  -- get number of milliseconds since hard reset
  pyb.Switch()  -- create a switch object
                   Switch methods: (), callback(f)
  pyb.LED(n)    -- create an LED object for LED n (n=1,2,3,4)
                   LED methods: on(), off(), toggle(), intensity(<n>)
  pyb.Pin(pin)  -- get a pin, eg pyb.Pin('X1')
  pyb.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p
                   Pin methods: init(..), value([v]), high(), low()
  pyb.ExtInt(pin, m, p, callback) -- create an external interrupt object
  pyb.ADC(pin)  -- make an analog object from a pin
                   ADC methods: read(), read_timed(buf, freq)
  pyb.DAC(port) -- make a DAC object
                   DAC methods: triangle(freq), write(n), write_timed(buf, freq)
  pyb.RTC()     -- make an RTC object; methods: datetime([val])
  pyb.rng()     -- get a 30-bit hardware random number
  pyb.Servo(n)  -- create Servo object for servo n (n=1,2,3,4)
                   Servo methods: calibration(..), angle([x, [t]]), speed([x, [t]])
  pyb.Accel()   -- create an Accelerometer object
                   Accelerometer methods: x(), y(), z(), tilt(), filtered_xyz()

Pins are numbered X1-X12, X17-X22, Y1-Y12, or by their MCU name
Pin IO modes are: pyb.Pin.IN, pyb.Pin.OUT_PP, pyb.Pin.OUT_OD
Pin pull modes are: pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP, pyb.Pin.PULL_DOWN
Additional serial bus objects: pyb.I2C(n), pyb.SPI(n), pyb.UART(n)

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>>

可以通過 help(模塊名或函數名)查看更詳細的幫助,如查看 pyb 模塊的詳細幫助:

>>> help(pyb)
object <module 'pyb'> is of type module
  __name__ -- pyb
  fault_debug -- <function>
  bootloader -- <function>
  hard_reset -- <function>
  info -- <function>
  unique_id -- <function>
  freq -- <function>
  repl_info -- <function>
  wfi -- <function>
  disable_irq -- <function>
  enable_irq -- <function>
  stop -- <function>
  standby -- <function>
  main -- <function>
  repl_uart -- <function>
  usb_mode -- <function>
  hid_mouse -- (1, 2, 4, 8, b'\x05\x01\t\x02\xa1\x01\t\x01\xa1\x00\x05\t\x19\x01)\x03\x15\x00%\x01\x95\x03u\x01\x81\x02\x95\x01u\x05\x81\x01\x05\x01\t0\t1\t8\x15\x81%\x7fu\x08\x95\x03\x81\x06\xc0\t<\x05\xff\t\x01\x15\x00%\x01u\x01\x95\x02\xb1"u\x06\x95\x01\xb1\x01\xc0')
  hid_keyboard -- (1, 1, 8, 8, b'\x05\x01\t\x06\xa1\x01\x05\x07\x19\xe0)\xe7\x15\x00%\x01u\x01\x95\x08\x81\x02\x95\x01u\x08\x81\x01\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x01\x95\x06u\x08\x15\x00%e\x05\x07\x19\x00)e\x81\x00\xc0')
  USB_VCP -- <class 'USB_VCP'>
  USB_HID -- <class 'USB_HID'>
  have_cdc -- <function>
  hid -- <function>
  millis -- <function>
  elapsed_millis -- <function>
  micros -- <function>
  elapsed_micros -- <function>
  delay -- <function>
  udelay -- <function>
  sync -- <function>
  mount -- <function>
  dht_readinto -- <function>
  Timer -- <class 'Timer'>
  rng -- <function>
  RTC -- <class 'RTC'>
  Pin -- <class 'Pin'>
  ExtInt -- <class 'ExtInt'>
  pwm -- <function>
  servo -- <function>
  Servo -- <class 'Servo'>
  Switch -- <class 'Switch'>
  Flash -- <class 'Flash'>
  SD -- <SDCard>
  SDCard -- <class 'SDCard'>
  LED -- <class 'LED'>
  I2C -- <class 'I2C'>
  SPI -- <class 'SPI'>
  UART -- <class 'UART'>
  CAN -- <class 'CAN'>
  ADC -- <class 'ADC'>
  ADCAll -- <class 'ADCAll'>
  DAC -- <class 'DAC'>
  Accel -- <class 'Accel'>
  LCD -- <class 'LCD'>

 還可以進一步查看pyb內部模塊的幫助:

>>> help(pyb.Pin)
object <class 'Pin'> is of type type
  init -- <function>
  value -- <function>
  off -- <function>
  on -- <function>
  irq -- <function>
  low -- <function>
  high -- <function>
  name -- <function>
  names -- <function>
  af_list -- <function>
  port -- <function>
  pin -- <function>
  gpio -- <function>
  mode -- <function>
  pull -- <function>
  af -- <function>
  mapper -- <classmethod>
  dict -- <classmethod>
  debug -- <classmethod>
  board -- <class 'board'>
  cpu -- <class 'cpu'>
  IN -- 0
  OUT -- 1
  OPEN_DRAIN -- 17
  ALT -- 2
  ALT_OPEN_DRAIN -- 18
  ANALOG -- 3
  PULL_UP -- 1
  PULL_DOWN -- 2
  IRQ_RISING -- 269549568
  IRQ_FALLING -- 270598144
  OUT_PP -- 1
  OUT_OD -- 17
  AF_PP -- 2
  AF_OD -- 18
  PULL_NONE -- 0
  AF1_TIM1 -- 1
  AF1_TIM2 -- 1
  AF2_TIM3 -- 2
  AF2_TIM4 -- 2
  AF2_TIM5 -- 2
  AF3_TIM10 -- 3
  AF3_TIM11 -- 3
  AF3_TIM8 -- 3
  AF3_TIM9 -- 3
  AF4_I2C1 -- 4
  AF4_I2C2 -- 4
  AF5_SPI1 -- 5
  AF5_SPI2 -- 5
  AF7_USART1 -- 7
  AF7_USART2 -- 7
  AF7_USART3 -- 7
  AF8_UART4 -- 8
  AF8_USART6 -- 8
  AF9_CAN1 -- 9
  AF9_CAN2 -- 9
  AF9_TIM12 -- 9
  AF9_TIM13 -- 9
  AF9_TIM14 -- 9

  甚至可以一級一級深入查看,如:

>>> help(pyb.Pin.board)
object <class 'board'> is of type type
  X1 -- Pin(Pin.cpu.A0, mode=Pin.OUT)
  X2 -- Pin(Pin.cpu.A1, mode=Pin.OUT)
  X3 -- Pin(Pin.cpu.A2, mode=Pin.IN)
  X4 -- Pin(Pin.cpu.A3, mode=Pin.IN)
  X5 -- Pin(Pin.cpu.A4, mode=Pin.IN)
  X6 -- Pin(Pin.cpu.A5, mode=Pin.IN)
  X7 -- Pin(Pin.cpu.A6, mode=Pin.IN)
  X8 -- Pin(Pin.cpu.A7, mode=Pin.IN)
  X9 -- Pin(Pin.cpu.B6, mode=Pin.OUT)
  X10 -- Pin(Pin.cpu.B7, mode=Pin.IN)
  X11 -- Pin(Pin.cpu.C4, mode=Pin.IN)
  X12 -- Pin(Pin.cpu.C5, mode=Pin.IN)
  X17 -- Pin(Pin.cpu.B3, mode=Pin.IN, pull=Pin.PULL_UP)
  X18 -- Pin(Pin.cpu.C13, mode=Pin.IN)
  X19 -- Pin(Pin.cpu.C0, mode=Pin.IN)
  X20 -- Pin(Pin.cpu.C1, mode=Pin.IN)
  X21 -- Pin(Pin.cpu.C2, mode=Pin.IN)
  X22 -- Pin(Pin.cpu.C3, mode=Pin.IN)
  Y1 -- Pin(Pin.cpu.C6, mode=Pin.OUT)
  Y2 -- Pin(Pin.cpu.C7, mode=Pin.OUT)
  Y3 -- Pin(Pin.cpu.B8, mode=Pin.IN)
  Y4 -- Pin(Pin.cpu.B9, mode=Pin.IN)
  Y5 -- Pin(Pin.cpu.B12, mode=Pin.IN)
  Y6 -- Pin(Pin.cpu.B13, mode=Pin.IN)
  Y7 -- Pin(Pin.cpu.B14, mode=Pin.IN)
  Y8 -- Pin(Pin.cpu.B15, mode=Pin.IN)
  Y9 -- Pin(Pin.cpu.B10, mode=Pin.IN)
  Y10 -- Pin(Pin.cpu.B11, mode=Pin.IN)
  Y11 -- Pin(Pin.cpu.B0, mode=Pin.IN)
  Y12 -- Pin(Pin.cpu.B1, mode=Pin.IN)
  SW -- Pin(Pin.cpu.B3, mode=Pin.IN, pull=Pin.PULL_UP)
  LED_RED -- Pin(Pin.cpu.A13, mode=Pin.OUT)
  LED_GREEN -- Pin(Pin.cpu.A14, mode=Pin.OUT)
  LED_YELLOW -- Pin(Pin.cpu.A15, mode=Pin.OUT)
  LED_BLUE -- Pin(Pin.cpu.B4, mode=Pin.OUT)
  MMA_INT -- Pin(Pin.cpu.B2, mode=Pin.IN)
  MMA_AVDD -- Pin(Pin.cpu.B5, mode=Pin.OUT)
  SD_D0 -- Pin(Pin.cpu.C8, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D1 -- Pin(Pin.cpu.C9, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D2 -- Pin(Pin.cpu.C10, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D3 -- Pin(Pin.cpu.C11, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_CMD -- Pin(Pin.cpu.D2, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_CK -- Pin(Pin.cpu.C12, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD -- Pin(Pin.cpu.A8, mode=Pin.IN, pull=Pin.PULL_UP)
  SD_SW -- Pin(Pin.cpu.A8, mode=Pin.IN, pull=Pin.PULL_UP)
  USB_VBUS -- Pin(Pin.cpu.A9, mode=Pin.IN)
  USB_ID -- Pin(Pin.cpu.A10, mode=Pin.ALT_OPEN_DRAIN, pull=Pin.PULL_UP, af=10)
  USB_DM -- Pin(Pin.cpu.A11, mode=Pin.ALT, af=10)
  USB_DP -- Pin(Pin.cpu.A12, mode=Pin.ALT, af=10)
>>>

 如果能夠靈活使用help()函數,就可以查看大部分函數的基本用法和很多常量定義,甚至不需要看手冊就能知道用法。

查看模塊包含的變量和函數--dir()

有時候,我們需要了解一個模塊內部有哪些變量和函數,在Python中是通過dir()函數查看,在MicroPython中同樣也支持dir()。使用dir(),可以快速查看系統當前已經導入了哪些模塊和變量

>>> import pyb
>>> import math
>>> import os
>>> dir()
['os', 'start1', 'run', 'x1', '__name__', 'Pin', 'flag', 'Timer', 'x2', 'Echo', 'start', 'y1', 'left', 'back', 'y2', 'num', 'math', 'stop', 'Trig', 'stop1', 'pyb', 'go', 'right', 'machine']
>>>

 善用help()和dir()函數,可以在調試和輸入代碼時,幫助我們查看內部的變量和函數名稱,了解模塊的功能和用法。

 硬件平台之Pyboard

通常情況下,pyboard指的是MicroPython官方設計的開發板,如PYB V1.0 (也可寫為PVB V10)、PYBV1.1(也可寫為PVB V11)、PYBV3、PYBV4、PYB Lite 等。這些開發板的硬件和外形結構類似,功能差別也很小,主要差別在於是否帶有加速度傳感器、LED的數量、PCB的布局等。

但是因為 MicroPython 已經移植到了很多其他 STM32 開發板上(如STM32F4系列Nucleo開發板、STM32F4系列Discovery開發板),並且在這些STM32的開發板運行MicroPython時,基本功能和用法都類似,所以我們也可以把這些開發板稱為pyboard。

 

那如何查看板子的型號:在REPL里面按ctrl + b(如果按不出來就先按ctrl + c 停止當前板子程序運行,特別是程序里面存在while循環時)就會顯示你板子的型號引腳芯片的型號。

>>>
MicroPython v1.11 on 2019-05-29; PYBv1.0 with STM32F405RG
Type "help()" for more information.
>>>

 我這個板子的型號是PYBv1.0,芯片是STM32F405RG。

 官方的 pyboard(PYBv1x 系列)使用了 64 腳 LQFP64 封裝的高性能STM32F405RGT6微控制器,它的主要特點有:

● 1MB Flash和196KB SRAM
● 168MHz主頻
● RTC實時時鍾
● 51個通用GPIO
● 17個定時器
● 多路PWM輸出
● 16路ADC輸入
● 2路DAC輸出
● 3個I2C接口
● 4個UART接口
● 3個SPI接口
● 一個USB2.0全速接口
● 2個CAN接口
● SDIO接口
● 硬件隨機數發生器
● 唯一ID號
● 1.8~3.6V工作電壓
pyboard的主要功能:
● 一個復位按鍵
● 一個用戶按鍵
● 4個不同顏色的LED(其中兩個帶有亮度調節功能)
● MMA7660C三軸加速度傳感器
● microSD插座

除了 MicroPython 軟件是開源的,pyboard 的硬件同樣也是開源的。在github相關資料:https://github.com/RT-Thread-packages/micropython

原理圖:https://micropython.org/resources/PYBv11.pdf

PYB V10使用了PA13、PA14、PA15、PB4四個GPIO控制LED,每個LED的顏色都不同。其中PA15也是TIM2_CH1,PB4是TM3_CH1,所以這兩個GPIO支持PMW功能,可以通過調整PWM輸出占空比改變LED的亮度。另外兩個LED不支持亮度調節功能。

 MCU

   LED(1-4)

   三軸加速器

   SD存儲卡

   Power電源分配

  引出的I/0口端子

 

用戶按鍵SW2使用PB3,通過內部上拉電阻連接到VCC,按下SW2時PB3輸入低電平。不過因為PB3上沒有電容去抖(可以自己增加一個0.1μF的電容),所以在按鍵時容易出現抖動問題。

加速度傳感器MMA7660連接到MCU的I2C1上,傳感器的中斷輸出連接PB2,傳感器的模擬電源通過 PB5 提供(這是因為傳感器的功耗很低,需要的電流很小)。這樣就可以通過PB5控制傳感器是否工作了。

microSD連接到MCU的SDIO接口上,因此PYB V10訪問SD卡的速度並不慢,比通過SPI方式快很多,而PA8用於檢測SD卡是否插入。

系統主時鍾由 8MHz 的外部無源振盪器提供,也可以使用其他頻率的時鍾(4-26MHz),但是頻率必須是整數倍,這樣才能支持USB功能。而32kHz晶體為系統提供RTC時鍾信號。

PYB V10的四周是用於擴展的接口,使用了2.54mm的標准間距,可以焊接排針或者排母。官方開發板上使用的是排母,可以連接液晶、蜂鳴器、觸摸按鍵等專用擴展板。不過焊接排針更適合使用杜邦線連接到各種傳感器。

 


 

編譯器:uPyCraft IDE (Windows)

 下一章節Pyboard基本功能快速瀏覽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM