This is a minor release of the SDK with many bug fixes and documentation improvements, along with some new features.
Highlights are listed below, or you can see the full list of individual commits here, and the full list of resolved issues here.
Board Support
The following boards have been added and may be specified via PICO_BOARD:
sparkfun_iotnode_lorawan_rp2350
waveshare_pico_cam_a
waveshare_rp2040_ble
waveshare_rp2040_eth
waveshare_rp2040_geek
waveshare_rp2040_matrix
waveshare_rp2040_pizero
waveshare_rp2040_power_management_hat_b
waveshare_rp2040_tiny
waveshare_rp2040_touch_lcd_1.28
waveshare_rp2350_eth
waveshare_rp2350_geek
waveshare_rp2350_lcd_0.96
waveshare_rp2350_lcd_1.28
waveshare_rp2350_one
waveshare_rp2350_plus_4mb
waveshare_rp2350_plus_16mb
waveshare_rp2350_tiny
waveshare_rp2350_touch_lcd_1.28
waveshare_rp2350_zero
The following board configurations have been modified:
adafruit_feather_rp2350 - Increased the XOSC startup delay
seeed_xiao_rp2350 - Increased the default SPI clock divider
waveshare_rp2040_lcd_0.96 - Renamed WAVESHARE_RP2040_LCD_* constants to WAVESHARE_LCD_*
waveshare_rp2040_lcd_1.28 - Renamed WAVESHARE_RP2040_LCD_* constants to WAVESHARE_LCD_*
Note: the default PICO_XOSC_STARTUP_DELAY_MULTIPLIER (unless specified by a board header file) has been changed from 1 to 6, meaning a delay of 6ms, as testing of the recommended crystal shows it can take up to this long to stabilize.
200Mhz Clock Support for RP2040
RP2040 has now been certified to run at a system clock of 200Mhz when using a regulator voltage of at least 1.15 volts.
The SDK by default performs clock setup for you before your program enters main(). If you haven't customized the clock configuration in any way, it will attempt to configure the system clock based on the value of SYS_CLK_MHZ (or SYS_CLK_KHZ/SYS_CLK_HZ if specified instead). Without further information from you, it can only do this for specific clock frequencies.
In prior versions of the SDK, only one specific clock frequency was defined per platform, 125Mhz for RP2040 and 150Mhz for RP2350, which also happen to be the default values for SYS_CLK_MHZ
With this version of the SDK, you can now select a 200Mhz clock for RP2040 simply by setting SYS_CLK_MHZ=200 via preprocessor define. The regulator voltage will automatically be raised for you if necessary.
We may certify new frequencies for the different platforms in the future. The original SYS_CLK_MHZ defaults are left unchanged because not all programs would function correctly at a different system clock frequency. If, however, your project would always benefit from the fastest clock, you may now define PICO_USE_FASTEST_SUPPORTED_CLOCK=1 via CMake variable or as a preprocessor define, and it will always use the fastest supported system clock frequency for the platform in the future.
Notable Library Changes/Improvements
hardware_clocks
Corrected documentation and implementation of clock_configure() supporting the full range of clock dividers
Added PICO_USE_FASTEST_SUPPORTED_CLOCK and PLL configuration for 200Mhz on RP2040
hardware_flash
Move internal flash helper function to run from RAM instead of flash, so it was supported in builds other than COPY_TO_RAM
hardware_irq
Added significantly improved documentation around IRQ handlers when using both cores
Added enable_interrupts() and disable_interrupts() methods for when you don't care about saving or restoring the current interrupt state
Added irq_has_handler() method to tell if a handler is installed for a particular IRQ number
hardware_pio
Fixed support for WAIT gpio with GPIO number >= 32
pico_aon_timer
Added a 2 RTC-clock propagation delay at the end of aon_timer_set_time_calendar() on RP2040, such that reading back the time immediately afterwards will return the right value
pico_bootrom
Added rom_data_lookup_inline() to complement rom_data_lookup()
pico_btstack
Updated BTStack to 1.6.2 from 1.6.1
Updated Raspberry Pi BTStack license to cover Pico 2 W, Pico 2 WH, and RM2
pico_cyw43_driver
Updated cyw43_driver to revision c1075d4b
Fixed rare issue when loading firmware
pico_double
Major cleanup, with much improved documentation
Implemented the full complement of double conversion functions defined in pico/double.h across both RP2040 and RP2350 variants of pico_double_pico
pico_float
Major cleanup, with much improved documentation
RP2350 pico_float_pico_dcp variant now enables -msoft-float, since if you've chosen to use DCP instead of VFP for single-precision floating-point, you probably don't want the compiler emitting inline VFP instructions either
Implemented the full complement of float conversion functions defined in pico/float.h across RP2040 and all RP2350 variants of pico_float_pico
pico_flash
Fixed a build error when using FreeRTOS with configSUPPORT_DYNAMIC_ALLOCATION=0
pico_lwip
Fixed build with PPP_SUPPORT=1 when using pico_lwip_nosys
pico_mbedtls
Added correct cleanup of RP2350 SHA256 state during mbedtls_sha256_free()
pico_multicore
Added multicore_lockout_victim_deinit()
multicore_reset_core1() now marks Core 1 as de-initialized w.r.t. multicore_lockout_victim_ functions, allowing multicore_lockout_victim_init() to perform correctly after the reset
pico_runtime_init
Added SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST to indicate the voltage regular should be set to SYS_CLK_VREG_VOLTAGE_MIN during default clock setup in order to support the configured system clock frequency
pico_sha256
Added pico_sha256_cleanup() to clean up from an in-progress SHA256 operation which was not completed via pico_sha256_finish()
pico_stdio_usb
Allow user to override CFG_TUD_CDC_RX_BUFSIZE,
CFG_TUD_CDC_TX_BUFSIZE and CFG_TUD_CDC_EP_BUFSIZE defines to increase performance
pico_time
Fixed a rare race condition that could cause alarms/repeating timers to get "lost"
FreeRTOS support for RP2350 (Arm/RISC-V) has been upstreamed to https://github.com/FreeRTOS/FreeRTOS-Kernel, however is not yet in any official release, so you should use the latest from the main branch there and make sure you initialize the submodules as RP2350 support is actually in a submodule
If your project embeds FreeRTOS_Kernel_import.cmake, you should update to the latest version here which works for both RP2040 and RP2350
Pioasm
Fixed encoding of WAIT GPIO with GPIO number >= 32
Python output now correctly emits word(x) for all PIO version 1 (RP2350) PIO instructions
SVD
Fixed access type for DMA CHAN_ABORT register to be read-write (with clear-on-write) for both RP2040 and RP2350
Build
GCC 14 is now supported
LLVM Embedded Toolchain For Arm 19.x is now supported
Multiple .pio files now supported in pico_generate_pio_header()
.DIS files for builds using LLVM/Clang on RP2350 now contain correct disassembly for VFP floating point instructions
Fixed some newer CMake version deprecation warnings
Added explicit license to pico_sdk_import.cmake as it is copied into external projects
Bazel Build
Updated LLVM/Clang toolchain to fix stack overflow issue with fma() related math functions
These examples were added in the 2.1.0 timeframe but were not listed in the release notes then:
Example|Description
---|---
binary_info/blink_any | Uses bi_ptr variables to create a configurable blink binary - see the separate readme for mote details
binary_info/hello_anything | Uses bi_ptr variables to create a configurable hello_world binary - see the separate readme for more details
i2c/slave_mem_i2c_burst | i2c slave example where the slave implements a 256 byte memory. This version inefficiently writes each byte in a separate call to demonstrate read and write burst mode.
pico_w/wifi/picow_blink_slow_clock | Blinks the on-board LED (which is connected via the WiFi chip) with a slower system clock to show how to reconfigure communication with the WiFi chip at run time under those circumstances
pico_w/wifi/picow_blink_fast_clock | Blinks the on-board LED (which is connected via the WiFi chip) with a faster system clock to show how to reconfigure communication with the WiFi chip at build time under those circumstances
pico_w/wifi/picow_http_client | Demonstrates how to make http and https requests
pico_w/wifi/picow_http_client_verify | Demonstrates how to make a https request with server authentication
pico_w/wifi/freertos/picow_freertos_http_client_sys | Demonstrates how to make a https request in NO_SYS=0 (i.e. full FreeRTOS integration)
universal/blink | Same as the blink example, but universal.
universal/nuke_universal | Same as the flash/nuke example, but universal. On RP2350 runs as a packaged SRAM binary, so is written to flash and copied to SRAM by the bootloader
Added in 2.1.1 timeframe
Example|Description
---|---
pico_w/wifi/mqtt/picow_mqtt_client | Demonstrates how to implement a MQTT client application
pio/uart_pio_dma | Send and receive data from a UART implemented using the PIO and DMA
usb/device/dev_multi_cdc | A USB CDC device example with two serial ports, one of which is used for standard SDK stdio. The example exposes two serial ports over USB to the host. The first port is used for stdio, and the second port is used for a simple echo loopback. You can connect to the second port and send some characters, and they will be echoed back on the first port while you will receive a "OK\r\n" message on the second port indicating that the data was received.
Authors
Thanks to the following for their contributions:
Steven Conaway,
David Dyck,
d-c-d,
Liam Fraser,
gazzyt,
Hardy Griech,
Wu Haotian,
Dan Halbert,
Peter Harper,
Petr Hosek,
Richard Hulme,
HugoTro,
Jean Jonethal,
Osman Karaketir,
Lesords,
Gregory Neverov,
nilswiersma,
Matthias Ringwald,
Graham Sanderson,
Andrew Scheller,
Matias Silva,
Arkin Solomon,
William Vinnicombe,
Dryw Wade,
waveshare,
Luke Wren,
Enrico Zaghini