2022年8月14日星期日

[PI PICO RP2040] GPIO Function 功能測試 @ C/C++

Raspberry Pi Pico 具有 26 個 GPIO 引腳,GPIO 也是在 MCU 中最基本運作的基礎. 這裡開始打算用一個 C/C++ SDK 程序 對 GPIO 的操作測試。程式文件在 Raspberry 官方網站上都有提供,可以在這個頁面下載. ( https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html )

官方的範例有個名為 hello_7segment 的程式範例,我這裡將改成用 hello_7segment 內使用的方法,來做跑馬燈的功能。並有 Button 中斷控制做啟動及停止。

電路

RP2040,raspberry pi pico

電路中的 LED 是從 GP2 接到 GP9 ,共 8 個 LED。GP10 接一個彈跳開關。



主程式碼


int main(){


    stdio_init_all();
    
    for(int x = Shift_GPIO; x < Shift_GPIO + 8; x++){
        gpio_init(x);
        gpio_set_dir(x,GPIO_OUT);
        gpio_set_outover(x,GPIO_OVERRIDE_INVERT);
    }
    gpio_set_irq_enabled_with_callback(10,   GPIO_IRQ_EDGE_FALL, true, &gpio_callback);


    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);


    uint8_t y;


    while(true){
        
        if(OnButton) {
            uint32_t mask = bits[y] << Shift_GPIO;


            gpio_set_mask(mask);
            sleep_ms(1000);
            gpio_clr_mask(mask);


            y++;
            if(y >= 8){
                y=0;
            }
        }

    }


    return 0;
}

Button 按鍵副程式


void gpio_callback(uint gpio,uint32_t events){


    if(events == 0x4)
    {
        if(OnButton){
            OnButton = 0;
            gpio_put(PICO_DEFAULT_LED_PIN, 1);
        }
        else{
            OnButton = 1;
            gpio_put(PICO_DEFAULT_LED_PIN, 0);
        }
    }
}

呈現的結果是
按 Button 開始跑馬燈 , GP25 LED 不亮
再按 Button 停止跑馬燈, GP25 LED 亮起

gpio_set_outover : 設定 GPIO 輸出模式 ,一般 / 反向 / HIGH / LOW 。 程式是 設定反向
gpio_set_mask : 致能 GPIO 不被改變, 直到執行 gpio_clr_mask, 這與 gpio_put 用法不同。

範例程式

https://github.com/cold63/Pico_C_Project/blob/main/gpio_1/main.c