87 lines
1.6 KiB
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)
|
|
{
|
|
volatile 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);
|
|
}
|