From d0a7ee402141d6703218765c36a47003538168d1 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sat, 3 Dec 2011 20:18:53 +0100 Subject: Moved USART register definitions into seperate header and added abstraction layer. --- hal/usart.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 8 deletions(-) (limited to 'hal/usart.h') diff --git a/hal/usart.h b/hal/usart.h index 78a28dc..24618fd 100644 --- a/hal/usart.h +++ b/hal/usart.h @@ -6,20 +6,64 @@ #include "interrupt.h" #include "thread.h" +struct USART_reg_t { + volatile uint32_t SR; + volatile uint32_t DR; + volatile uint32_t BRR; + volatile uint32_t CR1; + volatile uint32_t CR2; + volatile uint32_t CR3; + volatile uint32_t GTPR; +}; + +class USART_t { + public: + USART_reg_t& reg; + const uint32_t clk; + + USART_t(uint32_t reg_addr, uint32_t bus_clk) : reg(*(USART_reg_t*)reg_addr), clk(bus_clk) {} + + inline void set_baudrate(uint32_t baudrate) { + reg.BRR = clk / baudrate; + } + + inline void enable() { + reg.CR1 = 0x202c; + } + + inline void send(uint8_t data) { + while(!(reg.SR & 0x80)) { + Thread::yield(); + } // Wait for TXE. + + reg.DR = data; + } + + inline uint8_t recv() { + return reg.DR; + } +}; + +#if defined(STM32F1) +static USART_t USART1(0x40013800, 72000000); +static USART_t USART2(0x40004400, 36000000); +static USART_t USART3(0x40004800, 36000000); +#elif defined(STM32F4) +static USART_t USART1(0x40011000, 84000000); +static USART_t USART2(0x40004400, 42000000); +static USART_t USART3(0x40004800, 42000000); +#endif + inline void usart_enable() { RCC.enable(RCC.USART1); - USART1.BRR = 625; // 115200 baud - USART1.CR1 = 0x202c; + USART1.set_baudrate(115200); + USART1.enable(); - Interrupt::enable(Interrupt::USART1); + //Interrupt::enable(Interrupt::USART1); } inline void usart_send(uint8_t data) { - while(!(USART1.SR & 0x80)) { - Thread::yield(); - } // Wait for TXE. - - USART1.DR = data; + USART1.send(data); } #endif -- cgit v1.2.3