50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
#include <unistd.h>
|
|
#include "py/mpconfig.h"
|
|
|
|
/*
|
|
* Core UART functions to implement for a port
|
|
*/
|
|
|
|
#if MICROPY_MIN_USE_STM32_MCU
|
|
typedef struct {
|
|
volatile uint32_t SR;
|
|
volatile uint32_t DR;
|
|
} periph_uart_t;
|
|
#define USART1 ((periph_uart_t *)0x40011000)
|
|
#endif
|
|
|
|
// Receive single character
|
|
int mp_hal_stdin_rx_chr(void) {
|
|
unsigned char c = 0;
|
|
#if MICROPY_MIN_USE_STDOUT
|
|
int r = read(STDIN_FILENO, &c, 1);
|
|
(void)r;
|
|
#elif MICROPY_MIN_USE_STM32_MCU
|
|
// wait for RXNE
|
|
while ((USART1->SR & (1 << 5)) == 0) {
|
|
}
|
|
c = USART1->DR;
|
|
#endif
|
|
return c;
|
|
}
|
|
|
|
// Send string of given length
|
|
mp_uint_t mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
|
|
mp_uint_t ret = len;
|
|
#if MICROPY_MIN_USE_STDOUT
|
|
int r = write(STDOUT_FILENO, str, len);
|
|
if (r >= 0) {
|
|
// in case of an error in the syscall, report no bytes written
|
|
ret = 0;
|
|
}
|
|
#elif MICROPY_MIN_USE_STM32_MCU
|
|
while (len--) {
|
|
// wait for TXE
|
|
while ((USART1->SR & (1 << 7)) == 0) {
|
|
}
|
|
USART1->DR = *str++;
|
|
}
|
|
#endif
|
|
return ret;
|
|
}
|