summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/stm32/machine_uart.c15
-rw-r--r--ports/stm32/uart.c15
-rw-r--r--ports/stm32/uart.h1
3 files changed, 20 insertions, 11 deletions
diff --git a/ports/stm32/machine_uart.c b/ports/stm32/machine_uart.c
index fa686d060..e282e32d5 100644
--- a/ports/stm32/machine_uart.c
+++ b/ports/stm32/machine_uart.c
@@ -223,25 +223,18 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, size_t n_args, const
}
self->char_width = CHAR_WIDTH_8BIT;
}
- self->read_buf_head = 0;
- self->read_buf_tail = 0;
if (args.rxbuf.u_int >= 0) {
// rxbuf overrides legacy read_buf_len
args.read_buf_len.u_int = args.rxbuf.u_int;
}
if (args.read_buf_len.u_int <= 0) {
// no read buffer
- self->read_buf_len = 0;
- self->read_buf = NULL;
- HAL_NVIC_DisableIRQ(self->irqn);
- __HAL_UART_DISABLE_IT(&self->uart, UART_IT_RXNE);
+ uart_set_rxbuf(self, 0, NULL);
} else {
// read buffer using interrupts
- self->read_buf_len = args.read_buf_len.u_int + 1; // +1 to adjust for usable length of buffer
- self->read_buf = m_new(byte, self->read_buf_len << self->char_width);
- __HAL_UART_ENABLE_IT(&self->uart, UART_IT_RXNE);
- NVIC_SetPriority(IRQn_NONNEG(self->irqn), IRQ_PRI_UART);
- HAL_NVIC_EnableIRQ(self->irqn);
+ size_t len = args.read_buf_len.u_int + 1; // +1 to adjust for usable length of buffer
+ uint8_t *buf = m_new(byte, len << self->char_width);
+ uart_set_rxbuf(self, len, buf);
}
// compute actual baudrate that was configured
diff --git a/ports/stm32/uart.c b/ports/stm32/uart.c
index ba9cce507..c29d39366 100644
--- a/ports/stm32/uart.c
+++ b/ports/stm32/uart.c
@@ -302,6 +302,21 @@ bool uart_init2(pyb_uart_obj_t *uart_obj) {
return true;
}
+void uart_set_rxbuf(pyb_uart_obj_t *self, size_t len, void *buf) {
+ self->read_buf_head = 0;
+ self->read_buf_tail = 0;
+ self->read_buf_len = len;
+ self->read_buf = buf;
+ if (len == 0) {
+ HAL_NVIC_DisableIRQ(self->irqn);
+ __HAL_UART_DISABLE_IT(&self->uart, UART_IT_RXNE);
+ } else {
+ __HAL_UART_ENABLE_IT(&self->uart, UART_IT_RXNE);
+ NVIC_SetPriority(IRQn_NONNEG(self->irqn), IRQ_PRI_UART);
+ HAL_NVIC_EnableIRQ(self->irqn);
+ }
+}
+
void uart_deinit(pyb_uart_obj_t *self) {
self->is_enabled = false;
UART_HandleTypeDef *uart = &self->uart;
diff --git a/ports/stm32/uart.h b/ports/stm32/uart.h
index c69b87491..fb7768db2 100644
--- a/ports/stm32/uart.h
+++ b/ports/stm32/uart.h
@@ -64,6 +64,7 @@ void uart_init0(void);
void uart_deinit_all(void);
bool uart_exists(int uart_id);
bool uart_init2(pyb_uart_obj_t *uart_obj);
+void uart_set_rxbuf(pyb_uart_obj_t *self, size_t len, void *buf);
void uart_deinit(pyb_uart_obj_t *uart_obj);
void uart_irq_handler(mp_uint_t uart_id);