在 main 文件中,配置好串口之后,就通过几行代码由串口往计算机超级终端打印信
息,打印的信息为一些字符串和当前的日期,见代码清单 8- 4。代码清单 8- 4 通过串口往计算机超级终端打印信息
01 printf("\r\n this is a usart printf demo \r\n");
02
03 printf("\r\n 欢迎使用野火 iSO STM32 开发板 \r\n");
调用这三个函数看似很简单,但在这三个 函数的背后还得做些工作,我们先来看
printf() 这个函数。要想 printf() 函数工作的话,我们需要把 printf() 重新定向到串口中。重
定向是指用户可以自己重写 C 的库函数,当连接器检查到用户编写了与 C 库函数相同名字
的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。
为了实现重定向 printf() 函数,我们需要重写 fputc() 这个 C 标准库函数,因为 printf()
在 C 标准库函数中实质是一个宏,最终是调用了 fputc() 这个函数。
重定向的这部分工作,由 usart.c 文件中的 fputc(int ch, FILE *f) 这个函数来完成,
这个函数具体实现见代码清单 8- 5。
代码清单 8- 5 fputc 函数重定向
01 ///重定向 c 库函数 printf 到 USART1
02 int fputc(int ch, FILE *f)
03 {
04 /* 发送一个字节数据到 USART1 */
05 USART_SendData(USART1, (uint8_t) ch);
06
07 /* 等待发送完毕 */
08 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
09
10 return (ch);
11 }
这个代码中调用了两个 ST 库函数。USART_SendData( ) 和 USART_GetFlagStatus( ) 的
息,打印的信息为一些字符串和当前的日期,见代码清单 8- 4。代码清单 8- 4 通过串口往计算机超级终端打印信息
01 printf("\r\n this is a usart printf demo \r\n");
02
03 printf("\r\n 欢迎使用野火 iSO STM32 开发板 \r\n");
调用这三个函数看似很简单,但在这三个 函数的背后还得做些工作,我们先来看
printf() 这个函数。要想 printf() 函数工作的话,我们需要把 printf() 重新定向到串口中。重
定向是指用户可以自己重写 C 的库函数,当连接器检查到用户编写了与 C 库函数相同名字
的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。
为了实现重定向 printf() 函数,我们需要重写 fputc() 这个 C 标准库函数,因为 printf()
在 C 标准库函数中实质是一个宏,最终是调用了 fputc() 这个函数。
重定向的这部分工作,由 usart.c 文件中的 fputc(int ch, FILE *f) 这个函数来完成,
这个函数具体实现见代码清单 8- 5。
代码清单 8- 5 fputc 函数重定向
01 ///重定向 c 库函数 printf 到 USART1
02 int fputc(int ch, FILE *f)
03 {
04 /* 发送一个字节数据到 USART1 */
05 USART_SendData(USART1, (uint8_t) ch);
06
07 /* 等待发送完毕 */
08 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
09
10 return (ch);
11 }
这个代码中调用了两个 ST 库函数。USART_SendData( ) 和 USART_GetFlagStatus( ) 的
说明见图 8- 3 及图 8- 4。
具体参考零死角玩转stm32