aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/obldc/usart/usart.c6
-rw-r--r--examples/stm32-h103/usart/usart.c6
-rw-r--r--include/libopenstm32/usart.h4
-rw-r--r--lib/usart.c26
4 files changed, 33 insertions, 9 deletions
diff --git a/examples/obldc/usart/usart.c b/examples/obldc/usart/usart.c
index ac0becb..8712181 100644
--- a/examples/obldc/usart/usart.c
+++ b/examples/obldc/usart/usart.c
@@ -78,11 +78,11 @@ int main(void)
/* Blink the LED (PC12) on the board with every transmitted byte. */
while (1) {
gpio_toggle(GPIOA, GPIO6); /* LED on/off */
- usart_send(USART1, c + '0'); /* Send one byte on USART3. */
+ usart_send_blocking(USART1, c + '0'); /* Send one byte on USART3. */
c = (c == 9) ? 0 : c + 1; /* Increment c. */
if ((j++ % 80) == 0) { /* Newline after line full. */
- usart_send(USART1, '\r');
- usart_send(USART1, '\n');
+ usart_send_blocking(USART1, '\r');
+ usart_send_blocking(USART1, '\n');
}
for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */
}
diff --git a/examples/stm32-h103/usart/usart.c b/examples/stm32-h103/usart/usart.c
index d8ffe3d..4470348 100644
--- a/examples/stm32-h103/usart/usart.c
+++ b/examples/stm32-h103/usart/usart.c
@@ -69,11 +69,11 @@ int main(void)
/* Blink the LED (PC12) on the board with every transmitted byte. */
while (1) {
gpio_toggle(GPIOC, GPIO12); /* LED on/off */
- usart_send(USART3, c + '0'); /* Send one byte on USART3. */
+ usart_send_blocking(USART3, c + '0'); /* Send one byte on USART3. */
c = (c == 9) ? 0 : c + 1; /* Increment c. */
if ((j++ % 80) == 0) { /* Newline after line full. */
- usart_send(USART3, '\r');
- usart_send(USART3, '\n');
+ usart_send_blocking(USART3, '\r');
+ usart_send_blocking(USART3, '\n');
}
for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */
}
diff --git a/include/libopenstm32/usart.h b/include/libopenstm32/usart.h
index 0cf86d1..7271ba7 100644
--- a/include/libopenstm32/usart.h
+++ b/include/libopenstm32/usart.h
@@ -292,5 +292,9 @@ void usart_enable(u32 usart);
void usart_disable(u32 usart);
void usart_send(u32 usart, u16 data);
u16 usart_recv(u32 usart);
+void usart_wait_send_ready(u32 usart);
+void usart_wait_recv_ready(u32 usart);
+void usart_send_blocking(u32 usart, u16 data);
+u16 usart_recv_blocking(u32 usart);
#endif
diff --git a/lib/usart.c b/lib/usart.c
index 57b3ed5..09feb6e 100644
--- a/lib/usart.c
+++ b/lib/usart.c
@@ -85,16 +85,36 @@ void usart_send(u32 usart, u16 data)
{
/* Send data. */
USART_DR(usart) = (data & 0x1ff);
+}
+u16 usart_recv(u32 usart)
+{
+ /* Receive data. */
+ return USART_DR(usart) & 0x1ff;
+}
+
+void usart_wait_send_ready(u32 usart)
+{
/* Wait until the data has been transferred into the shift register. */
while ((USART_SR(usart) & USART_SR_TXE) == 0);
}
-u16 usart_recv(u32 usart)
+void usart_wait_recv_ready(u32 usart)
{
/* Wait until the data is ready to be received. */
while ((USART_SR(usart) & USART_SR_RXNE) == 0);
+}
- /* Receive data. */
- return USART_DR(usart) & 0x1ff;
+void usart_send_blocking(u32 usart, u16 data)
+{
+ usart_send(usart, data);
+
+ usart_wait_send_ready(usart);
+}
+
+u16 usart_recv_blocking(u32 usart)
+{
+ usart_wait_recv_ready(usart);
+
+ return usart_recv(usart);
}