VS Code + WSL 搭建 RaspberryPi Pico 開發環境

東邪獨孤發表於2021-09-19

前面老周寫一堆 .NET 與樹莓派相關的水文。其實使用的是.net的 IOT 庫,並不只是樹莓派,其他執行 Linux 的開發板都適用,只要有 GPIO 就行。老周好像在哪看到過,有 USB 轉GPIO的模組,直接插在電腦上也能使用 IOT 庫。

不管是樹莓派,還是 Arduino 系列的,或是 ESP 系列的,你會發現,Iot 框架實際都是這幾個東東組成(基本都是這套路):

1、GPIO:數字引腳,讀寫高 / 低電平,即處理數字訊號;

2、串列埠通訊;

3、ADC:即讀取模擬量(模數轉換),Arduino系列、ESP系列、STM32系列都有ADC功能,但作為微型電腦版的樹莓派是沒有的,前面老周寫過,需要使用其他ADC模組;

4、I2C(IIC)協議;

5、SPI 協議;

6、DAC:數字轉模擬,這個好像很多板子沒有,據老周的有限知識量,ESP32模組有整合 8 位的DAC功能。一般使用輸出模擬電壓是沒問題,但要作為音訊訊號輸出就水了點。所以一般需要外接支援 I2S(IIS)的音訊解碼板。

-------------------------------------------------------------------------------------------------------------------------------------------

按照老周的折騰習慣,折騰完大草莓,就應該折騰小草莓了。小草莓就是——Raspberry pi Pico。也許樹莓派基金會也覺得作為微型電腦的大草莓,搞物聯網有些大材小用了。儘管資源挺多,但還真不能英特爾系列的開發板比,畢竟處理器功耗是很關鍵的,你想節能自然要犧牲執行速度了。

Raspberry Pi Pico 用的是自主研發的 RP2040 處理器,架構是ARM,作為專用 GPIO 控制板,效能肯定能甩 Arduino Uno 五千條高速公路,而且價格比 Uno 低很多。某寶一般售價是 28 - 38 之間。當然,會有個別不會做生意的,一上來就賣 150 元的,這些賣家顯然不知道網購是可以貨比萬家的,他們估計是為了不忘初心,堅守零銷量第一陣線。

這裡就不得不提 ESP32 開發板,引腳雖然比 RP Pico 少一些,但有 Wifi,有藍芽,有ADC,有DAC,有霍爾感測器等,價格一般 20 多,是比 rp pico 便宜些。不過,你買的ESP32開發板只有模組是樂鑫的,板子是一些小電子廠做的(也不排除有大廠),樂鑫官方的開發板也挺貴的。

雖然沒有 WiFi 沒有藍芽,不過 RP Pico 的價效比還是不錯的,而且功耗確實很低。老周曾說過用它做了門鈴,在家裡已經執行了大半年了,除了中途天線模組燒了(這質量?)換了一個新模組(12元左右),就是一直執行著。由於消耗電流太小了,充電寶供電會自動斷電,只能用 5V1A 的充電頭供電。日常工作電流都在微安級別,特省電。

小草莓目前是不能用 .NET 開發的(估計以後也不太可能會支援),按官方文件,目前支援C/C++,Micropython。當然也有 Arduino 外掛,但功能不完整。剛釋出的時候耍了一下,只有一路 UART 可以用,另一路沒反應,不知道現在修復了沒有。至於 Micropython,我只能用兩個字來評價——【無語】。因此,最優方案還是 C 語言(C++也行,但SDK基本是C寫的)。

這個SDK,由於官方的定位是希望你買了小草莓,順便買大草莓,即優先推薦你在 Raspberry Pi3 或者 Raspberry Pi 4 系列上進行開發。但是,老周作為全國人民公認的老實人,不得不說一句實話,你這板子上寫程式碼,能幹得我的桌上型電腦嗎?所以嘛,還是在PC上寫程式碼刺激。其實,SDK是可以在PC上用的,Windows、macOS、Linux上都行,官方和網上都有教程。

可能是老周最近運氣不太好,按照文件步驟,在 Windows 上沒有弄成功過,試過幾次都失敗,CMake 報的錯誤應該是找不到C編譯器。反正這個目前沒法解決,環境變數也沒置正確,路徑中也沒有空格,也沒有中文,也沒有長檔名,但還是找不到編譯器。畢竟官方是想讓你在 Raspberry Pi 上開發的,大概是對Linux比較友好。

