diff options
author | Marti Bolivar <mbolivar@leaflabs.com> | 2011-04-25 18:00:34 -0400 |
---|---|---|
committer | Marti Bolivar <mbolivar@leaflabs.com> | 2011-04-25 18:00:34 -0400 |
commit | fd26797490c9c78cce4d4a1894f9413f3c858f2d (patch) | |
tree | fcdc3d216b7e857d3d3be29c2b270de6953af8c0 /libmaple/usart.h | |
parent | f82577c56f8525fc56aa6a0b71ec62435a4c13ba (diff) | |
download | librambutan-fd26797490c9c78cce4d4a1894f9413f3c858f2d.tar.gz librambutan-fd26797490c9c78cce4d4a1894f9413f3c858f2d.zip |
Adding nonblocking USART transmit, usart_tx().
Other USART transmission functions are still blocking, but are now
implemented in terms of usart_tx().
Diffstat (limited to 'libmaple/usart.h')
-rw-r--r-- | libmaple/usart.h | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/libmaple/usart.h b/libmaple/usart.h index 02f23da..b2bb034 100644 --- a/libmaple/usart.h +++ b/libmaple/usart.h @@ -26,6 +26,8 @@ /** * @file usart.h + * @author Marti Bolivar <mbolivar@leaflabs.com>, + * Perry Hung <perry@leaflabs.com> * @brief USART definitions and prototypes */ @@ -251,20 +253,12 @@ extern usart_dev *UART4; extern usart_dev *UART5; #endif -#ifdef STM32_MEDIUM_DENSITY -#define NR_USARTS 3 -#elif defined(STM32_HIGH_DENSITY) -#define NR_USARTS 5 -#else -#warn "Only medium and high density devices are currently supported" -#endif - void usart_init(usart_dev *dev); void usart_set_baud_rate(usart_dev *dev, uint32 clock_speed, uint32 baud); void usart_enable(usart_dev *dev); void usart_disable(usart_dev *dev); void usart_foreach(void (*fn)(usart_dev *dev)); -void usart_putstr(usart_dev *dev, const char*); +uint32 usart_tx(usart_dev *dev, const uint8 *buf, uint32 len); void usart_putudec(usart_dev *dev, uint32 val); /** @@ -276,16 +270,32 @@ static inline void usart_disable_all(void) { /** * @brief Transmit one character on a serial port. + * + * This function blocks until the character has been successfully + * transmitted. + * * @param dev Serial port to send on. * @param byte Byte to transmit. */ static inline void usart_putc(usart_dev* dev, uint8 byte) { - usart_reg_map *regs = dev->regs; - - while ((regs->SR & USART_SR_TXE) == 0) + uint8 buf[] = {byte}; + while (!usart_tx(dev, buf, 1)) ; +} - regs->DR = byte; +/** + * @brief Transmit a character string on a serial port. + * + * This function blocks until str is completely transmitted. + * + * @param dev Serial port to send on + * @param str String to send + */ +static inline void usart_putstr(usart_dev *dev, const char* str) { + uint32 i = 0; + while (str[i] != '\0') { + usart_putc(dev, str[i]); + } } /** |