PIO state machine configuration. More...

Data Structures

struct  pio_sm_config
 PIO Configuration structure. More...
 

Functions

static void sm_config_set_out_pins (pio_sm_config *c, uint out_base, uint out_count)
 Set the 'out' pins in a state machine configuration. More...
 
static void sm_config_set_set_pins (pio_sm_config *c, uint set_base, uint set_count)
 Set the 'set' pins in a state machine configuration. More...
 
static void sm_config_set_in_pins (pio_sm_config *c, uint in_base)
 Set the 'in' pins in a state machine configuration. More...
 
static void sm_config_set_sideset_pins (pio_sm_config *c, uint sideset_base)
 Set the 'sideset' pins in a state machine configuration. More...
 
static void sm_config_set_sideset (pio_sm_config *c, uint bit_count, bool optional, bool pindirs)
 Set the 'sideset' options in a state machine configuration. More...
 
static void sm_config_set_clkdiv_int_frac (pio_sm_config *c, uint16_t div_int, uint8_t div_frac)
 Set the state machine clock divider (from integer and fractional parts - 16:8) in a state machine configuration. More...
 
static void sm_config_set_clkdiv (pio_sm_config *c, float div)
 Set the state machine clock divider (from a floating point value) in a state machine configuration. More...
 
static void sm_config_set_wrap (pio_sm_config *c, uint wrap_target, uint wrap)
 Set the wrap addresses in a state machine configuration. More...
 
static void sm_config_set_jmp_pin (pio_sm_config *c, uint pin)
 Set the 'jmp' pin in a state machine configuration. More...
 
static void sm_config_set_in_shift (pio_sm_config *c, bool shift_right, bool autopush, uint push_threshold)
 Setup 'in' shifting parameters in a state machine configuration. More...
 
static void sm_config_set_out_shift (pio_sm_config *c, bool shift_right, bool autopull, uint pull_threshold)
 Setup 'out' shifting parameters in a state machine configuration. More...
 
static void sm_config_set_fifo_join (pio_sm_config *c, enum pio_fifo_join join)
 Setup the FIFO joining in a state machine configuration. More...
 
static void sm_config_set_out_special (pio_sm_config *c, bool sticky, bool has_enable_pin, uint enable_pin_index)
 Set special 'out' operations in a state machine configuration. More...
 
static void sm_config_set_mov_status (pio_sm_config *c, enum pio_mov_status_type status_sel, uint status_n)
 Set source for 'mov status' in a state machine configuration. More...
 
static pio_sm_config pio_get_default_sm_config (void)
 Get the default state machine configuration. More...
 
static void pio_sm_set_out_pins (PIO pio, uint sm, uint out_base, uint out_count)
 Set the current 'out' pins for a state machine. More...
 
static void pio_sm_set_set_pins (PIO pio, uint sm, uint set_base, uint set_count)
 Set the current 'set' pins for a state machine. More...
 
static void pio_sm_set_in_pins (PIO pio, uint sm, uint in_base)
 Set the current 'in' pins for a state machine. More...
 
static void pio_sm_set_sideset_pins (PIO pio, uint sm, uint sideset_base)
 Set the current 'sideset' pins for a state machine. More...
 

Detailed Description

PIO state machine configuration.

A PIO block needs to be configured, these functions provide helpers to set up configuration structures. See pio_sm_set_config

Function Documentation

◆ pio_get_default_sm_config()

static pio_sm_config pio_get_default_sm_config ( void  )
inlinestatic

Get the default state machine configuration.

Setting Default
Out Pins 32 starting at 0
Set Pins 0 starting at 0
In Pins (base) 0
Side Set Pins (base) 0
Side Set disabled
Wrap wrap=31, wrap_to=0
In Shift shift_direction=right, autopush=false, push_thrshold=32
Out Shift shift_direction=right, autopull=false, pull_thrshold=32
Jmp Pin 0
Out Special sticky=false, has_enable_pin=false, enable_pin_index=0
Mov Status status_sel=STATUS_TX_LESSTHAN, n=0
Returns
the default state machine configuration which can then be modified.

