利用 C 語言開始使用 Raspberry Pi Pico 多核心微控制器板

作者:Jacob Beningo

資料提供者:DigiKey 北美編輯群

嵌入式系統在本質上需配備功能強大、低成本的微控制器單元 (MCU)。這些裝置不僅在產品中發揮重要作用,而且也可支援測試、快速原型設計和機器學習 (ML) 等功能。但是,若要開始使用 MCU,通常要先深入瞭解 MCU 技術和低階程式設計語言。最重要的是,開發板的成本通常在 20 至 1000 美元之間,這對許多開發人員來說可能太貴了。此外,也絕非一定會有開發板可用;即使有,設計人員往往也要費一番功夫才能組好板件並運作。

本文將介紹 Raspberry Pi Pico (SC0915);這是一款 RP2040 MCU 用的低成本開發板,能為開發人員提供多種功能。本文也會介紹 Pico 和一些擴充板、瞭解 Raspberry Pi Pico 支援的不同軟體開發套件,並示範如何使用 C SDK 建立閃爍的 LED 應用。

Raspberry Pi Pico 介紹

Raspberry Pi Pico 於 2021 年首次推出,是 RP2040 微控制器的開發平台。Pico 可當作獨立開發板使用,也可直接設計成產品,利用邊緣連接再焊接到載板即可 (圖 1)。由於 Pico 費用低於 5 美元且具有多重用途,因此已成為創客與專業開發人員常用的解決方案。

Raspberry Pi 的 Pico 是一款低成本的開發板示意圖圖 1:Raspberry Pi Pico是一款低成本的開發板,含有在 RP2040 微控制器上開發應用所需的各項資源。(圖片來源: Raspberry Pi)

RP2040 具有雙核心 Arm® Cortex®-M0®+ 處理器,工作頻率為 133 MHz,具有高達 264 KB 的 SRAM。RP2040 不包含晶片上快閃記憶體。相反地,Raspberry Pi Pico 提供外接的 2 MB 快閃記憶體晶片,可透過四通道序列周邊介面 (QSPI) 與 RP2040 介接。此板還提供使用者 LED、鎖相迴路 (PLL) 可用來建立穩定高速 CPU 時脈的晶體振盪器,以及用於配置處理器正常啟動或進入開機載入程式的按鈕。

廣大的生態系統

Raspberry Pi Pico 已經擁有廣大的生態系統,能讓開發人員選擇使用 MicroPython 或 C 軟體開發套件編寫電路板的應用程式。Raspberry Pi Pico 有趣的地方在於,不只有一款開發板而已;而是有三款。原始的 SC0915 採用標準配置、SC0917 則含有排針座連接器、SC0918 則具有低成本的 Wi-Fi 晶片,可達到連線應用 (圖 2)。

Raspberry Pi Pico 提供三種配置示意圖圖 2:Raspberry Pi Pico 提供三種配置。(圖片來源: Beningo Embedded Group, LLC)

各個款式的電路板,一般尺寸維持不變。電路板的邊緣連接包括用於周邊的 40 引腳邊緣連接,以及圖 3 所示的連接選項。包括電源、接地、通用非同步接收器和發射器 (UART)、通用輸入和輸出 (GPIO)、脈寬調變 (PWM)、類比數位轉換器 (ADC)、序列周邊互連 (SPI)、內部積體電路 (I2C) 介面和除錯。

Raspberry Pi Pico 邊緣連接的引腳配置示意圖 (按此放大)圖 3:Raspberry Pi Pico 邊緣連接的引腳配置提供多種周邊存取。(圖片來源:Raspberry Pi)

分接板選項

當 Raspberry Pi 用於快速原型製作時,就必須可輕鬆存取電路板的邊緣連接器。其中一個存取方法就是裝上排針座並使用分接板。只是這個解決方案通常會導致電線一團亂,進而發生失誤。因此,分線板提供多種選擇,可擴充邊緣連接器,以配合更多種現成介面。

例如,BridgetekMM2040EV Pico 模組板將大多數邊緣連接器分拆成引腳和插座連接。此外,Seeed Studio 也有推出 Pico 用的 103100142 擴充板,可讓每個週邊介面當作連接器。每個連接器的引腳都可相容於擴充板,可藉此添加功能,例如慣性感測器、馬達驅動器和測距儀等。

選擇 C 還是 MicroPython?

嵌入式系統傳統上都是用 C 語言編寫,因為可用較高階的系統應用作法平衡低階控制。但目前 C 語言的問題在於,這是一個已有五十年歷史的古老程式設計語言,很少有學校在教授這門課程了。此外也很容易出現程式錯誤並造成損壞。儘管有這些潛在問題,但 C 語言仍是絕大多數嵌入式系統開發時的首選語言。

