Car/Core/Src/syscalls.c

87 lines
1.6 KiB
C

#include "syscalls.h"
extern UART_HandleTypeDef huart1;
// 条件编译,适配不同平台 (GNU, GCC)
#ifdef __GNUC__
__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 _write(int file, char *ptr, int len)
{
(void)file;
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
#endif
/**
* @brief 重定向 C 标准库 printf 函数到串口 huart1
* @author Suroy
* @param ch
* @param f
* @return int
*
* @usage printf("USART1_Target:\r\n");
*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); // 阻塞式无限等待
return ch;
}
/**
* @brief 重定向 c库函数 getchar,scanf到 DEBUG_USARTx
* 重定向 C 标准库 scanf 函数到串口 huart1
* 注意以 空格 为结束
* @param f
* @return int
*
* @usage scanf("%c", &RecData);
*/
GETCHAR_PROTOTYPE
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
void delay_us(uint16_t us)
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--);
}
/**
* @brief 自定义printf
* @param huart, buf
* @return void
*
* @usage my_printf(HUART1, "USART1_Target:\r\n");
*/
void my_printf(UART_HandleTypeDef *huart, const char *buf, ...)
{
char str[255] = {0};
va_list v;
va_start(v, buf);
vsprintf(str, buf, v);
HAL_UART_Transmit(huart, (const uint8_t *)str, strlen(str), 0xff);
va_end(v);
}