MicroPythonシステムアーキテクチャ
カノニカル構造MicroPythonシステムは、3つの部分、すなわち、で構成されたマイクロコントローラのハードウェア、ファームウェアMicroPythonユーザープログラム。
開発ボードの他の種類をサポートMicroPython、あなたはソースコード生成されたファームウェアをコンパイルしMicroPythonを実行するために、マイクロコントローラにファームウェアをダウンロードする必要があります。(このコンテンツは、我々は、高すぎる目指していないために説明しますと!)
コンピュータに接続されMicroPython
STM32マイコンpyboardシリーズ開発ボード、通常含まれているネイティブUSBファンクションデフォルトでは二つのデバイスが存在します、USB接続を介してコンピュータの後、開発ボードを:
- 仮想ディスク(MSD)
- 仮想シリアルポート(USB通信ポート)
デバイスマネージャのWindowsシステムpyboard表示装置
仮想ディスクデバイスは、自動的にシステムによって認識することができ、それは、WindowsやLinux、MacOSのであるかどうか、一般的なUディスクに望んでいた、リムーバブルディスクデバイスを認識します。図仮想ディスクとシリアルを示したWindowsシステムでのデバイスマネージャでuPyのmicroSDフラッシュUSBデバイスのディスクデバイスを。(図:4つのデフォルトのファイル内の仮想ディスク)
pyboard仮想ディスク
図仮想ディスクのボリュームラベルが「PYBFLASH」で、4つのデフォルトのファイルがあります。仮想ディスクファイルは、ストアドプロシージャとデータをコピーすることができ、Uディスクの使用などなどの一般的なことができます。我々はboot.pyからシステムリセットデフォルトの負荷基本パラメータの直後に実行し、main.py.から実行を開始良いコピーPythonプログラムを書くことができます (図:4つのデフォルトのファイル内の仮想ディスク)
pyboardUSBシリアル
通常の状況下では、シリアル認識システム後にコンピュータにインストールされてpyboardのUSB通信ポートデバイスのより具体的なシリアル番号およびその他の関連機器となります。(図:仮想ディスクとシリアル)
仮想ディスクファイル内のPybcdc.inf役割は何ですか?
Windows10に、Linuxは、(32ビットおよび64ビットのオペレーティングシステムを含む)のMacOSオペレーティングシステムは、自動的に仮想シリアルポート、追加のドライブをインストールする必要を特定します。しかし、次のWin10システムでは、仮想シリアルポートデバイスドライバファイルをインストールする必要が正しく識別して使用することができます。MicroPythonの著者は非常に巧妙な方法を使用し、このドライブは、(ファイル名はpybcdc.infある)仮想ディスク上のファイルが付属していますので、ダウンロードする必要はありませんオンライン直接インストール、および非常に便利なことができます。(図:4つのデフォルトのファイル内の仮想ディスク)
注意:ネイティブUSB機能は何ですか?
シリアルインタフェースは、大きなクラスのインタフェース、USBインタフェース、等RS232インタフェースケーブルRJ45インターフェース、RS485インターフェース、SATAは、すべてのシリアルインタフェースであるデータのシリアル伝送を利用することはいいます。等界面レベルとの間の種々のシリアル通信プロトコルは、同じではないので、別のシリアル変換するシリアルポートを取得する必要があります。一般的に、デフォルトのシリアルRS232インターフェースは、実際にはRS232デバイスにシリアルUSBに、いわゆるUSBを指します。USBインタフェースは、シリアル・ポートの一部です。自身が提供するインターフェースチップを参照して、ネイティブ所謂。
仮想ディスクとシリアルポート:
仮想ディスク:
4つのファイル内のデフォルトの仮想ディスク:
デバッグツール
使用MicroPython標準USBインタフェースを介してPCに接続され、仮想ディスクおよび仮想シリアルポート(VCP)モード。これで仮想シリアルポートは(あなたがpyboardとSTM32上で同時に二つの方法でUSB仮想シリアルポートと物理シリアルポートを使用することができます)の損失を避けるために、ファイルをコピーし、頻繁にフラッシュなしでデバッグするための最も一般的な方法です。
仮想USBデバイスは、ホスト上のCDCクラスの仮想シリアルポートを使用してUSBシリアル通信です。標準のシリアルポートを使用して、ホスト上の同じを完了します。CDCクラスデバイスコンテキストオブジェクトのクラス定義です。(下に得ることはありません、ライン上で見て)
REPLヒューマンコンピュータインタラクション
MicroPythonで私達は、シリアル端末ソフトウェアを使用し、REPLのMicroPythonは、コマンドを送信し、対話します。シリアルポートターミナルソフトを通じ、我々は簡単に結果を印刷、(印刷ループを評価読む)、コードを入力して実行し、REPLでのプログラムのデバッグすることができます。
パテシリアル端末ソフトウェア
REPLインタラクティブなインタフェースを開く方法?パテは、シリアルポートのターミナルソフトウェアを開くために使用することができます
他の一般的な端末のソフトウェアです。
Windowsの ●ハイパーターミナル(WinXPの、win7のことができます/Win10の下で使用) ●パテ ●キティ ●のSecureCRT ●MobaXtermのLinux ●パテ ●スクリーン ●picocom ●minicomの MacOSの ●画面
MicroPythonは、多くの異なるポータブル版があり、多くのハードウェアプラットフォームに移植されています。しかし、関係なく、シリアルポートのパラメータを設定するには、ポータブル版をMicroPython何と同じではありません。
フロー制御(フロー制御)のパラメータに特に注意を払って、ソフトウェアまたはハードウェアのデフォルトXON / XOFFの多くは、MicroPythonを使用している場合は、Noneを変更しないする必要があり、または端末のソフトウェアにいくつかのデータを入力することはできません。
パテシリアル端末ソフトウェア:
注意:
●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
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)