◆ pio_sm_set_in_pins()

static void pio_sm_set_in_pins ( PIO  pio,
uint  sm,
uint  in_base 
)
inlinestatic

Set the current 'in' pins for a state machine.

Can overlap with the 'out', ''set' and 'sideset' pins

Parameters
pioThe PIO instance; either pio0 or pio1
smState machine index (0..3)
in_base0-31 First pin to use as input

◆ pio_sm_set_out_pins()

static void pio_sm_set_out_pins ( PIO  pio,
uint  sm,
uint  out_base,
uint  out_count 
)
inlinestatic

Set the current 'out' pins for a state machine.

Can overlap with the 'in', 'set' and 'sideset' pins

Parameters
pioThe PIO instance; either pio0 or pio1
smState machine index (0..3)
out_base0-31 First pin to set as output
out_count0-32 Number of pins to set.

◆ pio_sm_set_set_pins()

static void pio_sm_set_set_pins ( PIO  pio,
uint  sm,
uint  set_base,
uint  set_count 
)
inlinestatic

Set the current 'set' pins for a state machine.

Can overlap with the 'in', 'out' and 'sideset' pins

Parameters
pioThe PIO instance; either pio0 or pio1
smState machine index (0..3)
set_base0-31 First pin to set as
set_count0-5 Number of pins to set.

◆ pio_sm_set_sideset_pins()

static void pio_sm_set_sideset_pins ( PIO  pio,
uint  sm,
uint  sideset_base 
)
inlinestatic

Set the current 'sideset' pins for a state machine.

Can overlap with the 'in', 'out' and 'set' pins

Parameters
pioThe PIO instance; either pio0 or pio1
smState machine index (0..3)
sideset_base0-31 base pin for 'side set'

◆ sm_config_set_clkdiv()

static void sm_config_set_clkdiv ( pio_sm_config c,
float  div 
)
inlinestatic

Set the state machine clock divider (from a floating point value) in a state machine configuration.

The clock divider slows the state machine's execution by masking the system clock on some cycles, in a repeating pattern, so that the state machine does not advance. Effectively this produces a slower clock for the state machine to run from, which can be used to generate e.g. a particular UART baud rate. See the datasheet for further detail.

Parameters
cPointer to the configuration structure to modify
divThe fractional divisor to be set. 1 for full speed. An integer clock divisor of n will cause the state machine to run 1 cycle in every n. Note that for small n, the jitter introduced by a fractional divider (e.g. 2.5) may be unacceptable although it will depend on the use case.

◆ sm_config_set_clkdiv_int_frac()

static void sm_config_set_clkdiv_int_frac ( pio_sm_config c,
uint16_t  div_int,
uint8_t  div_frac 
)
inlinestatic

Set the state machine clock divider (from integer and fractional parts - 16:8) in a state machine configuration.

The clock divider can slow the state machine's execution to some rate below the system clock frequency, by enabling the state machine on some cycles but not on others, in a regular pattern. This can be used to generate e.g. a given UART baud rate. See the datasheet for further detail.

Parameters
cPointer to the configuration structure to modify
div_intInteger part of the divisor
div_fracFractional part in 1/256ths
See also
sm_config_set_clkdiv()

◆ sm_config_set_fifo_join()

static void sm_config_set_fifo_join ( pio_sm_config c,
enum pio_fifo_join  join 
)
inlinestatic

Setup the FIFO joining in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
joinSpecifies the join type.
See also
enum pio_fifo_join

◆ sm_config_set_in_pins()

static void sm_config_set_in_pins ( pio_sm_config c,
uint  in_base 
)
inlinestatic

Set the 'in' pins in a state machine configuration.

Can overlap with the 'out', ''set' and 'sideset' pins

Parameters
cPointer to the configuration structure to modify
in_base0-31 First pin to use as input

◆ sm_config_set_in_shift()