等等,這個其實也好辦,不是說 Win 10 是最大的 Linux 發行版嗎?嗯,這樣就OK了,既可以用 Windows,又可以友好。

唉,回頭看一看內容,哇,原來上面寫了那麼多廢話,現在才進入主題,這要是放在高考作文,肯定是滿分作文無疑,很自豪ing。

 

======================================================================================

相信各位同學如果玩過大草莓,會知道 Raspbian 其實是 Debian 發行版的變種,所以,老周在 WSL 中優先考慮 Debian。這裡老周順便演示一下如何把 Linux 子系統轉移到其他分割槽,方法很簡單,不用改配置,不用改許可權。雖然老周把一整塊 512 G的SSD都作為系統分割槽,但軟體裝多了好像也不怎麼夠用,故,還是把子系統弄到其他分割槽上好一些,誰知道它將來會佔用多大空間呢,Linux 在安裝工具和更新時,經常會依賴安裝一大堆東西。

好了,不扯F話了,開工。

1、到Windows商店找到 Debian 君,安裝。這個應該會了吧,不會的話可以問班主任。

 

2、坐和等待。

3、安裝完啟動它,初始化完後會提示你輸入使用者名稱,如demo。

 

 4、回車後,要求你輸入密碼,比如 123456。反正是子系統,設定個䜭智密碼也沒關係。

5、關閉它,對,關掉,現在啥也不用幹。

6、開啟CMD,或者PowerShell,輸入以下命令,看看剛剛安裝的發行版。

wsl --list --all

看到 Debian 就沒錯了。

**注:WSL有 1 和 2 兩個版本,這個隨便選,如果你要跨 Linux 和 Windows 操作檔案,就用版本 1,因為版本 2 是用虛擬機器的,讀寫較慢。

7、記下發行名稱 Debian,然後使用 export 命令,把它匯出備份,假如我存放在E盤,檔案型別是 .tar。

wsl --export Debian E:\mydebian.tar

export 表示匯出,這命令本來是用來備份的,不過這裡可以發揮一下,用作遷移。E:\mydebian.tar就是匯出後的檔案。因為是初始系統,只有200多M。

8、執行以下WSL命令,登出掉 Debian 子系統。

wsl --unregister Debian

這時候你再執行一次 wsl --list 就啥都沒有了。

9、在 D 盤裡(你可以選其他盤)建一個目錄,名字你喜歡,比如我建了兩層目錄:Linux/Debian,主要是考慮到可能將來要遷移其他發行版。

10、執行以下命令重新匯入 Debian。

wsl --import Debian D:\Linux\Debian E:\mydebian.tar --version 1

Debian 是發行版名稱,D:\Linux\Debian 是剛剛建的目錄,用來放子系統;後面的.tar 檔案就是剛才匯出的備份;--version 指定使用 WSL 1。

再執行一次 wsl --list 就能看到子系統又回來了。

11、【可選】把剛從商店安裝的 Debian 解除安裝。不卸也行,反正也不佔地方,如果卸了,也不怕,你只需要在任意路徑下執行 bash 就能進入子系統了。老周建議不要卸,因為它是一個啟動器,而且還可以執行 config 命令進行一些配置(這不,下一步就用上了)。

12、這樣匯入之後,子系統預設啟動到 root 上下文的。我們們一般是沒有必要的,所以,我們執行一下 config,重新設定一下預設使用者。

debian config --default-user demo

Windows 對大小寫不敏感,所以 debian 也能找到 Debian 啟動器(你看,幸好剛剛沒有把 Debian 解除安裝,不然執行不了)。“demo” 就是老周前面初始化時設定的使用者名稱。

 萬一,我說的是萬一,你一時手殘,把Debian卸了,咋辦?如果你有耐心,可以來一句 wsl --unregister Debian,然後從頭來過,就是從第一步開始。當然了,補救方法是有的。可以利用一下 wsl.conf 檔案。

進入子系統,cd 到 /etc 目錄下,預設應該不存在 wsl.conf 檔案的,所以我們們手動建一個。

sudo nano /etc/wsl.conf

然後輸入以下配置:

[user]
default=demo

【Ctrl+O】儲存,【Ctrl+X】退出。

