Datasheet

Table Of Contents
The JMP takes up space in the instruction memory that could be used for other programs
The extra cycle taken to execute the JMP ends up halving the maximum output rate
As the Program Counter (PC) naturally wraps to 0 when incremented past 31, we could solve the second of these by
filling the entire instruction memory with a repeating pattern of set pins, 1 and set pins, 0, but this is wasteful. State
machines have a hardware feature, configured via their EXECCTRL control register, which solves this common case.
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/master/pio/squarewave/squarewave_wrap.pio Lines 11 - 19
11 .program squarewave_wrap
12 ; Like squarewave, but use the state machine's .wrap hardware instead of an
13 ; explicit jmp. This is a free (0-cycle) unconditional jump.
14
15 set pindirs, 1 ; Set pin to output
16 .wrap_target
17 set pins, 1 [1] ; Drive pin high and then delay for one cycle
18 set pins, 0 [1] ; Drive pin low and then delay for one cycle
19 .wrap
After executing an instruction from the program memory, state machines use the following logic to update PC:
1.
If the current instruction is a JMP, and the Condition is true, set PC to the Target
2.
Otherwise, if PC matches EXECCTRL_WRAP_TOP, set PC to EXECCTRL_WRAP_BOTTOM
3.
Otherwise, increment PC, or set to 0 if the current value is 31.
The .wrap_target and .wrap assembly directives in pioasm are essentially labels. They export constants which can be
written to the WRAP_BOTTOM and WRAP_TOP control fields, respectively:
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/master/pio/squarewave/generated/squarewave_wrap.pio.h Lines 1 - 37
Ê1 // -------------------------------------------------- //
Ê2 // This file is autogenerated by pioasm; do not edit! //
Ê3 // -------------------------------------------------- //
Ê4
Ê5 #if !PICO_NO_HARDWARE
Ê6 #include "hardware/pio.h"
Ê7 #endif
Ê8
Ê9 // --------------- //
10 // squarewave_wrap //
11 // --------------- //
12
13 #define squarewave_wrap_wrap_target 1
14 #define squarewave_wrap_wrap 2
15
16 static const uint16_t squarewave_wrap_program_instructions[] = {
17 0xe081, // 0: set pindirs, 1
18 // .wrap_target
19 0xe101, // 1: set pins, 1 [1]
20 0xe100, // 2: set pins, 0 [1]
21 // .wrap
22 };
23
24 #if !PICO_NO_HARDWARE
25 static const struct pio_program squarewave_wrap_program = {
26 .instructions = squarewave_wrap_program_instructions,
27 .length = 3,
28 .origin = -1,
29 };
30
RP2040 Datasheet
3.5. Functional Details 352