#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); }