feat: usart retarget

This commit is contained in:
2025-03-20 02:35:29 +08:00
parent f515d5fa96
commit 05dc5e3f53
5 changed files with 180 additions and 33 deletions

22
Core/Inc/retarget.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef _RETARGET_H__
#define _RETARGET_H__
#include "stm32f1xx_hal.h"
#include <sys/stat.h>
#include <stdio.h>
void RetargetInit(UART_HandleTypeDef *huart);
int _isatty(int fd);
int _write(int fd, char *ptr, int len);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char *ptr, int len);
int _fstat(int fd, struct stat *st);
#endif //#ifndef _RETARGET_H__

View File

@ -27,6 +27,7 @@
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "retarget.h"
#include "oled.h"
#include "rc522.h"
/* USER CODE END Includes */
@ -119,13 +120,19 @@ int main(void)
MX_USART1_UART_Init();
MX_SPI1_Init();
/* USER CODE BEGIN 2 */
// Retarget uart
RetargetInit(&huart1);
// Init RC522
MFRC_Init();
PCD_Reset();
// Init OLED
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"Card scan...",12);
printf("startup\n");
/* USER CODE END 2 */
/* Infinite loop */

98
Core/Src/retarget.c Normal file
View File

@ -0,0 +1,98 @@
#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include <retarget.h>
#include <stdint.h>
#if !defined(OS_USE_SEMIHOSTING)
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
UART_HandleTypeDef *gHuart;
void RetargetInit(UART_HandleTypeDef *huart)
{
gHuart = huart;
/* Disable I/O buffering for STDOUT stream, so that
* chars are sent out as soon as they are printed. */
setvbuf(stdout, NULL, _IONBF, 0);
}
int _isatty(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 1;
errno = EBADF;
return 0;
}
int _write(int fd, char *ptr, int len)
{
HAL_StatusTypeDef hstatus;
if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
{
hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return len;
else
return EIO;
}
errno = EBADF;
return -1;
}
int _close(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 0;
errno = EBADF;
return -1;
}
int _lseek(int fd, int ptr, int dir)
{
(void) fd;
(void) ptr;
(void) dir;
errno = EBADF;
return -1;
}
int _read(int fd, char *ptr, int len)
{
HAL_StatusTypeDef hstatus;
if (fd == STDIN_FILENO)
{
hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return 1;
else
return EIO;
}
errno = EBADF;
return -1;
}
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;
}
#endif //#if !defined(OS_USE_SEMIHOSTING)

View File

@ -89,33 +89,33 @@ __attribute__((weak)) int _write(int file, char *ptr, int len)
return len;
}
int _close(int file)
{
(void)file;
return -1;
}
int _fstat(int file, struct stat *st)
{
(void)file;
st->st_mode = S_IFCHR;
return 0;
}
int _isatty(int file)
{
(void)file;
return 1;
}
int _lseek(int file, int ptr, int dir)
{
(void)file;
(void)ptr;
(void)dir;
return 0;
}
// int _close(int file)
// {
// (void)file;
// return -1;
// }
//
//
// int _fstat(int file, struct stat *st)
// {
// (void)file;
// st->st_mode = S_IFCHR;
// return 0;
// }
//
// int _isatty(int file)
// {
// (void)file;
// return 1;
// }
//
// int _lseek(int file, int ptr, int dir)
// {
// (void)file;
// (void)ptr;
// (void)dir;
// return 0;
// }
int _open(char *path, int flags, ...)
{