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


前面老周寫一堆 .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 也能順利通過。

 

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


免責聲明!

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



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