diff --git a/drv/usart.c b/drv/usart.c index 35bc779..25167a2 100644 --- a/drv/usart.c +++ b/drv/usart.c @@ -29,50 +29,52 @@ static void configure_baudrate(volatile struct USART* regs, uint32_t clock, //--local variables------------------------------------------------------------- -static volatile struct USART* const usart1 = (struct USART*)USART1_BASE_ADDRESS; -static volatile struct USART* const usart2 = (struct USART*)USART2_BASE_ADDRESS; -static volatile struct USART* const usart3 = (struct USART*)USART3_BASE_ADDRESS; - -static const struct DmaParam usart1_rx_param = { - (void*)&usart1->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_5, +static volatile struct USART* const usarts[] = { + (struct USART*)USART1_BASE_ADDRESS, + (struct USART*)USART2_BASE_ADDRESS, + (struct USART*)USART3_BASE_ADDRESS, }; -static const struct DmaParam usart2_rx_param = { - (void*)&usart2->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_6, +static const struct DmaParam usarts_rx_param[] = { + { + (void*)&usarts[USART_PERIPH_1]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_5, + }, + { + (void*)&usarts[USART_PERIPH_2]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_6, + }, + { + (void*)&usarts[USART_PERIPH_3]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_3, + }, }; -static const struct DmaParam usart3_rx_param = { - (void*)&usart3->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_3, -}; - -static const struct DmaParam usart1_tx_param = { - (void*)&usart1->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_4, -}; - -static const struct DmaParam usart2_tx_param = { - (void*)&usart2->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_7, -}; - -static const struct DmaParam usart3_tx_param = { - (void*)&usart3->DR, - DMA_CONFIG, - DMA_PERIPH_1, - DMA_CHANNEL_2, +static const struct DmaParam usarts_tx_param[] = { + { + (void*)&usarts[USART_PERIPH_1]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_4, + }, + { + (void*)&usarts[USART_PERIPH_2]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_7, + }, + { + (void*)&usarts[USART_PERIPH_3]->DR, + DMA_CONFIG, + DMA_PERIPH_1, + DMA_CHANNEL_2, + }, }; @@ -87,18 +89,21 @@ void usart_configure(enum UsartPeriph periph, enum UsartConfig config, switch (periph) { case USART_PERIPH_1: rcc_enable(RCC_AHB_NONE, RCC_APB1_NONE, RCC_APB2_USART); - configure_baudrate(usart1, clocks.apb2_freq, baudrate); - configure_usart(usart1, config); + configure_baudrate(usarts[USART_PERIPH_1], clocks.apb2_freq, + baudrate); + configure_usart(usarts[USART_PERIPH_1], config); break; case USART_PERIPH_2: rcc_enable(RCC_AHB_NONE, RCC_APB1_USART2, RCC_APB2_NONE); - configure_baudrate(usart2, clocks.apb1_freq, baudrate); - configure_usart(usart2, config); + configure_baudrate(usarts[USART_PERIPH_2], clocks.apb1_freq, + baudrate); + configure_usart(usarts[USART_PERIPH_2], config); break; case USART_PERIPH_3: rcc_enable(RCC_AHB_NONE, RCC_APB1_USART3, RCC_APB2_NONE); - configure_baudrate(usart3, clocks.apb1_freq, baudrate); - configure_usart(usart3, config); + configure_baudrate(usarts[USART_PERIPH_3], clocks.apb1_freq, + baudrate); + configure_usart(usarts[USART_PERIPH_3], config); break; default: break; @@ -107,25 +112,12 @@ void usart_configure(enum UsartPeriph periph, enum UsartConfig config, uint32_t usart_read_byte(enum UsartPeriph periph, uint8_t* byte) { - 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; + if (periph > USART_PERIPH_3) { + return 1; } - if (regs->SR.RXNE) { - *byte = regs->DR.DR; + if (usarts[periph]->SR.RXNE) { + *byte = usarts[periph]->DR.DR; return 0; } else { return 1; @@ -134,26 +126,13 @@ uint32_t usart_read_byte(enum UsartPeriph periph, uint8_t* byte) uint32_t usart_write_byte(enum UsartPeriph periph, uint8_t byte) { - 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; + if (periph > USART_PERIPH_3) { + return 1; } //only write data if the tx register it empty, give up otherwise - if (regs->SR.TXE) { - reg_write(regs->DR, USART_DR_DR, byte); + if (usarts[periph]->SR.TXE) { + reg_write(usarts[periph]->DR, USART_DR_DR, byte); return 0; } else { return 1; @@ -162,50 +141,22 @@ uint32_t usart_write_byte(enum UsartPeriph periph, uint8_t byte) const struct DmaParam* usart_configure_rx_dma(enum UsartPeriph periph) { - const struct DmaParam* param; - - switch (periph) { - case USART_PERIPH_1: - param = &usart1_rx_param; - reg_set(usart1->CR3, USART_CR3_DMAR); - break; - case USART_PERIPH_2: - param = &usart2_rx_param; - reg_set(usart2->CR3, USART_CR3_DMAR); - break; - case USART_PERIPH_3: - param = &usart3_rx_param; - reg_set(usart3->CR3, USART_CR3_DMAR); - break; - default: - return nullptr; + if (periph > USART_PERIPH_3) { + return nullptr; } - return param; + reg_set(usarts[periph]->CR3, USART_CR3_DMAR); + return &usarts_rx_param[periph]; } const struct DmaParam* usart_configure_tx_dma(enum UsartPeriph periph) { - const struct DmaParam* param; - - switch (periph) { - case USART_PERIPH_1: - param = &usart1_tx_param; - reg_set(usart1->CR3, USART_CR3_DMAT); - break; - case USART_PERIPH_2: - param = &usart2_tx_param; - reg_set(usart2->CR3, USART_CR3_DMAT); - break; - case USART_PERIPH_3: - param = &usart3_tx_param; - reg_set(usart3->CR3, USART_CR3_DMAT); - break; - default: - return nullptr; + if (periph > USART_PERIPH_3) { + return nullptr; } - return param; + reg_set(usarts[periph]->CR3, USART_CR3_DMAT); + return &usarts_tx_param[periph]; }