STM32
直播中

刘伟

7年用户 1637经验值
私信 关注
[问答]

stm32 hal printf重定向的配置是什么?

STM32 hal printf重定向的配置是什么?

回帖(1)

余少华

2021-12-1 10:10:42
usart1配置如下





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





时钟配置:如果不严格要求就按软件自己配的来,如果是外部时钟源,晶振的频率一定要选对,否则会乱码
       生成报告以及代码,编译程序。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void),以及管脚配置函数HAL_UART_MspInit()。

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

        在usart.c文件的/* USER CODE BEGIN 0 */和/* USER CODE END 0 */添加如下代码(大约在26行左右),代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。


/* USER CODE BEGIN 0 */


#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);//注意把&huart1改为自己的stm32使用的串口号

        return ch;
}


/* USER CODE END 0 */
注意:最好将代码添加在/* 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文件中添加应用函数。
别忘了引用stdio.h#include //在main函数中写HAL_Delay(1000);printf("nr while循环中!!!nr"); 右键项目,选择properties





按照下图进行配置,这一步是为了支持浮点数输出和去掉printf的警告,如果这一步设置了还不能输出浮点数,再做接下来一步操作
有些地方可能还要另外配置来让浮点数争取输出,点击C++build然后选Settings然后找miscellaneous,点击输入框上的+,填入-u_printf_float






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

更多回帖

发帖
×
20
完善资料,
赚取积分