#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include "usart.h" static ssize_t usart_read(void *cookie, char *buf, size_t n) { uint32_t dev = (uint32_t)cookie; size_t nbytes = 0; while (n-- > 0) { *buf++ = (char)usart_recv_blocking(dev); nbytes++; } return nbytes; } static ssize_t usart_write(void *cookie, const char *buf, size_t n) { uint32_t dev = (uint32_t)cookie; size_t nbytes = 0; while (n-- > 0) { usart_send_blocking(dev, *buf++); nbytes++; }; return nbytes; } FILE *init_usart(uint32_t dev) { cookie_io_functions_t stub = { usart_read, usart_write, NULL, NULL }; FILE *fp; /* Set up clocks for USART 1 */ rcc_periph_clock_enable(RCC_GPIOA); rcc_periph_clock_enable(RCC_USART1); /* Set up GPIOs for USART 1 */ gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9 | GPIO10); gpio_set_af(GPIOA, GPIO_AF1, GPIO9 | GPIO10); gpio_set_af(GPIOA, GPIO_AF1, GPIO10); usart_set_baudrate(dev, 115200); usart_set_databits(dev, 8); usart_set_parity(dev, USART_PARITY_NONE); usart_set_stopbits(dev, USART_CR2_STOP_1_0BIT); usart_set_mode(dev, USART_MODE_TX_RX); usart_set_flow_control(dev, USART_FLOWCONTROL_NONE); usart_enable(dev); fp = fopencookie((void *)dev, "rw+", stub); setvbuf(fp, NULL, _IONBF, 0); return fp; }