本帖最后由 yangjiaxu 于 2023-7-30 21:32 编辑
#申请原创#@21小跑堂
上一篇帖子讲了搭建STM32H503RBT6-Nucleo的开发环境,感觉STM32H503RBT6-Nucleo的上手速度真的是泰裤辣,今天呢,趁热打铁,继续对STM32H503RBT6-Nucleo进行深一步的研究,本次将实现使用串口与printf函数,同时利用printf输出编译的时间与日期等等。
printf 是 C 语言中用于输出格式化输出的函数,它是标准输入/输出库 (stdio.h) 的一部分。
printf 的语法如下:
int printf(const char *format, ...);
这里,format 是一个字符串,用于指定输出的格式,可选的省略号 (...) 表示可以有额外的参数与格式字符串中的格式说明符相对应。
使用printf函数可以很容易的将想要利用串口输出的数据打印出来,使用printf也可以做log输出,非常省事儿。使用printf有个前提,就是要将串口初始化,同时需要打开keil的Usemicrolib,之后在重定义串口。这样才能正常的使用printf函数。
本次利用STM32H503RBT6-Nucleo来实现以上描述的功能。首先由于板载带有STLINKV3,这个STlinkV3比较好在有个虚拟串口功能,这里虚拟串口以默认连接STM32H503RBT6芯片的串口3。
图1 开发板串口硬件连接说明 既然知道串口的连接,就可以利用cubemx实现对串口3的初始化了。打开cubemx,找到串口3的位置,然后选中,接下来就可以对其设置了,由于cubemx给了个基础配置,就是使用波特率115200,同时8位字节长度,一个停止位,无校验位,这样就可以了。
图2 使用cubemx对串口3配置 当配置完成之后,就可以使用cubemx进行工程生成了,这里最基本的底层配置就算是完成了。接下来就是对串口重定义了,这里由于用到的是串口3,因此代码如下:
int fputc(intch, FILE *f)
{
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 2);//huart根据你的配置修改
return ch;
}
当重定义之后就可以使用printf了,但是这时候写printf虽然不报错,编译也能通过,但是将程序烧录到芯片之中后,芯片是不能正确运行的,因为没有勾选UseMicroLIB,因此需要在keil上勾选一下,至此,就可以玩好的玩耍printf了。
图3 keil的配置 这么玩耍printf好像也没啥意思,我们可以提升一点有意义的事情,比如通过printf输出代码编译出来的时间,日期和版本号。这里的时间日期都是代码编译出来的时候,keil获取的本地电脑时间,其实这个信息是非常有意义的,因为在做程序版本管理的时候,这信息可以代表程序是否是最新一次编译的。同时再配合自定义的程序版本号,就可以清晰明了的知道这个程序是否是最新的了。防止固件更新错误,导致误工误事。好,那我们说干就干,那么怎么利用keil获取本地时间呢?
这里keil其实已经帮我们做好了。就是 __DATE__,和 __TIME__,前者是日期,后者是时间。通过调用这两个预定义宏,就可以获取当前的时间和日期。接下来我们写点代码,就可以实现该功能。
写两个结构体:
typedefstruct
{
char CodeVersion[32]; // 软件自定义版本
char CodeBuildDate[32]; // 程序编译日期
char CodeBuildTime[32]; // 程序编译时间
} AppInfo_t;
constAppInfo_tsg_tAppInfo =
{
"STM32_V0.1.0",
__DATE__,
__TIME__,
};
接下来利用printf来打印结构体,就可以了。
printf("This is a serial demo\r\n");
printf("Version : %s\r\n", sg_tAppInfo.CodeVersion);
printf("buildTime: %s\r\n", sg_tAppInfo.CodeBuildDate);
printf("buildTime: %s\r\n", sg_tAppInfo.CodeBuildTime);
图4 串口输出信息 至此,STM32H503RBT6-Nucleo的printf已经讲完了,其实printf还可以做很多事情,log输出,简单的字符串输出都可以用它,非常简单方便。
|