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 delayseeed_xiao_rp2350
- Increased the default SPI clock dividerwaveshare_rp2040_lcd_0.96
- RenamedWAVESHARE_RP2040_LCD_*
constants toWAVESHARE_LCD_*
waveshare_rp2040_lcd_1.28
- RenamedWAVESHARE_RP2040_LCD_*
constants toWAVESHARE_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()
anddisable_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 complementrom_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 revisionc1075d4b
- 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 ofpico_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 ofpico_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 usingpico_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, allowingmulticore_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 toSYS_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 viapico_sha256_finish()
pico_stdio_usb
- Allow user to override
CFG_TUD_CDC_RX_BUFSIZE
,
CFG_TUD_CDC_TX_BUFSIZE
andCFG_TUD_CDC_EP_BUFSIZE
defines to increase performance
pico_time
- Fixed a rare race condition that could cause alarms/repeating timers to get "lost"
TinyUSB
- Updated TinyUSB to 0.18.0 from 0.17.0
FreeRTOS
- 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
New Examples
These are in the pico_examples repository.
Added in 2.1.0 timeframe
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