 FPIOA 引腳映射與 GPIO 編程)
K210 硬件編程和普通單片機(jī)最大的區(qū)別之一是很多功能并不固定綁定在某個(gè)物理引腳上。正式控制 LED、蜂鳴器、按鍵、傳感器之前需要先理解 FPIOA 引腳映射。GPIO 控制看起來(lái)只是讓某個(gè)引腳輸出高低電平但在 K210 中程序需要先通過 FPIOA 把功能分配到物理 IO。理解這層關(guān)系后后續(xù) PWM、I2C、SPI、UART 等實(shí)驗(yàn)會(huì)更容易展開。文章目錄理論基礎(chǔ)硬件設(shè)施軟件代碼擴(kuò)展應(yīng)用總結(jié)理論基礎(chǔ)實(shí)驗(yàn)原理FPIOA 的完整名稱是 Field Programmable IO Array可以理解為 K210 內(nèi)部的一套“引腳功能分配器”。開發(fā)板外部看到的是物理 IO 引腳程序中使用的是 GPIO、PWM、I2C、SPI、UART 等軟件功能。FPIOA 的作用就是把某個(gè)軟件功能綁定到指定物理引腳上。在普通開發(fā)板中某個(gè)引腳可能固定就是串口 TX另一個(gè)引腳固定就是 PWM 輸出。但 K210 的靈活性更高很多外設(shè)功能可以通過 FPIOA 映射到不同物理 IO。這樣做的好處是接口使用更靈活缺點(diǎn)是編程前必須先明確“硬件接在哪個(gè) IO程序功能映射到哪個(gè) IO”。GPIO 編程的流程可以概括為四步。先確認(rèn)模塊信號(hào)線接到哪個(gè)物理 IO再通過 FPIOA 把這個(gè)物理 IO 映射為 GPIO 功能接著創(chuàng)建 GPIO 對(duì)象并設(shè)置輸入或輸出模式之后在程序中讀取電平或輸出電平。后續(xù) LED、蜂鳴器、按鍵、傳感器檢測(cè)都會(huì)反復(fù)使用這套流程。硬件設(shè)施實(shí)驗(yàn)所需硬件本篇用于理解 FPIOA 和 GPIO 編程思路可以使用開發(fā)板板載 LED 或擴(kuò)展板上的 LED 模塊完成驗(yàn)證。若實(shí)際套件中的 LED 接口與示例 IO 不一致需要根據(jù)開發(fā)板引腳圖修改代碼中的物理 IO 編號(hào)。本篇可以優(yōu)先使用板載 LED 進(jìn)行驗(yàn)證避免外部接線干擾。如果使用擴(kuò)展板 LED 或外接 LED 模塊需要根據(jù)實(shí)際主板引腳圖確認(rèn)信號(hào)線連接到哪個(gè)物理 IO。下面以 IO12 作為示例實(shí)際操作時(shí)可以替換成套件對(duì)應(yīng)的 LED 引腳。模塊引腳連接位置功能說明VCC3.3V 或 5V為 LED 模塊供電按模塊要求選擇電壓GNDGND電源地線需要與開發(fā)板共地SIG / INIO12LED 控制信號(hào)線示例程序會(huì)映射為 GPIO0代碼中的fm.register(12, fm.fpioa.GPIO0)表示把開發(fā)板物理 IO12 映射為軟件功能 GPIO0。后面創(chuàng)建GPIO(GPIO.GPIO0, GPIO.OUT)對(duì)象時(shí)程序控制的就是被映射后的 GPIO0 功能而這個(gè)功能最終會(huì)作用到物理 IO12 上。軟件代碼實(shí)驗(yàn)所需軟件環(huán)境本篇使用 CanMV IDE 編寫和運(yùn)行 MicroPython 程序。開發(fā)板需要提前完成 USB 串口驅(qū)動(dòng)安裝、CanMV 固件燒錄和 IDE 連接測(cè)試。如果 IDE 無(wú)法連接開發(fā)板應(yīng)先檢查數(shù)據(jù)線、串口驅(qū)動(dòng)和 COM 端口再排查代碼問題。下面程序演示 FPIOA 引腳映射與 GPIO 輸出控制。示例將物理 IO12 映射為 GPIO0再通過 GPIO0 控制 LED 閃爍。實(shí)際開發(fā)板如果 LED 不在 IO12需要修改fm.register(12, fm.fpioa.GPIO0)中的 12。# CanMV K210 FPIOA 引腳映射與 GPIO 輸出控制實(shí)驗(yàn)# 功能將物理 IO12 映射為 GPIO0并控制 LED 閃爍fromfpioa_managerimportfmfromMaiximportGPIOimporttimeprint(K210 FPIOA GPIO output experiment start)# 將物理 IO12 映射為 GPIO0 功能# 如果實(shí)際 LED 接在其他 IO需要修改這里的物理 IO 編號(hào)fm.register(12,fm.fpioa.GPIO0)# 創(chuàng)建 GPIO0 對(duì)象并設(shè)置為輸出模式ledGPIO(GPIO.GPIO0,GPIO.OUT)whileTrue:# 輸出高電平led.value(1)print(GPIO0 output HIGH)time.sleep(0.5)# 輸出低電平led.value(0)print(GPIO0 output LOW)time.sleep(0.5)如果 LED 亮滅邏輯與預(yù)期相反可以將led.value(1)和led.value(0)的順序或含義對(duì)調(diào)。部分板載 LED 采用低電平點(diǎn)亮方式代碼輸出低電平時(shí)反而會(huì)點(diǎn)亮這是正常硬件設(shè)計(jì)現(xiàn)象。這段代碼的關(guān)鍵不在 LED 閃爍本身而在 FPIOA 映射和 GPIO 對(duì)象創(chuàng)建。fm.register()負(fù)責(zé)把物理 IO 與軟件功能綁定GPIO()負(fù)責(zé)創(chuàng)建可以被程序控制的對(duì)象value()負(fù)責(zé)輸出高低電平。GPIO 輸入的思路與輸出類似只是對(duì)象模式從GPIO.OUT改為GPIO.IN。例如按鍵或數(shù)字傳感器實(shí)驗(yàn)中程序會(huì)先通過 FPIOA 把物理 IO 映射為 GPIO 功能再創(chuàng)建輸入對(duì)象之后通過value()讀取當(dāng)前電平狀態(tài)。# GPIO 輸入思路示例# 以物理 IO13 映射為 GPIO1 為例fromfpioa_managerimportfmfromMaiximportGPIOimporttime# 將物理 IO13 映射為 GPIO1fm.register(13,fm.fpioa.GPIO1)# 創(chuàng)建 GPIO1 輸入對(duì)象keyGPIO(GPIO.GPIO1,GPIO.IN)whileTrue:valuekey.value()print(GPIO1 input:,value)time.sleep(0.2)這段輸入示例適合后續(xù)按鍵、傾斜傳感器、振動(dòng)傳感器、觸摸開關(guān)、紅外避障等實(shí)驗(yàn)使用。輸出控制關(guān)注“程序改變外部模塊”輸入檢測(cè)關(guān)注“外部狀態(tài)被程序讀取”。兩者都需要先建立 FPIOA 映射關(guān)系。擴(kuò)展應(yīng)用常見問題FPIOA 和 GPIO 實(shí)驗(yàn)中最常見的問題是硬件接線和代碼映射不一致。程序中映射的是 IO12但模塊實(shí)際接在 IO13代碼可以正常運(yùn)行串口也會(huì)輸出信息但 LED 或傳感器不會(huì)有預(yù)期反應(yīng)。排查時(shí)應(yīng)先核對(duì)接線再核對(duì)fm.register()。擴(kuò)展實(shí)驗(yàn)掌握 FPIOA 和 GPIO 思路后可以把單個(gè) LED 閃爍擴(kuò)展成更多硬件控制實(shí)驗(yàn)。比如用多個(gè) GPIO 控制流水燈用輸入 GPIO 讀取按鍵狀態(tài)用按鍵控制 LED 開關(guān)用傳感器輸入觸發(fā)蜂鳴器報(bào)警。后續(xù)所有基礎(chǔ)硬件實(shí)驗(yàn)都可以從這套思路擴(kuò)展出來(lái)??偨Y(jié)本篇圍繞 K210 FPIOA 引腳映射機(jī)制和 GPIO 編程思路進(jìn)行了梳理。FPIOA 負(fù)責(zé)把物理 IO 和軟件功能綁定起來(lái)GPIO 負(fù)責(zé)完成輸入讀取或輸出控制這是后續(xù)硬件實(shí)驗(yàn)的基礎(chǔ)。掌握 FPIOA 后代碼中的 GPIO、PWM、I2C、SPI、UART 才能對(duì)應(yīng)到真實(shí)接線位置。后續(xù) LED、蜂鳴器、按鍵、傳感器和顯示模塊實(shí)驗(yàn)都會(huì)建立在這套引腳映射思路之上。