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 txPin=-1,
int rxPin=-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);
71 void setupRx(uint pin) {
72 pio_sm_set_consecutive_pindirs(pio, sm_rx, pin, 1,
false);
73 pio_gpio_init(pio, pin);
76 int offset = pio_add_program(pio, &pio_uart_rx_program);
77 pio_sm_config c = pio_uart_rx_program_get_default_config(offset);
78 sm_config_set_in_pins(&c, pin);
79 sm_config_set_jmp_pin(&c, pin);
81 sm_config_set_in_shift(&c,
true,
false, 32);
83 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
85 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
86 sm_config_set_clkdiv(&c, div);
88 pio_sm_init(pio, sm_rx, offset, &c);
89 pio_sm_set_enabled(pio, sm_rx,
true);
92 void setupTx(uint pin_tx) {
95 pio_sm_set_pins_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
96 pio_sm_set_pindirs_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
97 pio_gpio_init(pio, pin_tx);
99 int offset = pio_add_program(pio, &pio_uart_tx_program);
100 pio_sm_config c = pio_uart_tx_program_get_default_config(offset);
103 sm_config_set_out_shift(&c,
true,
false, 32);
108 sm_config_set_out_pins(&c, pin_tx, 1);
109 sm_config_set_sideset_pins(&c, pin_tx);
112 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
115 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
116 sm_config_set_clkdiv(&c, div);
118 pio_sm_init(pio, sm_tx, offset, &c);
119 pio_sm_set_enabled(pio, sm_tx,
true);
Software Serial Arduino Stream which uses the Pico PIO.
Definition: SoftwareSerial.h:13