static void sm_config_set_in_shift ( pio_sm_config c,
bool  shift_right,
bool  autopush,
uint  push_threshold 
)
inlinestatic

Setup 'in' shifting parameters in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
shift_righttrue to shift ISR to right, false to shift ISR to left
autopushwhether autopush is enabled
push_thresholdthreshold in bits to shift in before auto/conditional re-pushing of the ISR

◆ sm_config_set_jmp_pin()

static void sm_config_set_jmp_pin ( pio_sm_config c,
uint  pin 
)
inlinestatic

Set the 'jmp' pin in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
pinThe raw GPIO pin number to use as the source for a jmp pin instruction

◆ sm_config_set_mov_status()

static void sm_config_set_mov_status ( pio_sm_config c,
enum pio_mov_status_type  status_sel,
uint  status_n 
)
inlinestatic

Set source for 'mov status' in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
status_selthe status operation selector.
See also
enum pio_mov_status_type
Parameters
status_nparameter for the mov status operation (currently a bit count)

◆ sm_config_set_out_pins()

static void sm_config_set_out_pins ( pio_sm_config c,
uint  out_base,
uint  out_count 
)
inlinestatic

Set the 'out' pins in a state machine configuration.

Can overlap with the 'in', 'set' and 'sideset' pins

Parameters
cPointer to the configuration structure to modify
out_base0-31 First pin to set as output
out_count0-32 Number of pins to set.

◆ sm_config_set_out_shift()

static void sm_config_set_out_shift ( pio_sm_config c,
bool  shift_right,
bool  autopull,
uint  pull_threshold 
)
inlinestatic

Setup 'out' shifting parameters in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
shift_righttrue to shift OSR to right, false to shift OSR to left
autopullwhether autopull is enabled
pull_thresholdthreshold in bits to shift out before auto/conditional re-pulling of the OSR

◆ sm_config_set_out_special()

static void sm_config_set_out_special ( pio_sm_config c,
bool  sticky,
bool  has_enable_pin,
uint  enable_pin_index 
)
inlinestatic

Set special 'out' operations in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
stickyto enable 'sticky' output (i.e. re-asserting most recent OUT/SET pin values on subsequent cycles)
has_enable_pintrue to enable auxiliary OUT enable pin
enable_pin_indexpin index for auxiliary OUT enable

◆ sm_config_set_set_pins()

static void sm_config_set_set_pins ( pio_sm_config c,
uint  set_base,
uint  set_count 
)
inlinestatic

Set the 'set' pins in a state machine configuration.

Can overlap with the 'in', 'out' and 'sideset' pins

Parameters
cPointer to the configuration structure to modify
set_base0-31 First pin to set as
set_count0-5 Number of pins to set.

◆ sm_config_set_sideset()

static void sm_config_set_sideset ( pio_sm_config c,
uint  bit_count,
bool  optional,
bool  pindirs 
)
inlinestatic

Set the 'sideset' options in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
bit_countNumber of bits to steal from delay field in the instruction for use of side set (max 5)
optionalTrue if the topmost side set bit is used as a flag for whether to apply side set on that instruction
pindirsTrue if the side set affects pin directions rather than values

◆ sm_config_set_sideset_pins()

static void sm_config_set_sideset_pins ( pio_sm_config c,
uint  sideset_base 
)
inlinestatic

Set the 'sideset' pins in a state machine configuration.

Can overlap with the 'in', 'out' and 'set' pins

Parameters
cPointer to the configuration structure to modify
sideset_base0-31 base pin for 'side set'

◆ sm_config_set_wrap()

static void sm_config_set_wrap ( pio_sm_config c,
uint  wrap_target,
uint  wrap 
)
inlinestatic

Set the wrap addresses in a state machine configuration.

Parameters
cPointer to the configuration structure to modify
wrap_targetthe instruction memory address to wrap to
wrapthe instruction memory address after which to set the program counter to wrap_target if the instruction does not itself update the program_counter