在之前,一直搜了很多篇博客,在使用cubemx之后,stm32的printf重定义大概有几种方式。
先说说什么叫重定义,我认为是将printf的输出通过不同的usart串口,而这个串口是可以自己定义的
网上方法很多,但是不知道为什么试了很多种之后,发现只有一种可以使用,如果读者知道为什么的话可以告诉一下我。
方法大概有几种:
1、在usart.c文件上添加一下代码块
(这种是我试过可行的)
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */
2、在main里面添加fputc()函数
int fputc(int ch, FILE *f)
{
USART_SendData(USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
return ch;
}
更改完之后在keil 平台上改下设置:
Use MicroLIB ->Target -> Code Generation -> 选中Use MicroLIB
在main.c里面添加头文件,不然的话会显示FILES未定义。
在之前,一直搜了很多篇博客,在使用cubemx之后,stm32的printf重定义大概有几种方式。
先说说什么叫重定义,我认为是将printf的输出通过不同的usart串口,而这个串口是可以自己定义的
网上方法很多,但是不知道为什么试了很多种之后,发现只有一种可以使用,如果读者知道为什么的话可以告诉一下我。
方法大概有几种:
1、在usart.c文件上添加一下代码块
(这种是我试过可行的)
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */
2、在main里面添加fputc()函数
int fputc(int ch, FILE *f)
{
USART_SendData(USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
return ch;
}
更改完之后在keil 平台上改下设置:
Use MicroLIB ->Target -> Code Generation -> 选中Use MicroLIB
在main.c里面添加头文件,不然的话会显示FILES未定义。
举报