-
Notifications
You must be signed in to change notification settings - Fork 19
Closed
Description
Add a template that uses CMSIS-Driver UART with 'select="STDOUT UART Template"'
Effectively this code (but with configurable driver instance)
#include "retarget_stdout.h"
#include "Driver_USART.h"
#include <stdint.h>
extern ARM_DRIVER_USART Driver_USART0;
static ARM_DRIVER_USART * const stdout_usart = &Driver_USART0;
static uint8_t stdout_usart_initialized;
#ifndef STDOUT_USART_BAUDRATE
#define STDOUT_USART_BAUDRATE 115200U
#endif
static int stdout_usart_ensure_initialized (void) {
int32_t status;
if (stdout_usart_initialized != 0U) {
return 0;
}
status = stdout_usart->Initialize(NULL);
if (status != ARM_DRIVER_OK) {
return -1;
}
status = stdout_usart->PowerControl(ARM_POWER_FULL);
if (status != ARM_DRIVER_OK) {
return -1;
}
status = stdout_usart->Control(
ARM_USART_MODE_ASYNCHRONOUS |
ARM_USART_DATA_BITS_8 |
ARM_USART_PARITY_NONE |
ARM_USART_STOP_BITS_1 |
ARM_USART_FLOW_CONTROL_NONE,
STDOUT_USART_BAUDRATE
);
if (status != ARM_DRIVER_OK) {
return -1;
}
status = stdout_usart->Control(ARM_USART_CONTROL_TX, 1U);
if (status != ARM_DRIVER_OK) {
return -1;
}
stdout_usart_initialized = 1U;
return 0;
}
/**
Put a character to the stdout
\param[in] ch Character to output
\return The character written, or -1 on write error.
*/
int stdout_putchar (int ch) {
uint8_t c;
if (stdout_usart_ensure_initialized() != 0) {
return -1;
}
/* If caller prints bare '\n', emit CRLF on the wire. */
if ((uint8_t)ch == (uint8_t)'\n') {
(void)stdout_putchar('\r');
}
/* Serialize by waiting for any previous send to complete. */
while (stdout_usart->GetStatus().tx_busy != 0U) {
}
c = (uint8_t)ch;
if (stdout_usart->Send(&c, 1U) != ARM_DRIVER_OK) {
return -1;
}
while (stdout_usart->GetStatus().tx_busy != 0U) {
}
return ch;
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels