#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
//HAL库
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart3, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch;
HAL_UART_Receive(&huart3,(uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
//寄存器
PUTCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_TC) == RESET);
USART3->TDR=(uint8_t)ch;
return ch;
}
GETCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_RXNE) == RESET);
return (uint8_t)(USART3->RDR);
}
注意:printf()和scanf()都是用轮询方式,没有使用中断。调用scanf()在串口助手中输入数据时,必须以空格结束,然后点击发送,否则无法完成发送。
使用标准库(__use_no_semihosting)
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART3->ISR & UART_FLAG_TC) == RESET);
USART3->TDR=(uint8_t)ch;
return ch;
}
把printf重新宏定义了一下,使用时候就可以使用自己的函数,不想开printf时候改掉宏定义就好了
#define log(...) printf(__VA_ARGS__)
1
重写printf
#include
#include
void USART3_Printf (const void *format, ...)
{
static uint8_t Buff[100];
va_list args;
uint32_t Len;
va_start(args, format);
Len = vsnprintf((char *)Buff, 100, (char *)format, args);
va_end(args);
HAL_UART_Transmit(&huart3, (uint8_t *)Buff, Len, 1000);
}
使能浮点
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
//HAL库
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart3, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch;
HAL_UART_Receive(&huart3,(uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
//寄存器
PUTCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_TC) == RESET);
USART3->TDR=(uint8_t)ch;
return ch;
}
GETCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_RXNE) == RESET);
return (uint8_t)(USART3->RDR);
}
注意:printf()和scanf()都是用轮询方式,没有使用中断。调用scanf()在串口助手中输入数据时,必须以空格结束,然后点击发送,否则无法完成发送。
使用标准库(__use_no_semihosting)
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART3->ISR & UART_FLAG_TC) == RESET);
USART3->TDR=(uint8_t)ch;
return ch;
}
把printf重新宏定义了一下,使用时候就可以使用自己的函数,不想开printf时候改掉宏定义就好了
#define log(...) printf(__VA_ARGS__)
1
重写printf
#include
#include
void USART3_Printf (const void *format, ...)
{
static uint8_t Buff[100];
va_list args;
uint32_t Len;
va_start(args, format);
Len = vsnprintf((char *)Buff, 100, (char *)format, args);
va_end(args);
HAL_UART_Transmit(&huart3, (uint8_t *)Buff, Len, 1000);
}
使能浮点
举报