cmake_minimum_required(VERSION 3.13)
# Set the Pico SDK path - adjust this to your SDK location
set(PICO_SDK_PATH "${CMAKE_CURRENT_LIST_DIR}/pico-sdk" CACHE PATH "Path to the Raspberry Pi Pico SDK")
# Alternatively, you can set it via environment variable
# set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
# Include the Pico SDK
include(${PICO_SDK_PATH}/pico_sdk_init.cmake)
# Set project name and languages
project(pico2_risc_v_project C CXX ASM)
# Set C/C++ standards
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# Configure for Pico 2 RISC-V
set(PICO_PLATFORM rp2350-riscv)
set(PICO_BOARD pico2)
# Initialize the Pico SDK
pico_sdk_init()
# Add executable
add_executable(main
src/main.c
# Add more source files here
)
# Create map/bin/hex/uf2 files
pico_add_extra_outputs(main)
# Link libraries
target_link_libraries(main
pico_stdlib
pico_multicore
hardware_gpio
hardware_uart
hardware_i2c
hardware_spi
hardware_pwm
hardware_adc
hardware_timer
hardware_watchdog
hardware_clocks
hardware_pll
hardware_flash
hardware_sync
# Add more libraries as needed
)
# Enable USB output, disable UART output
pico_enable_stdio_usb(main 1)
pico_enable_stdio_uart(main 0)
# Set compile options
target_compile_options(main PRIVATE
-Wall
-Wextra
-Werror
-O2
# RISC-V specific optimizations
-march=rv32imafc
-mabi=ilp32f
)
# Set link options
target_link_options(main PRIVATE
-Wl,--print-memory-usage
)
# Add include directories
target_include_directories(main PRIVATE
${CMAKE_CURRENT_LIST_DIR}/include
${CMAKE_CURRENT_LIST_DIR}/src
)
# Optional: Add custom defines
target_compile_definitions(main PRIVATE
PICO_DEFAULT_UART=0
PICO_DEFAULT_UART_TX_PIN=0
PICO_DEFAULT_UART_RX_PIN=1
# Add custom defines here
)
# Optional: Set custom linker script if needed
# set_target_properties(main PROPERTIES
# LINK_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/custom_memmap.ld
# )
# target_link_options(main PRIVATE "LINKER:-T${CMAKE_CURRENT_LIST_DIR}/custom_memmap.ld")
# Print build information
message(STATUS "Building for Pico 2 RISC-V")
message(STATUS "Pico SDK Path: ${PICO_SDK_PATH}")
message(STATUS "Platform: ${PICO_PLATFORM}")
message(STATUS "Board: ${PICO_BOARD}")
# Create a simple main.c if it doesn't exist
set(MAIN_C_CONTENT "#include <stdio.h>
#include \"pico/stdlib.h\"
#include \"hardware/gpio.h\"
const uint LED_PIN = 25;
int main() {
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
printf(\"Hello from Pico 2 RISC-V!\\n\");
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
printf(\"LED blink\\n\");
}
}")
# Create src directory and main.c if they don't exist
file(MAKE_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/src)
if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/src/main.c)
file(WRITE ${CMAKE_CURRENT_LIST_DIR}/src/main.c ${MAIN_C_CONTENT})
message(STATUS "Created src/main.c with example code")
endif()
# Optional: Create include directory
file(MAKE_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include)