Splitted out the usart recv and send functions to have blocking and non blocking versions of those.

This commit is contained in:
Piotr Esden-Tempski 2010-12-27 15:29:22 +01:00
parent 571c4d37d0
commit bf0b987fe3
4 changed files with 36 additions and 12 deletions

View File

@ -78,11 +78,11 @@ int main(void)
/* Blink the LED (PC12) on the board with every transmitted byte. */ /* Blink the LED (PC12) on the board with every transmitted byte. */
while (1) { while (1) {
gpio_toggle(GPIOA, GPIO6); /* LED on/off */ 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. */ c = (c == 9) ? 0 : c + 1; /* Increment c. */
if ((j++ % 80) == 0) { /* Newline after line full. */ if ((j++ % 80) == 0) { /* Newline after line full. */
usart_send(USART1, '\r'); usart_send_blocking(USART1, '\r');
usart_send(USART1, '\n'); usart_send_blocking(USART1, '\n');
} }
for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */ for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */
} }

View File

@ -69,11 +69,11 @@ int main(void)
/* Blink the LED (PC12) on the board with every transmitted byte. */ /* Blink the LED (PC12) on the board with every transmitted byte. */
while (1) { while (1) {
gpio_toggle(GPIOC, GPIO12); /* LED on/off */ 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. */ c = (c == 9) ? 0 : c + 1; /* Increment c. */
if ((j++ % 80) == 0) { /* Newline after line full. */ if ((j++ % 80) == 0) { /* Newline after line full. */
usart_send(USART3, '\r'); usart_send_blocking(USART3, '\r');
usart_send(USART3, '\n'); usart_send_blocking(USART3, '\n');
} }
for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */ for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */
} }

View File

@ -292,5 +292,9 @@ void usart_enable(u32 usart);
void usart_disable(u32 usart); void usart_disable(u32 usart);
void usart_send(u32 usart, u16 data); void usart_send(u32 usart, u16 data);
u16 usart_recv(u32 usart); 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 #endif

View File

@ -85,16 +85,36 @@ void usart_send(u32 usart, u16 data)
{ {
/* Send data. */ /* Send data. */
USART_DR(usart) = (data & 0x1ff); USART_DR(usart) = (data & 0x1ff);
/* Wait until the data has been transferred into the shift register. */
while ((USART_SR(usart) & USART_SR_TXE) == 0);
} }
u16 usart_recv(u32 usart) u16 usart_recv(u32 usart)
{ {
/* Wait until the data is ready to be received. */
while ((USART_SR(usart) & USART_SR_RXNE) == 0);
/* Receive data. */ /* Receive data. */
return USART_DR(usart) & 0x1ff; 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);
}
void usart_wait_recv_ready(u32 usart)
{
/* Wait until the data is ready to be received. */
while ((USART_SR(usart) & USART_SR_RXNE) == 0);
}
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);
}