1 #include "hardware/clocks.h"
2 #include "hardware/gpio.h"
3 #include "SoftwareSerial/pio_uart_tx.h"
4 #include "SoftwareSerial/pio_uart_rx.h"
13 SoftwareSerial(PIO pio = pio1, uint stateMachineRxIndex=0,uint stateMachineTxIndex=1) {
15 this->sm_rx = stateMachineRxIndex;
16 this->sm_tx = stateMachineTxIndex;
19 void begin(uint baud=9800,
int txPin=-1,
int rxPin=-1){
36 virtual int available() {
37 return pio_sm_get_rx_fifo_level (pio, sm_rx);
42 int result = peekValue;
47 io_rw_8 *rxfifo_shift = (io_rw_8*)&pio->rxf[sm_rx] + 3;
48 if (pio_sm_is_rx_fifo_empty(pio, sm_rx))
51 tight_loop_contents();
52 return (
char)*rxfifo_shift;
55 virtual size_t write(uint8_t c) {
56 pio_sm_put_blocking(pio, sm_tx, (uint32_t)c);
69 void setupRx(uint pin) {
70 pio_sm_set_consecutive_pindirs(pio, sm_rx, pin, 1,
false);
71 pio_gpio_init(pio, pin);
74 int offset = pio_add_program(pio, &pio_uart_rx_program);
75 pio_sm_config c = pio_uart_rx_program_get_default_config(offset);
76 sm_config_set_in_pins(&c, pin);
77 sm_config_set_jmp_pin(&c, pin);
79 sm_config_set_in_shift(&c,
true,
false, 32);
81 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
83 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
84 sm_config_set_clkdiv(&c, div);
86 pio_sm_init(pio, sm_rx, offset, &c);
87 pio_sm_set_enabled(pio, sm_rx,
true);
90 void setupTx(uint pin_tx) {
93 pio_sm_set_pins_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
94 pio_sm_set_pindirs_with_mask(pio, sm_tx, 1u << pin_tx, 1u << pin_tx);
95 pio_gpio_init(pio, pin_tx);
97 int offset = pio_add_program(pio, &pio_uart_tx_program);
98 pio_sm_config c = pio_uart_tx_program_get_default_config(offset);
101 sm_config_set_out_shift(&c,
true,
false, 32);
106 sm_config_set_out_pins(&c, pin_tx, 1);
107 sm_config_set_sideset_pins(&c, pin_tx);
110 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
113 float div = (float)clock_get_hz(clk_sys) / (8 * baud);
114 sm_config_set_clkdiv(&c, div);
116 pio_sm_init(pio, sm_tx, offset, &c);
117 pio_sm_set_enabled(pio, sm_tx,
true);
Software Serial Arduino Stream which uses the Pico PIO.
Definition: SoftwareSerial.h:11