Raspberry Pi Pico 生態系統提供 C 語言替代方案就是 MicroPython。MicroPython 是一種 CPython 埠,可在 MCU 架構系統上運作。雖然這無疑比 C 語言消耗更多處理器資源,但卻是許多開發人員熟悉且慣用的現代化程式語言。MicroPython 可以抽取 MCU 和硬體的低階細節。硬體存取可透過容易學習的高階應用程式開發介面 (API) 進行,這對期限緊迫的專案來說相當重要。

在挑選使用哪個軟體開發套件 (SDK) 時 (C 或 MicroPython),開發人員要關注特定需求。與 MicroPython 相比,使用 C 語言就能對 MCU 暫存器達到低階存取、記憶體佔用更小且效率更高。

設定 C SDK

使用 C SDK 建立閃爍的 LED 應用時,有幾個選項。首先就是查閱 SDK 文件並按照指示進行。第二個是使用預設的 Docker 容器自動安裝入門所需的所有工具。第三個選項是手動安裝工具鏈和 Raspberry Pi Pico 範例程式碼,包括:

  • Git
  • Python 3
  • Cmake
  • gcc-arm-none-eabi \
  • libnewlib-arm-none-eabi

若要取得 Raspberry Pio 範例程式碼,可以利用以下命令複製 Raspberry Pi 的 git 儲存庫:

git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \

     cd /home/sdk/pico-sdk && \

    git submodule update --init &&

安裝完這些函式庫與原始程式碼後,下一步就是探索和編譯一個閃爍的 LED 應用程式。

編寫第一個閃爍的應用程式

C SDK 隨附一個閃爍範例程式,開發人員可以使用此範例來構建第一個應用程式。以下的程式碼清單使用 Pico 的板載 LED 和 PICO_DEFAULT_LED_PIN 指令來設置 I/O 引腳,並以 250 ms 的延遲進行閃爍。

複製
	/**
	 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
	 *
	 * SPDX-License-Identifier: BSD-3-Clause
	 */
	

	#include "pico/stdlib.h"
	

	int main() {
	#ifndef PICO_DEFAULT_LED_PIN
	#warning blink example requires a board with a regular LED
	#else
	    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
	    gpio_init(LED_PIN);
	    gpio_set_dir(LED_PIN, GPIO_OUT);
	    while (true) {
	        gpio_put(LED_PIN, 1);
	        sleep_ms(250);
	        gpio_put(LED_PIN, 0);
	        sleep_ms(250);
	    }
	#endif
	}

程式碼清單:Raspberry Pi Pico使用 PICO_DEFAULT_LED_PIN 指令設置 I/O 引腳,並以 250 ms 的延遲閃爍。(程式碼來源:Raspberry Pi)

根據清單,LED_PIN 分配到預設引腳,然後會調用 C gpio API。gpio_init 可用來初始化引腳,而 gpio_set_dir 則用於將 LED_PIN 設定成輸出。接著會建立一個無限迴圈,每 250 ms 會切換一次 LED 狀態。

應用程式的編譯相對簡單。首先,開發人員要使用以下命令,在 Raspberry Pi Pico 資料夾中建立一個組建目錄:

mkdir build

cd build

接下來則要執行以下命令,為組建準備 cmake:

cmake

現在,開發人員就可切換到 blinky 目錄並執行 make:

cd blink

make

組建流程會輸出 blinky.uf2 檔。編譯後的程式可以載入到 Raspberry Pi Pico 上,只要按住 BOOTSEL 引腳然後將電路板通電即可。RP2 就會顯示成大容量存儲裝置。開發人員需要將 blinky.uf2 檔案拖到磁碟機中,此時,開機載入程式就會安裝應用程式。完成後,LED 應該就會開始閃爍。

結論

Raspberry Pi Pico 對於想在開發週期中享有靈活性的嵌入式開發人員來說,是一個有吸引力的解決方案。提供多種選項,包括獨立解決方案或具有無線連線的電路板。此外,生態系統也支援 C 和 C++,以及 MicroPython。開發人員可以選擇最適合其應用的語言,然後利用對應的 SDK 來加速軟體開發。

DigiKey logo

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。

關於作者

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo 是嵌入式軟體顧問,目前與超過十幾個國家的客戶合作,透過產品品質、成本和上市時間的改善,促成業務的大幅轉型。他曾在嵌入式軟體開發技術上發表超過兩百篇文章,是深思熟慮的講師和技術培訓師,共擁有三個學位,包括密西根大學的工程碩士學位。歡迎透過以下方法洽詢,電郵:[email protected]、網站:www.beningo.com,亦可登記取得他發行的Embedded Bytes 每月電子報

關於出版者

DigiKey 北美編輯群