這是典型的 .ini 檔案格式,用中括號包起來的是配置節的名稱,這裡我們們配置了 user 節,接著另起一行,寫配置項,格式 key=val。如果有多條配置項,那就一行一條。

13、子系統改成國內源,此處省略 5000 個字,相信你也會了,老周就不F話了。如果網速可以,就不用改國內源了。

安裝工具鏈

在克隆SDK前,必須先安裝工具鏈。按照官方教程,就下面這一句完成。

sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib python3

用 bash 命令開啟 Debian 子系統,預設是 root 上下文,所以,如果你啟動子系統後是root上下文,就不用加 sudo 了。這個得佔約 2 G的空間,慢慢等吧。今天運氣好,下載速度 5MB/S ,節約了一些時間。

注意不要漏掉 python3,不然後面會出錯。

下載SDK

下載SDK是克隆 github 上面的原始碼。所以先安裝git。

sudo apt update && sudo apt install git

還要裝個 wget。

 sudo apt install wget

 

然而事情不是當初想的那麼簡單,github 上面的程式碼能否拉下來,真的需要充值運氣。十有八九會失敗,就算不是全失敗都會有一部分檔案下載不了。所以,還要加上 cgit(前面裝 wget 就是為了這時候用)。

sudo wget http://cgit.killf.info/cgit_linux_latest -O /usr/local/bin/cgit && sudo chmod 755 /usr/local/bin/cgit

好,現在,嘗試克隆一下SDK。先切換到 Home 目錄。

cd ~

用剛安裝的 cgit 來克隆。

cgit clone https://github.com/raspberrypi/pico-sdk

速度不錯,克隆完後,會在你的使用者目錄下產生個 pico-sdk 目錄。如果你是用 root 上下文執行的,那麼目錄是在 /root 下面,至於如何處理,你自己看著辦,可以移到非 root 的使用者目錄下。

其實到這裡就能用了,原始碼不多,6到7M的大小。不過它依賴一個 tinyUSB 的庫,用來進行USB通訊的,這個並不是必須的,如果你不使用 USB 串列埠,可以不需要這個模組。如果要的話,就加上這兩句:

cd pico-sdk
cgit submodule update --init

最後,開啟 /etc 下面的 profile,配置一下環境變數,變數名為 PICO_SDK_PATH,指向剛才的 pico-sdk 目錄。

sudo nano /etc/profile
export PICO_SDK_PATH=/home/demo/pico-sdk

這一行是加到檔案的最後一行。儲存退出。

讓配置馬上生效,執行一下 source 命令。

 source /etc/profile

這個環境變數是系統級別的,其他使用者也能用,如果只想給當前使用者配置,就用 $HOME/.profile 檔案(profile 前面有個小數點,在Linux中表示隱藏檔案)。 

 

建立專案寫程式碼

開啟 VS Code,保證這三個外掛已安裝:

1、C/C++擴充套件,微軟官方的;

2、CMake Tool,也是微軟官方的;

3、Remote-WSL,用來訪問子系統的;

4、CMake,這個可選,可以不裝,非官方。

在VS Code 中開啟子系統中的目錄,有個很簡單的方法。

假如,我在 home 目錄下建個目錄,叫 my,用來放專案。

mkdir my

然後進入 my。

cd my

接著輸入:

code .

第一次用會安裝一些包包,然後就自動啟動VSCocde,前提是你得把 VS Code 的路徑新增到 PATH 變數中,這個是在Windows中的Code,PATH也是在Windows中配置的,不是Linux子系統。

這時候,C++外掛和CMake Tools外掛還要在WSL中再安裝一次,成功之後會讓選編譯器。

  選擇 arm-none-eabi。

在專案目錄下建個新檔案,名為 CMakeLists.txt,這個名字請區分大小寫,而且不要亂改名字,CMake 專屬名稱。然後在這個文字檔案中輸入:

cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(myapp)

pico_sdk_init()

add_executable(sb "app.c")
pico_add_extra_outputs(sb)
target_link_libraries(sb pico_stdlib)

這是最簡單的專案配置,下面老周解析一下。

第一行,從字面意思猜猜,對了,設定支援的最低 CMake 版本號,可以隨便寫,不要比當前安裝的高就行,比如安裝了 3.18,不要設定成 13.25,但可以設定為 3.15。

