This repository has been archived on 2025-11-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
RP2040_Resources/1_Basic_GPIO/digitalOut.md

3.9 KiB

Blinky

The classic, helloWorld of embedded programming. This program turns the LED on and off periodically.

Initial steps:

  • Create new project with project generator.
  • Open the project folder in VSCode.
  • Build the project by pressing the build button at the bottom and select the option with arm-none-eabi.
  • Make sure the build exits with code 0.

Basic Code:

int main()
{
    stdio_init_all();

    const uint OnBoardLED = PICO_DEFAULT_LED_PIN;
    gpio_init(OnBoardLED);
    gpio_set_dir(OnBoardLED, GPIO_OUT);
    while (true){
        gpio_put(OnBoardLED, true);
        sleep_ms(500);
        gpio_put(OnBoardLED, false);
        sleep_ms(500);
    }
}

Explanation:

stdio_init_all(): initialize stuff

OnBoardLED = PICO_DEFAULT_LED_PIN: Get the GPIO number of onboard LED. Remember: this is GPIO Number, NOT PIN NUMBER.

gpio_init(OnBoardLED): Initialize that GPIO pin.

gpio_set_dir(OnBoardLED, GPIO_OUT): Set GPIO direction (GPIO_OUT for writing and GPIO_IN for reading).

while (true){}: Super loop of the program

gpio_put(OnBoardLED, true): Set OnBoardLED pin to on (true to turn on/set to high/voltage to VDD, false to turn off/set to low/voltage to GND)

Pico logic HIGH voltage is 3.3v and LOW voltage is 0v.

sleep_ms(500): sleep for 500ms.


Different Blinky

This makes the pico blink like a beacon, 2 short blinks followed by long delay. A for loop is used for repeating the short blink twice.

for (int i = 0; i < 2; i++)
{
    gpio_put(OnBoardLED, true);
    sleep_ms(50);
    gpio_put(OnBoardLED, false);
    sleep_ms(100);
}
sleep_ms(500);

External Blinky

This program blinks an LED connected to one of the GPIO(General Purpose Input/Output) ports.

For this example, I used Pin 20 == GP15. I connected a resistor to this pin and connected an LED in series with the resistor to the ground, as shown in the image below. This resistor limits the amount of current drawn by the LED. There are other ways to limit the current, which are discussed in this document later.

const uint LEDPin = 15;
gpio_init(LEDPin);
gpio_set_dir(LEDPin, GPIO_OUT);
while (true)
{
    for (int i = 0; i < 2; i++)
    {
        gpio_put(LEDPin, true);
        sleep_ms(50);
        gpio_put(LEDPin, false);
        sleep_ms(100);
    }
    sleep_ms(500);
}

The only change here is in line 1, PICO_DEFAULT_LED_PIN is changed to 15, to represent GP15. Remember: in the program, a GPIO pin is represented by the GP number and NOT by the pin number, as shown in the Pico's Pinout.


Multiple Blinky

This program controls multiple LED connected to various GPIO ports. Here, the program is written such that it looks like a loading bar. For this setup, internal current limits are used. They are toggled programatically as shown in the code below.


int LED1 = 11;
int LED2 = 12;
int LED3 = 13;
int LED4 = 14;
int LED5 = 15;
int LEDS[5] = {LED1, LED2, LED3, LED4, LED5};
for (int i = 0; i < 5; i++)
{
    gpio_init(LEDS[i]);
    gpio_set_dir(LEDS[i], GPIO_OUT);
    gpio_set_drive_strength(LEDS[i], GPIO_DRIVE_STRENGTH_2MA);
}
while (true)
{
    for (int i = 0; i < 5; i++)
    {
        gpio_put(LEDS[i], true);
        sleep_ms(100);
    }
    for (int i = 0; i < 5; i++)
    {
        gpio_put(LEDS[i], false);
        sleep_ms(100);
    }
}
sleep_ms(500);

Explanation:

  • int LEDS[5] = {...}; declares a list of integers of length 5. GPIO numbers of the 5 connected LEDS are stored here.
  • gpio_set_drive_strength(LED[i], GPIO_DRIVE_STRENGTH_2MA) sets the Drive Strength/Current Limit of GPIO port. The RP2040 C SDK provides 4 drive strengths, 2mA, 4mA, 8mA and 12mA.

The rest of the code is similar to the prior examples, which toggles the LEDS one by one, in series and turns them off, creating a loading effect. Visual output can be seen below.