The RP2350 boot ROM seems to randomize memory on a HW reset, including both CPU stacks where we normally stuff the "reset to bootloader" flag. Update the docs and source to remove rp2040.enableDoubleResetBootloader() on RP2350-based boards. Fixes #2606
116 lines
4.1 KiB
ReStructuredText
116 lines
4.1 KiB
ReStructuredText
RP2040 Helper Class
|
|
===================
|
|
|
|
Some of the core functionality of the RP2040 chip powering the Raspberry Pi
|
|
Pico is exposed in the RP2040 class variable ``rp2040``.
|
|
|
|
Core Internals
|
|
--------------
|
|
|
|
int rp2040.f_cpu()
|
|
~~~~~~~~~~~~~~~~~~
|
|
Returns the current frequency of the core clock. This is read at runtime,
|
|
versus the constant ``F_CPU`` macro that is also available. This is useful
|
|
in cases where your code changes the core clock (i.e. low power modes, etc.)
|
|
|
|
int rp2040.cpuid()
|
|
~~~~~~~~~~~~~~~~~~
|
|
Returns the current core ID (0 or 1) of the executing task.
|
|
|
|
uint32_t rp2040.getCycleCount()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns a 32-bit cycle count from then the core started running. Because it
|
|
is only 32-bits, and the Pico runs at 133MHz, this value can loop around
|
|
in a matter of seconds.
|
|
|
|
uint64_t rp2040.getCycleCount64()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns a 64-bit cycle count from then the core started running. This value
|
|
should never loop around in normal mode (at 133MHz it would take over 4,000
|
|
years to overflow).
|
|
|
|
uint32_t rp2040.hwrand32()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns a 32-bit value derived from the CPU cycle counter and the ROSC
|
|
oscillator. Because the ROSC bit is not a true random number generator, the
|
|
values returned may not meet the most stringent random tests. **If your
|
|
application needs absolute bulletproof random numbers, consider using
|
|
dedicated external hardware.**
|
|
|
|
void rp2040.reboot()
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
Forces a hardware reboot of the Pico.
|
|
|
|
Hardware Watchdog
|
|
-----------------
|
|
|
|
void rp2040.wdt_begin(uint32_t delay_ms)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Enables the hardware watchdog timer with a delay value of delay_ms
|
|
milliseconds. Note that on the RP2040, once this function has called, the
|
|
hardware watchdog can _not_ be disabled.
|
|
|
|
The maximum ``delay_ms`` allowed in this call is ``8300``, corresponding
|
|
to 8.3 seconds. Any higher values will be truncated by the hardware.
|
|
|
|
void rp2040.wdt_reset()
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
Reloads the watchdog's counter with the amount of time set by wdt_begin.
|
|
|
|
RP2040::resetReason_t rp2040.getResetReason()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns the reason for the last reset, defined in enum ``RP2040::resetReason_t``.
|
|
See example ```ResetReason``` for some details.
|
|
|
|
|
|
Memory Information
|
|
------------------
|
|
|
|
int rp2040.getFreeHeap()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns the number of bytes free for heap allocation (i.e. malloc, new). Note
|
|
that because there is some overhead, and there may be heap fragmentation,
|
|
this number is an *upper bound* and you generally will only be able to allocate
|
|
less than this returned number.
|
|
|
|
int rp2040.getUsedHeap()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns the number of bytes allocated out of the heap.
|
|
|
|
int rp2040.getTotalHeap()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Returns the total heap that was available to this program at compile time (i.e.
|
|
the Pico RAM size minus things like the ``.data`` and ``.bss`` sections and other
|
|
overhead).
|
|
|
|
Hardware Identification
|
|
-----------------------
|
|
|
|
bool rp2040.isPicoW()
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
Returns the core's best guess if this code is running on a Raspberry Pi Pico W.
|
|
This would let you, possibly, use the same UF2 for Pico and PicoW by simply not
|
|
doing any WiFi calls.
|
|
|
|
Bootloader
|
|
----------
|
|
|
|
void rp2040.enableDoubleResetBootloader() (Pico/RP2040 only)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Add a call anywhere in the sketch to ``rp2040.enableDoubleResetBootloader()`` and
|
|
the core will check for a double-tap on reset, and if found will start the USB
|
|
bootloader.
|
|
|
|
void rp2040.rebootToBootloader()
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Will reboot the RP2040 into USB UF2 upload mode.
|
|
|
|
DMA-based MEMCPY
|
|
----------------
|
|
The onboard DMA engines can copy 4-byte aligned quantities faster than the CPU.
|
|
|
|
void \*rp2040.memcpyDMA(void \*dest, const void \*src, size_t count);
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Uses a DMA engine to transfer data from src to dest in 4-byte chunks without CPU
|
|
intervention. If any arguments are not 4-byte aligned, or if the count is not a
|
|
multiple of 4, then it will fall back to CPU-managed memcpy.
|