第二行,include 引入 RPI Pico SDK專用的 cmake 檔案,官方教程裡是讓你先把這個檔案複製到專案中,然後再用相對路徑引用。這裡我懶得複製,直接指向檔案原路徑,其中 PICO_SDK_PATH 是配置的環境變數指向 /home/demo/pico-sdk 目錄。

第三行,project,指定本專案的名稱,給它取個你喜歡的名字就行,我這裡是“myapp”,雙引號可用可不用。

第四行,呼叫一個巨集,叫 pico_sdk_init,這個就是從官方SDK的cmake檔案中匯入的。

第五行,add_executable 新增我們們專案中的原始碼檔案,比如 app.c,第一個引數是指定一個 target 的名稱,也是可以隨便取,不要和cmake保留名稱衝突就行(衝突了它會提示的,所以不用怕),這個target在整個專案中必須唯一。這裡我取了個很低俗的名字,叫"sb"。

第六行,pico_add_extra_outputs,指定程式編譯後匯出的二進位制檔案格式,這裡會生成N種格式,如 .bin,.elf,.dis,.hex,.uf2。其中,我們刷到 RPI Pico 上,用 uf2 檔案很方便,像U盤一樣,直接放進去就行了。uf2 格式可以像U盤/行動硬碟拖檔案的方式來為設定更新韌體,非常的傻瓜化操作,也是微軟的大法之一。

pico_add_extra_outputs 是個函式,在 pico-sdk\src\rp2_common.cmake 檔案中,它呼叫了另外四個函式:

pico_add_hex_output(${TARGET}):生成 hex 格式檔案;

pico_add_bin_output(${TARGET}):生成 bin 格式檔案;

pico_add_dis_output(${TARGET}):生成 dis 格式檔案;

pico_add_uf2_output(${TARGET}):生成 uf2 格式檔案。

第七行,target_link_libraries(sb pico_stdlib),sb也是我們們專案中唯一的 target 名稱,一定要和上面的命令一致,不然就無法把標準庫連結到當前專案中。pico_stdlib,是 pico 的標準庫,官方文件把這些名稱稱為“介面”,它連結了一些常用的庫,比如 GPIO,UART 都在裡面。

    target_link_libraries(pico_stdlib INTERFACE
        pico_stdlib_headers
        pico_platform
        pico_runtime
        pico_stdio
        pico_time
    )

    target_link_libraries(pico_stdlib_headers INTERFACE
            hardware_gpio
            hardware_uart
            hardware_divider
            pico_time
            pico_util
    )

所以,你如果要簡單操作 GPIO,那麼不需要連結其他庫,pico_stdlib 已包含,標頭檔案包含的寫法是 #include “pico/stdlib”,把下劃線換成“/”,整個SDK的庫都是這種規律,比如 hardware_uart,標頭檔案為 "hardware/uart.h"。

 

新建一個 app.c 檔案,我們寫程式碼。

#include <stdio.h>
#include "pico/stdlib.h"

int main()
{
    return 0;
}

純用來演示,所以就寫得這麼簡陋。

 

在 CMake 的配置階段,極大的概率會發生這樣的錯誤:

 因為 CMake 會先 CTest 一下,看看你配置的工具能不能用。這個錯誤很讓人頭痛,雖然網上能找到不少方法,但是那些方法是直接傳引數給 arm-none-eabi-gcc 編譯器的,而我們這裡是用 CMake 來完成整套工作的。

arm-none-eabi-gcc -o XXX XXX.c -g --specs=nosys.specs

故,我們們要在VS Code 裡面配置一下 CMake 工個。VS Code 視窗左下角有個【管理】按鈕(一個齒輪圖示),然後選【設定】,找到 擴充套件 -- CMake Tools Configuration ,再找到 Configure Settings。

 

 點選“在 settings.json 中編輯”,然後在 JSON 文件中輸入:

    "cmake.configureSettings": {
        "CMAKE_EXE_LINKER_FLAGS": "--specs=nano.specs"
    }

CMAKE_EXE_LINKER_FLAGS 是針對連結器的選項,它的值就是上面的 --specs=nano.specs 引數。

修改後儲存關閉檔案,再 config 一次 CMake 就沒問題了,build 也能順利通過。

 

 好了,今天的文章就水到這兒了,有空老周將繼續水。

相關文章