From 26bb798b7969af4ce0539639d0e419b11e008723 Mon Sep 17 00:00:00 2001 From: Steins7 Date: Wed, 5 Jul 2023 23:05:03 +0200 Subject: [PATCH] Add usart's read function --- drivers/usart.c | 61 +++++++++++++++++++++++++++++++++++++------------ drivers/usart.h | 4 ++-- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/drivers/usart.c b/drivers/usart.c index 4822784..017df30 100644 --- a/drivers/usart.c +++ b/drivers/usart.c @@ -23,6 +23,7 @@ static volatile struct USART* const usart3 = (struct USART*)USART3_BASE_ADDRESS; void configure_usart(volatile struct USART* regs, enum UsartConfig config); void configure_baudrate(volatile struct USART* regs, uint32_t clock, uint32_t baudrate); +uint32_t periph_regs(enum UsartPeriph periph, volatile struct USART** regs); //--local variables------------------------------------------------------------- @@ -56,24 +57,34 @@ void usart_configure(enum UsartPeriph periph, enum UsartConfig config, } } -uint8_t usart_write_byte(enum UsartPeriph periph, uint8_t byte) +uint32_t usart_write_byte(enum UsartPeriph periph, uint8_t byte) { - switch (periph) { - case USART_PERIPH_1: - if (usart1->SR.TXE) { - reg_write(usart1->DR, USART_DR_DR, byte); - return 0; - } else { - return 1; - } - - case USART_PERIPH_2: - case USART_PERIPH_3: - default: - break; + volatile struct USART* regs; + if (periph_regs(periph, ®s)) { + return 1; } - return 1; + if (regs->SR.TXE) { + reg_write(regs->DR, USART_DR_DR, byte); + return 0; + } else { + return 1; + } +} + +uint32_t usart_read_byte(enum UsartPeriph periph, uint8_t* byte) +{ + volatile struct USART* regs; + if (periph_regs(periph, ®s)) { + return 1; + } + + if (regs->SR.RXNE) { + *byte = regs->DR.DR; + return 0; + } else { + return 1; + } } //--local functions------------------------------------------------------------- @@ -167,3 +178,23 @@ void configure_baudrate(volatile struct USART* regs, uint32_t clock, reg_write(regs->BRR, USART_BRR_DIV_Fraction, divider & 0xF); } +uint32_t periph_regs(enum UsartPeriph periph, volatile struct USART** regs) +{ + switch (periph) { + case USART_PERIPH_1: + *regs = usart1; + break; + case USART_PERIPH_2: + *regs = usart2; + break; + case USART_PERIPH_3: + *regs = usart3; + break; + default: + return 1; + break; + } + + return 0; +} + diff --git a/drivers/usart.h b/drivers/usart.h index 8c15f2a..c5845c1 100644 --- a/drivers/usart.h +++ b/drivers/usart.h @@ -42,9 +42,9 @@ void usart_configure(enum UsartPeriph periph, enum UsartConfig config, void usart_reset(enum UsartPeriph periph); -uint8_t usart_write_byte(enum UsartPeriph periph, uint8_t byte); +uint32_t usart_write_byte(enum UsartPeriph periph, uint8_t byte); -uint8_t usart_read_byte(enum UsartPeriph periph, uint8_t* byte); +uint32_t usart_read_byte(enum UsartPeriph periph, uint8_t* byte); #endif //_USART_H_