1、掌握STM32 HAL库的串口重定向
2、具体目标:1、实现printf “打印”各种常用的类型的数据变量
UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
UART 在开发中应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个UART 通信接口连接至电脑,用于在调试程序时可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错,具体在哪里出错等等。
①:需要在 main.c 文件中添加如下代码
- /* USER CODE BEGIN Includes */
-
- #include
-
- /* USER CODE END Includes */
- /* USER CODE BEGIN 4 */
-
- /*********************************************************
- *
- *重定义 fputc 函数
- *
- *********************************************************/
- int fputc(int ch,FILE *f)
- {
- HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
- return ch;
- }
- /* USER CODE END 4 */
②:在Keil5中勾选如下选项
①:需要在 main.c 文件中添加如下代码
- /* USER CODE BEGIN Includes */
-
- #include
-
- /* USER CODE END Includes */
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
-
- };
-
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- //二选一,功能一样
- HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
- return ch;
-
- // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
- // USART1->DR = (uint8_t) ch;
- // return ch;
- }
说明:上面两种方法二选一即可
1、定义各类型变量
- /* USER CODE BEGIN PV */
-
- int i = 0;
- float m = 3.14;
- char c = 'A';
- char *str = "Hello 李银河!";
-
- /* USER CODE END PV */
2、在while (1) 里 打印各变量的值
- i++;
- printf("i = %d\r\n",i);
-
- printf("m = %.2f\r\n",m);
-
- printf("c = %c\r\n",c);
-
- printf("str = %s\r\n",str);
-
- HAL_Delay(200);
说明:proteus不能使用printf发送浮点型数据,一旦发送就会卡死。仿真时将小数打印代码屏蔽。
1、串口打印在开发中非常重要,它就像是工程师的眼睛一样。尤其是在调试代码时,工程师可以利用串口打印出想要知道的变量等的值,以利于查找问题所在。