166 lines
3.8 KiB
C
166 lines
3.8 KiB
C
|
|
#include <sys/stat.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
#include <errno.h>
|
||
|
|
#include "my_printf.h"
|
||
|
|
|
||
|
|
|
||
|
|
void my_uart_txchar(char ch)
|
||
|
|
{
|
||
|
|
LL_USART_TransmitData8(USART2, ch);
|
||
|
|
while (!LL_USART_IsActiveFlag_TC(USART2));
|
||
|
|
LL_USART_ClearFlag_TC(USART2);
|
||
|
|
}
|
||
|
|
|
||
|
|
void my_uart_txstring(char *str)
|
||
|
|
{
|
||
|
|
while (*str) my_uart_txchar(*str++);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void my_printf_config(uint32_t baudRate)
|
||
|
|
{
|
||
|
|
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
|
||
|
|
|
||
|
|
/* USART Init */
|
||
|
|
LL_USART_SetBaudRate(USART2, SystemCoreClock, LL_USART_PRESCALER_DIV1, LL_USART_OVERSAMPLING_16, baudRate);
|
||
|
|
LL_USART_SetDataWidth(USART2, LL_USART_DATAWIDTH_8B);
|
||
|
|
LL_USART_SetStopBitsLength(USART2, LL_USART_STOPBITS_1);
|
||
|
|
LL_USART_SetParity(USART2, LL_USART_PARITY_NONE);
|
||
|
|
LL_USART_SetHWFlowCtrl(USART2, LL_USART_HWCONTROL_NONE);
|
||
|
|
LL_USART_SetTransferDirection(USART2, LL_USART_DIRECTION_TX_RX);
|
||
|
|
LL_USART_Enable(USART2);
|
||
|
|
LL_USART_ClearFlag_TC(USART2);
|
||
|
|
|
||
|
|
/**USART GPIO Configuration
|
||
|
|
PA2 ------> USART2_TX
|
||
|
|
PA3 ------> USART2_RX
|
||
|
|
*/
|
||
|
|
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
|
||
|
|
|
||
|
|
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_2, LL_GPIO_MODE_ALTERNATE);
|
||
|
|
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_VERY_HIGH);
|
||
|
|
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_2, LL_GPIO_PULL_UP);
|
||
|
|
LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_2, LL_GPIO_AF_1);
|
||
|
|
|
||
|
|
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_3, LL_GPIO_MODE_ALTERNATE);
|
||
|
|
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_3, LL_GPIO_SPEED_FREQ_VERY_HIGH);
|
||
|
|
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_3, LL_GPIO_PULL_UP);
|
||
|
|
LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_3, LL_GPIO_AF_1);
|
||
|
|
|
||
|
|
#if defined (__GNUC__) && !defined (__clang__)
|
||
|
|
// To avoid io buffer
|
||
|
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||
|
|
setvbuf(stdin, NULL, _IONBF, 0);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
#if defined (__GNUC__) && !defined (__clang__)
|
||
|
|
#define GETCHAR_PROTOTYPE __attribute__((weak)) int __io_getchar (void)
|
||
|
|
#define PUTCHAR_PROTOTYPE __attribute__((weak)) int __io_putchar(int ch)
|
||
|
|
#else
|
||
|
|
#define GETCHAR_PROTOTYPE int fgetc(FILE * f)
|
||
|
|
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief retargets the c library printf function to the usart.
|
||
|
|
* @param none
|
||
|
|
* @retval none
|
||
|
|
*/
|
||
|
|
PUTCHAR_PROTOTYPE
|
||
|
|
{
|
||
|
|
/* Send a byte to USART */
|
||
|
|
LL_USART_TransmitData8(USART2, ch);
|
||
|
|
while (!LL_USART_IsActiveFlag_TC(USART2));
|
||
|
|
LL_USART_ClearFlag_TC(USART2);
|
||
|
|
|
||
|
|
return (ch);
|
||
|
|
}
|
||
|
|
|
||
|
|
GETCHAR_PROTOTYPE
|
||
|
|
{
|
||
|
|
int ch;
|
||
|
|
while (!LL_USART_IsActiveFlag_RXNE(USART2));
|
||
|
|
ch = LL_USART_ReceiveData8(USART2);
|
||
|
|
return (ch);
|
||
|
|
}
|
||
|
|
|
||
|
|
#if defined (__GNUC__) && !defined (__clang__)
|
||
|
|
__attribute__((weak)) int _write(int file, char *ptr, int len)
|
||
|
|
{
|
||
|
|
(void)file;
|
||
|
|
int DataIdx;
|
||
|
|
for (DataIdx = 0; DataIdx < len; DataIdx++)
|
||
|
|
{
|
||
|
|
__io_putchar(*ptr++);
|
||
|
|
}
|
||
|
|
return len;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
__attribute__((weak)) int _read(int file, char *ptr, int len)
|
||
|
|
{
|
||
|
|
(void)file;
|
||
|
|
int DataIdx;
|
||
|
|
for (DataIdx = 0; DataIdx < len; DataIdx++)
|
||
|
|
{
|
||
|
|
*ptr++ = __io_getchar();
|
||
|
|
}
|
||
|
|
return len;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _isatty(int fd)
|
||
|
|
{
|
||
|
|
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
|
||
|
|
return 1;
|
||
|
|
|
||
|
|
errno = EBADF;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _close(int fd)
|
||
|
|
{
|
||
|
|
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
|
||
|
|
return 0;
|
||
|
|
|
||
|
|
errno = EBADF;
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _lseek(int fd, int ptr, int dir)
|
||
|
|
{
|
||
|
|
(void)fd;
|
||
|
|
(void)ptr;
|
||
|
|
(void)dir;
|
||
|
|
|
||
|
|
errno = EBADF;
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _fstat(int fd, struct stat *st)
|
||
|
|
{
|
||
|
|
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
|
||
|
|
{
|
||
|
|
st->st_mode = S_IFCHR;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
errno = EBADF;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _getpid(void)
|
||
|
|
{
|
||
|
|
errno = ENOSYS;
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
__attribute__((weak)) int _kill(pid_t pid, int sig)
|
||
|
|
{
|
||
|
|
(void)pid;
|
||
|
|
(void)sig;
|
||
|
|
errno = ENOSYS;
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|