1 #include "hardware/clocks.h"
2 #include "hardware/gpio.h"
3 #include "SoftwareSerial/pio_uart_tx.h"
4 #include "SoftwareSerial/pio_uart_rx.h"
15 SoftwareSerial(PIO pio = pio1, uint stateMachineRxIndex=0,uint stateMachineTxIndex=1) {
17 this->sm_rx = stateMachineRxIndex;
18 this->sm_tx = stateMachineTxIndex;
21 void begin(uint baud=9800,
int rxPin=-1,
int txPin=-1 ){
38 virtual int available() {
39 return pio_sm_get_rx_fifo_level (pio, sm_rx);
44 int result = peekValue;
49 io_rw_8 *rxfifo_shift = (io_rw_8*)&pio->rxf[sm_rx] + 3;
50 if (pio_sm_is_rx_fifo_empty(pio, sm_rx))
53 tight_loop_contents();
54 return (
char)*rxfifo_shift;
57 virtual size_t write(uint8_t c) {
58 pio_sm_put_blocking(pio, sm_tx, (uint32_t)c);
74 void setupRx(uint pin) {
75 pio_sm_set_consecutive_pindirs(pio, sm_rx, pin, 1,
false);
76 pio_gpio_init(pio, pin);
79 int offset = pio_add_program(pio, &pio_uart_rx_program);
80 pio_sm_config c = pio_uart_rx_program_get_default_config(offset);
81 sm_config_set_in_pins(&c, pin);
82 sm_config_set_jmp_pin(&c, pin);
84 sm_config_set_in_shift(&c,
true,
false, 32);
86 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
88 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
89 sm_config_set_clkdiv(&c, div);
91 pio_sm_init(pio, sm_rx, offset, &c);
92 pio_sm_set_enabled(pio, sm_rx,
true);
95 void setupTx(uint pin_tx) {
98 pio_sm_set_pins_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
99 pio_sm_set_pindirs_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
100 pio_gpio_init(pio, pin_tx);
102 int offset = pio_add_program(pio, &pio_uart_tx_program);
103 pio_sm_config c = pio_uart_tx_program_get_default_config(offset);
106 sm_config_set_out_shift(&c,
true,
false, 32);
111 sm_config_set_out_pins(&c, pin_tx, 1);
112 sm_config_set_sideset_pins(&c, pin_tx);
115 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
118 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
119 sm_config_set_clkdiv(&c, div);
121 pio_sm_init(pio, sm_tx, offset, &c);
122 pio_sm_set_enabled(pio, sm_tx,
true);
Software Serial Arduino Stream which uses the Pico PIO.
Definition: SoftwareSerial.h:13