Raspberry Pi Pico のGPIO操作(入出力ピン操作)

 Raspberry Pi Pico(ラズパイPico、RP2040)をArduinoの開発環境からプログラムしてます。

 デジタルI/Oのピン操作は、ArduinoのdigitalRead/Writeよりも、C/C++記述のほうがやれることが多く便利で処理も早いです。よく使いそうなGPIO操作、主に入出力ピン操作のC/C++記述をいくつかまとめておきます。今回の内容はArduinoIDEでもそのまま記述可能です。

▼ラズパイPicoをArduinoIDEで動かす方法はこちら▼

スポンサーリンク
スポンサーリンク

GPIOピンの設定

 ArduinoでいうpinMode()にあたる関数です。I/Oピンの入出力設定、また内蔵プルアップダウンの設定です。C/C++では一度に複数ピンの設定が可能な関数があるため少し便利です。

void gpio_set_function(uint8_t gpio, enum gpio_function fn)
 //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 = 0xf

▲指定したピンの機能を定義します。入出力ピンに設定するにはSIO(5n)にします。

static void gpio_set_dir(uint8_t gpio, bool out)                //指定ピンの入出力設定、out(true) => 出力、in(false) => 入力
static void gpio_set_dir_out_masked(uint32_t mask)              //複数ピンを出力に設定、GP0-GP29  => 32bitで指定
static void gpio_set_dir_in_masked(uint32_t mask)               //複数ピンを入力に設定、GP0-GP29  => 32bitで指定
static void gpio_set_dir_all_bits(uint32_t values)              //すべてのピン方向を設定 1 => 出力、0 => 入力
static void gpio_set_dir_masked(uint32_t mask, uint32_t value)  //複数ピンを指定し入出力を設定
//                                                                 └ ex. gpio_set_dir_masked(0x07,0x05)
//                                                                        └ 0x07:b00000111 GP0~GP2ピンを指定
//                                                                        └ 0x05:b00000101 GP0出力,GP1入力,GP2出力

▲ピンの入出力(In/Out)の方向を設定します。

static void gpio_pull_up(uint8_t gpio)
static void gpio_pull_down(uint8_t gpio)

▲指定したピンの内蔵プルアップ/ダウンをONします。ともに中身はgpio_set_pulls()関数を呼び出してます。また他にもピンの状態(プルアップ/ダウン)を確認したり、解除したりする関数もありますがあまり使わなそうので割愛。

void gpio_init(uint8_t gpio)            //指定したピンを初期化
void gpio_init_mask(uint32_t gpio_mask) //複数ピンを同時に初期化

▲指定したピンを初期化します。SIOピンに割り当て、入力設定にし、出力値をクリアします。

 ピン入出力設定関係でよく使いそうな関数はこんなところです。一度に複数の設定はできないけど、設定だけなら、個人的にはArduinoのpinMode()関数使ったほうが簡素で簡単。

▼入出力ピンの設定例▼

//GP2ピンを入力に設定
gpio_init(GP2);
gpio_set_dir(GP2, 0);
gpio_pull_up(GP2);

//GP3ピンを出力に設定
gpio_init(GP3);
gpio_set_dir(GP3, 1);

▲簡単ですが記述例です。

 次に入出力ピンの操作です。

スポンサーリンク

GPIOピンの操作

ArduinoでいうdigitalWrite()にあたる関数です。こちらはC/C++で記述したほうが複数ピンを同時に操作できたり、処理速度が速かったりとメリットがそこそこあります。

static void gpio_put(uint8_t gpio, bool value)             //指定ピンをHIGH/LOWで駆動
static void gpio_put_masked(uint32_t mask, uint32_t value) //指定した複数ピンをHIGH/LOWでビット駆動
//                                                           └ ex. gpio_put_masked(0x0f,0x05);
//                                                             0x0f:B00001111 GP0~GP3ピンの  
//                                                             0x05:B00000101 GP0,2をHIGH GP1,3をLOW
static void gpio_set_mask(uint32_t mask)                   //複数ピンを同時にHIGH
static void gpio_clr_mask(uint32_t mask)                   //複数ピンを同時にLOW
static void gpio_xor_mask(uint32_t mask)                   //複数ピンを同時に反転

▲複数ピンをビット操作で同時に駆動できるのはArduino関数には無いため便利です。

static bool gpio_get(uint gpio)   //指定したピン状態を確認
static uint32_t gpio_get_all()    //すべてのピン状態を確認

digitalRead()にあたる関数

 入出力関係のC/C++でのGPIO関数はこんなところです。他、割り込み関係の設定やペリフェラル(UART、SPI、I2Cなど)のピン割り当てなどがありますが、またそれぞれの機能を使うときに詳しく見ていきたいと思います。

コメント