文章目录
- 一、前言
- 二、STM32CubeMX生成代码
-
- [2.1 选择芯片](#2.1 选择芯片)
- [2.2 配置相关模式](#2.2 配置相关模式)
- [2.3 生成代码](#2.3 生成代码)
- 三、Keil重定义Printf
-
- [3.1 勾选"UseMicroLIB"](#3.1 勾选“UseMicroLIB”)
- [3.2 添加头文件和修改fputc和fgetc](#3.2 添加头文件和修改fputc和fgetc)
- 四、测试Printf的效果
-
- [4.1 字符串测试](#4.1 字符串测试)
- [4.2 格式化输出测试](#4.2 格式化输出测试)
- 五、存在问题的解决方法
-
- [5.1 检查串口号是否一致](#5.1 检查串口号是否一致)
- [5.2 打开MicroLIB](#5.2 打开MicroLIB)
- [5.3 换一个串口调试助手](#5.3 换一个串口调试助手)
- [5.4 复位一下](#5.4 复位一下)
- [5.5 对比博主的代码](#5.5 对比博主的代码)
一、前言
主要目的:利用串口来收发一些数据
使用芯片:STM32F407ZGT6
使用函数:HAL库
使用工具:STM32CubeMX + Keil uVision5
串口工具:XCOM V2.6
二、STM32CubeMX生成代码
2.1 选择芯片
2.2 配置相关模式
主要配置内容:
- 调试模式为Serial
- 设置USART1为异步模式
2.3 生成代码
自己给工程命名然后选择打开的编译器
三、Keil重定义Printf
3.1 勾选"UseMicroLIB"
在魔术棒中打勾"UseMicroLIB",否则即使我们include了stdio.h且编译器没没有报错的情况下仍然用不了printf。
3.2 添加头文件和修改fputc和fgetc
在usart.c
函数里面添加头文件,如下:
c
/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */
在usart.c
里面添加下面的代码。
c
/* USER CODE BEGIN 1 */
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
/* USER CODE END 1 */
四、测试Printf的效果
4.1 字符串测试
在main.c
函数的while1添加下面的代码进行测试:
c
printf("终于可以使用printf函数了!!!\n");
HAL_Delay(1000);
4.2 格式化输出测试
在main.c
函数的while1添加下面的代码进行测试:
c
/* USER CODE BEGIN 2 */
float f_num[] = {0.1,0.2,0.3};
uint8_t i_num[3] = {1,2,3};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("终于可以使用printf函数了!!!\n");
HAL_Delay(500);
printf("试一下格式化输出 ==> 浮点数:%.3f,\t整数:%d\n", f_num[0], i_num[0]);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
五、存在问题的解决方法
5.1 检查串口号是否一致
2.2 配置相关模式
中使用的是USART1,因此3.2 添加头文件和修改fputc和fgetc
中的这两个函数也是用USART1,如果有问题,看看是否有对应上。
如果你使用的是USART2,那你就把这两个函数里面对应的修改一下,举例一下,就是将下面的huart1
改为huart2
.
c
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);//修改这里的数字
return ch;
}
5.2 打开MicroLIB
就是3.1 勾选"UseMicroLIB"
的这一步,这个也是我解决一直没法使用printf的方法。
5.3 换一个串口调试助手
有可能是串口调试助手显示的问题,换一个试试看。
5.4 复位一下
有时候会忘记复位,程序可能还没启动。
5.5 对比博主的代码
上面的解决方法还是不行,你就对比我的上传的代码吧。