From 7ee1d948e99b89d722ab396b2fee3ab5cd3b7437 Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Thu, 12 Jan 2017 23:25:53 +0000 Subject: [PATCH] stm32f0:usart: Correctly allow >8bit words. Make them 16bit regs, like on other periphs. This allows proper access to the "8th" bit. (0..8 is 9 bits, not 8) Found and reported in https://github.com/libopencm3/libopencm3/pull/651 --- include/libopencm3/stm32/f0/usart.h | 12 ++++++------ lib/stm32/f0/usart.c | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/libopencm3/stm32/f0/usart.h b/include/libopencm3/stm32/f0/usart.h index 835dc1fd..4ddefc14 100644 --- a/include/libopencm3/stm32/f0/usart.h +++ b/include/libopencm3/stm32/f0/usart.h @@ -100,13 +100,13 @@ #define USART3_ICR USART_ICR(USART3_BASE) #define USART4_ICR USART_ICR(USART4_BASE) -#define USART_RDR(usart_base) MMIO8((usart_base) + 0x24) +#define USART_RDR(usart_base) MMIO16((usart_base) + 0x24) #define USART1_RDR USART_RDR(USART1_BASE) #define USART2_RDR USART_RDR(USART2_BASE) #define USART3_RDR USART_RDR(USART3_BASE) #define USART4_RDR USART_RDR(USART4_BASE) -#define USART_TDR(usart_base) MMIO8((usart_base) + 0x28) +#define USART_TDR(usart_base) MMIO16((usart_base) + 0x28) #define USART1_TDR USART_TDR(USART1_BASE) #define USART2_TDR USART_TDR(USART2_BASE) #define USART3_TDR USART_TDR(USART3_BASE) @@ -309,12 +309,12 @@ void usart_set_mode(uint32_t usart, uint32_t mode); void usart_set_flow_control(uint32_t usart, uint32_t flowcontrol); void usart_enable(uint32_t usart); void usart_disable(uint32_t usart); -void usart_send(uint32_t usart, uint8_t data); -uint8_t usart_recv(uint32_t usart); +void usart_send(uint32_t usart, uint16_t data); +uint16_t usart_recv(uint32_t usart); void usart_wait_send_ready(uint32_t usart); void usart_wait_recv_ready(uint32_t usart); -void usart_send_blocking(uint32_t usart, uint8_t data); -uint8_t usart_recv_blocking(uint32_t usart); +void usart_send_blocking(uint32_t usart, uint16_t data); +uint16_t usart_recv_blocking(uint32_t usart); void usart_enable_rx_dma(uint32_t usart); void usart_disable_rx_dma(uint32_t usart); void usart_enable_tx_dma(uint32_t usart); diff --git a/lib/stm32/f0/usart.c b/lib/stm32/f0/usart.c index 171c7b25..c47363bd 100644 --- a/lib/stm32/f0/usart.c +++ b/lib/stm32/f0/usart.c @@ -158,7 +158,7 @@ void usart_disable(uint32_t usart) * @param data */ -void usart_send(uint32_t usart, uint8_t data) +void usart_send(uint32_t usart, uint16_t data) { USART_TDR(usart) = data; } @@ -173,7 +173,7 @@ void usart_send(uint32_t usart, uint8_t data) * @returns data word. */ -uint8_t usart_recv(uint32_t usart) +uint16_t usart_recv(uint32_t usart) { /* Receive data. */ return USART_RDR(usart); @@ -218,7 +218,7 @@ void usart_wait_recv_ready(uint32_t usart) * @param data word to send */ -void usart_send_blocking(uint32_t usart, uint8_t data) +void usart_send_blocking(uint32_t usart, uint16_t data) { usart_wait_send_ready(usart); usart_send(usart, data); @@ -233,7 +233,7 @@ void usart_send_blocking(uint32_t usart, uint8_t data) * @returns data word. */ -uint8_t usart_recv_blocking(uint32_t usart) +uint16_t usart_recv_blocking(uint32_t usart) { usart_wait_recv_ready(usart);