皆さん こんにちは。
今回は UART で送信してみます。
環境構築やプロジェクトのつくり方
環境構築やプロジェクトのつくり方、VSCodeの起動については、このブログの一番最初の記事に書きました。
環境構築してみたい方は こちら をご覧になってください。
プロジェクトの作成
以下の設定でプロジェクトを作成します。
Project Name: picoUart
Console Options の Console over UART のチェックをはずす
IDE Options の Create VSCode project をチェックする
Debugger: は PicoProbe を選択する

VSCodeを起動する
起動後、何かファイルが開いてたら File – Close Folder で閉じた後、File – Open Folder から picoUart のフォルダーを辿って選択します。
こちらの環境では C:\Users\m3925\Documents\Pico\pico-project-generator\picoUart です。
m3925の部分は皆さんのユーザー名に置き換えてください。
vscode関連の json ファイルは前回作成済のプロジェクトのものをドラッグ&ドロップでコピー&ペーストすると楽です。
ソースコードを書く
VSCodeのツリーから picoUart.c を選択して次のように編集し、保存します。
#include "pico/stdlib.h"
int main()
{
uint8_t *buf = "1234567890\r\n";
stdio_init_all();
uart_init(uart0, 115200);
uart_set_format(uart0, 7, 1, UART_PARITY_EVEN);
gpio_set_function(0, GPIO_FUNC_UART);
gpio_set_function(1, GPIO_FUNC_UART);
char c;
while (true) {
uart_putc_raw(uart0, 'A');
sleep_ms(1000);
uart_write_blocking(uart0, (const uint8_t *)buf, 12);
sleep_ms(1000);
}
return 0;
}
PC側の準備
通信の確認用として Tera Term を使います。
お持ちでない方は こちら からダウンロードしてお使いください。
インストール後、 Tera Term を起動し、シリアルポートでPicoprobeのCOMポートを選択します。
もしCOMポートが複数ある場合には、Picoprobe以外の通信ケーブルをはずしてデバイスマネージャーでCOMポート番号を確認しておきます。

起動後、設定メニューのシリアルポートから以下の設定を行います。
スピート : 115200
データ : 7 bit
パリティ : even
ストップビット : 1
フロー制御 : none
これらの値は送受信する相手と合わせておく必要があります。

次に設定メニューの端末から以下の設定を行います。
改行コードをCR+LFに設定します。

プログラムの説明
ピンにペリフェラル(機能)を割り当てる。
GPIOにUART0を割り当てる
以下の図をご覧ください。
UART0は赤枠で囲ったいずれかのピンで使うことができます。

GP0 というのは GPIO0 を意味します。
GPIO28 も UART0 TX を割り当てられるはずですが図にはありませんね。
誤記でしょうか。
ラズピコからPicoprobeには 1番ピン(GPIO0)を接続していますので、ここに UART0 TX を割り当てます。
そして同様にPicoprobeに接続しているラズピコの2番ピン(GPIO1)に UART0 RX を割り当てます。
コードでは以下の部分になります。
gpio_set_function(0, GPIO_FUNC_UART);
gpio_set_function(1, GPIO_FUNC_UART);
第1引数 : GPIOの番号を指定します。
第2引数 : gpio_function(機能)を指定します。
機能は以下の通りに enum で定義されています。
enum gpio_function {
GPIO_FUNC_XIP = 0 , GPIO_FUNC_SPI = 1 , GPIO_FUNC_UART = 2 , GPIO_FUNC_I2C = 3 ,
GPIO_FUNC_PWM = 4 , GPIO_FUNC_SIO = 5 , GPIO_FUNC_PIO0 = 6 , GPIO_FUNC_PIO1 = 7 ,
GPIO_FUNC_GPCK = 8 , GPIO_FUNC_USB = 9 , GPIO_FUNC_NULL = 0x1f
}
uart_init()で初期化します。
ペリフェラルは概ね、 xxx_init() で初期化されるようです。
xxx の部分はペリフェラル名 i2c とか、spi など。
第1引数 : UARTのインスタンス(0 or 1)を指定します。
第2引数 : 通信速度を指定します。
uart_set_format()で通信パラメーターを指定します。
通信速度だけは別になっているのですね。
第1引数 : UARTのインスタンス(0 or 1)を指定します。
第2引数 : データビットを指定します。
第3引数 : ストップビットを指定します。
第4引数 : パリティを指定します。
RP2040のUARTは2つですから uart0 または uart1 を使います。
パリティは以下の通りに enum で定義されています。
今回は even (偶数)を指定しました。(データビット等も気まぐれで決めただけで特に根拠はありません)
enum uart_parity_t { UART_PARITY_NONE , UART_PARITY_EVEN , UART_PARITY_ODD }
uart_putc_raw()は1文字送信する関数です。
uart_putc()という関数がありますが、関数の中で変換することがあるようでやや特殊なので使いませんでした。
第1引数 : UARTのインスタンス(0 or 1)を指定します。
第2引数 : 送信する文字を指定します。
sleep_ms()は時間待ちです。
今回のコードでは1000を指定したので 1000msec=1秒待ちます。
uart_write_blocking()は指定したバイト数分の文字を送信します。
ブロッキングと書かれているので、送信が完了するまで関数から戻ってきません。
第1引数 : UARTのインスタンス(0 or 1)を指定します。
第2引数 : 送信する文字の入ったバッファーを指定します。
第3引数 : 送信する文字数を指定します。
プログラムを動作させる
それでは VScode にフォーカスをあてて、F5キーを押してプログラムを動作させます。
1秒毎に "A" , "1234567890" が表示され改行されれば成功です。
いかがでしたか?
うまく送信できましたか?
お疲れさまでした。