stm32 hal printf重定向

usart1配置如下

stm32 hal printf重定向

打开中断(也可以不开,只是顺手开了)

stm32 hal printf重定向

时钟配置:如果不严格要求就按软件自己配的来,如果是外部时钟源,晶振的频率一定要选对,否则会乱码

       生成报告以及代码,编译程序。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void),以及管脚配置函数HAL_UART_MspInit()。

 

        C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。

 

        在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

 

/* USER CODE BEGIN 1 */
#ifdef __GNUC_
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

	return ch;
}
/* USER CODE END 1 */

注意:最好将代码添加在/* USER CODE BEGIN x */和/* USER CODE END x */之间,否则下次重新用cube生成代码就会没了

其中HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);这个语句表示通过串口1发个一个字符。ch为字符的存储地址,0xFFFF为超时时间。在stm32f7xx_hal_uart.c文件中可以找到HAL_UART_Transmit函数。

 

在main.c文件中添加应用函数。

printf("\n\r while循环中!!!\n\r");

将代码编译后下载到开发板中,连接开发板的tx和gnd,用串口调试软件查看就行了