Car/Core/Src/syscalls.c

114 lines
2.4 KiB
C
Raw Normal View History

2024-07-14 21:03:50 +08:00
#include "syscalls.h"
2024-07-20 10:44:59 +08:00
volatile uint8_t usart_dma_tx_over = 1;
2024-07-14 21:03:50 +08:00
// 条件编译,适配不同平台 (GNU, GCC)
#ifdef __GNUC__
__attribute__((weak)) int _read(int file, char *ptr, int len)
{
2024-07-14 21:03:50 +08:00
(void)file;
int DataIdx;
2024-07-14 21:03:50 +08:00
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
*ptr++ = __io_getchar();
}
2024-07-14 21:03:50 +08:00
return len;
}
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
2024-07-14 21:03:50 +08:00
(void)file;
int DataIdx;
2024-07-14 21:03:50 +08:00
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
2024-07-14 21:03:50 +08:00
#endif
2024-07-14 21:03:50 +08:00
/**
* @brief C printf huart1
* @author Suroy
* @param ch
* @param f
* @return int
*
* @usage printf("USART1_Target:\r\n");
*/
PUTCHAR_PROTOTYPE
{
2024-07-20 10:44:59 +08:00
HAL_UART_Transmit(HUART, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
2024-07-14 21:03:50 +08:00
return ch;
}
2024-07-14 21:03:50 +08:00
/**
* @brief c库函数 getchar,scanf到 DEBUG_USARTx
* C scanf huart1
*
* @param f
* @return int
*
* @usage scanf("%c", &RecData);
*/
GETCHAR_PROTOTYPE
{
2024-07-14 21:03:50 +08:00
uint8_t ch = 0;
2024-07-20 10:44:59 +08:00
HAL_UART_Receive(HUART, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
2024-07-14 21:03:50 +08:00
return ch;
}
2024-07-20 10:44:59 +08:00
// 串口发送完毕回调函数设置usart_dma_tx_over标志为1
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
2024-07-20 10:44:59 +08:00
#if DEFAULT_HUART == 1
if (huart->Instance == USART1)
#else
if (huart->Instance == USART2)
#endif
{
usart_dma_tx_over = 1;
}
}
/**
* @brief printf使DEFAULT_HUARTDMA串口中断方式发送
*
* @usage my_printf(HUART1, "USART1_Target:\r\n");
*/
int myprintf(const char *format, ...)
{
va_list arg;
static char SendBuff[256] = {0};
int rv;
while (!usart_dma_tx_over); // 等待前一次DMA发送完成
va_start(arg, format);
rv = vsnprintf((char *)SendBuff, sizeof(SendBuff) + 1, (char *)format, arg);
va_end(arg);
HAL_UART_Transmit_DMA(HUART, (uint8_t *)SendBuff, rv);
usart_dma_tx_over = 0; // 清0全局标志发送完成后重新置1
return rv;
}
2024-07-14 21:03:50 +08:00
/**
2024-07-20 10:44:59 +08:00
* @brief printf,
2024-07-14 21:03:50 +08:00
*
* @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);
}