目录
1 新建cubemx工程
2 配置系统时钟
3 配置串口引脚
4 生成keil工程
5 补充代码
5.1 重定向printf
5.2 main函数
6 编译烧录
7 实验现象
1 新建cubemx工程
选择对应芯片
2 配置系统时钟
主频为64MHz
对应给到usart2的时钟也为64MHz
3 配置串口引脚
查阅原理图,可知usart2引脚连接了USB串口
4 生成keil工程
5 补充代码
5.1 重定向printf
首先介绍一下printf和scanf:
printf 函数根据 format 字符串给出的格式打印输出到 stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印。
printf 和fputc都定义在 <stdio.h> 头文件中:
//fputc函数原型
int fputc(int ch, FILE *stream);
//printf函数原型
int printf(const char *format, ...);
fputc 函数写入字符 ch 到给定输出流 stream,printf函数在调用该函数时,会向stream参数传入stdout从而打印数据到标准输出。
那么,要实现printf打印到串口就变得非常简单了,只需要重新定义fputc函数,在fputc的函数中将数据通过串口发送,称之为:fputc重定向或者printf重定向。同理,只需要重新定义fgetc函数,在scanf的函数中将数据通过串口接收,称之为:scanf重定向。
在usart.c文件中添加重定向函数(且记得在usart.h中添加头文件和声明):
#include "stdio.h"
//重定向scanf
int fgetc(FILE *f)
{
uint8_t ch=0;
HAL_UART_Receive(&huart2,&ch,1,0xffff);
return ch;
}
//重定向printf
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart2,temp,1,2);
return ch;
}
5.2 main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
uint16_t num = 0;
char c;
printf("code is ok!\n");
printf("please input start!\n");
scanf("%c\n",&c);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("%d\n",num++);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
6 编译烧录
编译烧录之前,需在魔术棒按钮中勾选Use MicroLib,不勾选将无法执行printf
MicroLib是对标准C库进行了高度优化之后的库,供MDK默认使用,相比之下,MicroLIB的代码更少,资源占用更少,在MDK编译环境下可以使用其MicroLib,快速实现printf重定向;
7 实验现象
根据提示输入start后,每0.5s打印一次数字:文章来源:https://www.toymoban.com/news/detail-708639.html
文章来源地址https://www.toymoban.com/news/detail-708639.html
到了这里,关于STM32+HAL库调试printf串口打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!