@hippy There is no wrong way, but I remembered a clean way is to use a custom board file.
Example, use a regular Raspberry Pi Pico and copy the pico.h board file to the root of your project, rename, and edit. Then use a couple lines in CMakeLists.txt
directory listing for project:CMakeLists.txt (note two lines of setting some variables for the custom board file and where to find it)main.cpico_uart.h (custom board header)This produces the exact same output ![Smile :)]()
Example, use a regular Raspberry Pi Pico and copy the pico.h board file to the root of your project, rename, and edit. Then use a couple lines in CMakeLists.txt
directory listing for project:
Code:
breaker@ace:~/pico/redirected-stdio-uart$ lsCMakeLists.txt build/ main.c pico_sdk_import.cmake pico_uart.hCode:
set(PROJECT redirected-stdio-uart)cmake_minimum_required(VERSION 3.12)set(PICO_BOARD pico_uart CACHE STRING "Board type")set(PICO_BOARD_HEADER_DIRS "${CMAKE_CURRENT_LIST_DIR}")include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)project(${PROJECT} C CXX ASM)pico_sdk_init()add_executable(${PROJECT} main.c)target_link_libraries(${PROJECT} pico_stdlib)pico_add_extra_outputs(${PROJECT})pico_enable_stdio_usb(${PROJECT} 0)pico_enable_stdio_uart(${PROJECT} 1)Code:
#include <stdio.h>#include "pico/stdlib.h"#define UART_NUMBER uart_get_index(PICO_DEFAULT_UART)int main(void) { stdio_init_all(); while (true) { printf("Hello from standard out over UART%d pins %d (TX) and %d (RX)\n", UART_NUMBER, PICO_DEFAULT_UART_TX_PIN, PICO_DEFAULT_UART_RX_PIN); sleep_ms(1000); }}Code:
/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */// -----------------------------------------------------// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO// SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES// -----------------------------------------------------// new name pico_uart.h#ifndef _BOARDS_PICO_UART_H#define _BOARDS_PICO_UART_Hpico_board_cmake_set(PICO_PLATFORM, rp2040)// For board detection#define RASPBERRYPI_PICO// --- UART --- EDIT to TX pin 16, RX pin 17#ifndef PICO_DEFAULT_UART#define PICO_DEFAULT_UART 0#endif#ifndef PICO_DEFAULT_UART_TX_PIN#define PICO_DEFAULT_UART_TX_PIN 16#endif#ifndef PICO_DEFAULT_UART_RX_PIN#define PICO_DEFAULT_UART_RX_PIN 17#endif// --- LED ---#ifndef PICO_DEFAULT_LED_PIN#define PICO_DEFAULT_LED_PIN 25#endif// no PICO_DEFAULT_WS2812_PIN// --- I2C ---#ifndef PICO_DEFAULT_I2C#define PICO_DEFAULT_I2C 0#endif#ifndef PICO_DEFAULT_I2C_SDA_PIN#define PICO_DEFAULT_I2C_SDA_PIN 4#endif#ifndef PICO_DEFAULT_I2C_SCL_PIN#define PICO_DEFAULT_I2C_SCL_PIN 5#endif// --- SPI ---#ifndef PICO_DEFAULT_SPI#define PICO_DEFAULT_SPI 0#endif#ifndef PICO_DEFAULT_SPI_SCK_PIN#define PICO_DEFAULT_SPI_SCK_PIN 18#endif#ifndef PICO_DEFAULT_SPI_TX_PIN#define PICO_DEFAULT_SPI_TX_PIN 19#endif#ifndef PICO_DEFAULT_SPI_RX_PIN#define PICO_DEFAULT_SPI_RX_PIN 16#endif#ifndef PICO_DEFAULT_SPI_CSN_PIN#define PICO_DEFAULT_SPI_CSN_PIN 17#endif// --- FLASH ---#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1#ifndef PICO_FLASH_SPI_CLKDIV#define PICO_FLASH_SPI_CLKDIV 2#endifpico_board_cmake_set_default(PICO_FLASH_SIZE_BYTES, (2 * 1024 * 1024))#ifndef PICO_FLASH_SIZE_BYTES#define PICO_FLASH_SIZE_BYTES (2 * 1024 * 1024)#endif// Drive high to force power supply into PWM mode (lower ripple on 3V3 at light loads)#define PICO_SMPS_MODE_PIN 23#ifndef PICO_RP2040_B0_SUPPORTED#define PICO_RP2040_B0_SUPPORTED 1#endif// The GPIO Pin used to read VBUS to determine if the device is battery powered.#ifndef PICO_VBUS_PIN#define PICO_VBUS_PIN 24#endif// The GPIO Pin used to monitor VSYS. Typically you would use this with ADC.// There is an example in adc/read_vsys in pico-examples.#ifndef PICO_VSYS_PIN#define PICO_VSYS_PIN 29#endif#endifStatistics: Posted by breaker — Sat Jan 24, 2026 9:20 pm