[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出(参考官方例程)

  • 使用标准库实现本次功能的源代码已上传:
  • https://github.com/yzmj0986/STM32_Std.lib_USART_Printf.git

 

TIPS:作为一只新手,从标准库转到HAL库确实很不习惯,这个程序配置很简单但是代码也是纠结了很久,最终参考了官方的USART_Printf例程,下载见:STM32Cube官方例程学习指南。

 

MCU:STM32F103ZET6

IDE:  MDK-ARM V5 +STM32CubeMX5.0.0

串口调试助手:SSCOM3.2

 

功能描述:USART1收到PC机发来的数据后原封不动的返回给PC机显示,但是C语言中printf函数默认输出设备是显示器,要使用printf输出到串口,需要将fputc里面的输出指向串口,这一过程就叫重定向。

需要配置的只有USART1,配置过程非常简单。

一. 在 Pinout&Configuration---System Core中:

  • 1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator

  • 2. 设置系统SYS的Debug为Serial Wire:

二. 在 Pinout&Configuration---Connectivity中:

  • 1. 打开USART1,并设置模式为异步收发模式Asynchronous:

  • 2. 设置USART1的参数,通用的“96-N-8-1”模式,即波特率9600,N校验位(无校验),数据位数为8,停止位为1位:

  • 3. 串口通信方式有:查询、中断、DMA三种,因此要使能USART1的中断,在NVIC使能选项中打钩:

[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出(参考官方例程)_第1张图片

三.在 Clock Configuration中:

配置时钟为72 Mhz。

四.在 Project Manager---Project中:

  • 1.设置项目的名称以及保存的位置,选择Toolchain/IDE为MDK-ARM V5,

Tips:最好把Linker Settings中的Minimum Heap Size设置为0x600。

[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出(参考官方例程)_第2张图片

  • 2.在Code Generator选项中如下勾选:

最后点Generate Code生成代码,并选择“Open Project”:

五.代码分析与改写:

将printf()函数的输出功能映射到串口上:

  • 1. 首先在main.c中进行宏定义:

/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#endif /* __GNUC__ */
  • 2. 对于MDK-ARM编译器,在main.c中加入重定向函数:(此处与官方例程中不同,将&UartHandle改为&huart1)
/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
	
	return ch;
}
/* USER CODE END 0 */

此处附上标准库实现的printf重定向代码供参考:(仅供参考,无需添加)

int fputc(int ch,FILE *p)     //Printf重定向
{
	USART_SendData(USART1,(u8)ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	return ch;
}
  • 3. 在main.c的while(1)循环中添加输出内容:
/* USER CODE BEGIN 3 */
	  printf("zytjasper blog printf function USART1 output \r\n");
	  HAL_Delay(1000);

如果不想一直输出,只输出一次就将输出内容放在循环外:

/* USER CODE BEGIN 2 */
	printf("\n\r zytjasper blog \n\r");
/* USER CODE END 2 */

至此,编译后无错并下载到开发板中,就完成了通过STM32CubeMX调用HAL库实现printf函数串口通信的效果程序,实验结果如下:

[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出(参考官方例程)_第3张图片

这次只是按照官方例程实现了这个功能,但感觉理解USART还比较吃力,尤其是对中断方式串口通信还不是很清楚,Mark一下,以后学习懂了回头再讨论。

你可能感兴趣的:(STM32单片机)