当前位置: 首页 > news >正文

STM32_实验2_printf函数重定向输出

掌握串口通信,并将 printf 函数重定向到串口输出。

USART1 global interrupt 的使能与不使能对系统的影响主要体现在如何处理串口通信事件上,如数据接收和发送的方式。这些不同的配置会直接影响系统的效率、响应时间以及资源的使用。

 配置printf函数使用:

1.为项目添加一个 C 语言源文件,命名为 “retarget.c”。

 在文件中添加如下代码:

#include "retarget.h"
#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include "retarget.h"
#include <stdint.h>
//#include "usart.h"
#if !defined(OS_USE_SEMIHOSTING)
#define STDIN_FILENO  0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
UART_HandleTypeDef *gHuart;
void RetargetInit(UART_HandleTypeDef *huart)
{gHuart = huart;/* Disable I/O buffering for STDOUT stream, so that* chars are sent out as soon as they are printed. */setvbuf(stdout, NULL, _IONBF, 0);
}
int _isatty(int fd)
{if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)return 1;errno = EBADF;return 0;
}
int _write(int fd, char *ptr, int len)
{HAL_StatusTypeDef hstatus;if (fd == STDOUT_FILENO || fd == STDERR_FILENO){hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);if (hstatus == HAL_OK)return len;elsereturn EIO;}errno = EBADF;return -1;
}
int _close(int fd)
{if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)return 0;errno = EBADF;return -1;
}
int _lseek(int fd, int ptr, int dir)
{(void) fd;(void) ptr;(void) dir;errno = EBADF;return -1;
}
int _read(int fd, char *ptr, int len)
{HAL_StatusTypeDef hstatus;if (fd == STDIN_FILENO){hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);if (hstatus == HAL_OK)return 1;elsereturn EIO;}errno = EBADF;return -1;
}
int _fstat(int fd, struct stat *st)
{if (fd >= STDIN_FILENO && fd <= STDERR_FILENO){st->st_mode = S_IFCHR;return 0;}errno = EBADF;return 0;
}
#endif //#if !defined(OS_USE_SEMIHOSTING)
 2.为项目添加一个 C 语言头文件,命名为 “retarget.h”

添加头文件代码如下:

#ifndef FIRMWARE_RETARGET_H
#define FIRMWARE_RETARGET_H
#ifndef _RETARGET_H__
#define _RETARGET_H__
#include "main.h"
#include <sys/stat.h>
#include <stdio.h>
void RetargetInit(UART_HandleTypeDef *huart);
int _isatty(int fd);
int _write(int fd, char *ptr, int len);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char *ptr, int len);
int _fstat(int fd, struct stat *st);
#endif //#ifndef _RETARGET_H__
#endif //FIRMWARE_RETARGET_H
3.打开项目文件 Core->Src->syscalls.c,为避免重定义,将以下几行注释:

4.打开项目文件 Core->Src->main.c,在如下位置添加一行代码实现串口重映射初始化,如图所示:

RetargetInit(&huart1);

 以上是为了打印调试信息添加的串口重映射配置。

5.打开项目文件 Core->Src->main.c,在如下位置添加代码,如图所示:

包含头文件。:#include<stdio.h>

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "retarget.h"
/* USER CODE END Includes */

 uint8_t data;

  /* USER CODE END 2 */RetargetInit(&huart1);/* Infinite loop *//* USER CODE BEGIN WHILE */HAL_UART_Receive_IT(&huart1,&data,1);
 6.打开项目文件 Core->Src->usart.c,在如下位置添加代码,如图所示:

extern uint8_t data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(huart, &data, 1, 0);HAL_UART_Receive_IT(huart, &data, 1);
}
7.使用 printf 间隔 2s 循环打印 "ok\r\n"。


http://www.mrgr.cn/news/50497.html

相关文章:

  • 矩阵相关算法
  • 抖音电商推出运费险优惠 预计为商家一年降本超40亿元
  • ARM64使能kdump
  • 012集——CAD图中线段坐标导出到txt(CAD—C#二次开发入门)
  • 浅谈Java之接口
  • 【C】分支与循环1----if与switch
  • rust中编译宏控
  • AFSim仿真系统 --- 系统简解_11 行为与行为树
  • 苹果研究员质疑大模型!我们测试了6款,发现了4大真相
  • 病毒感染时间 题解 MarsCode
  • CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR
  • GestaltMML——用于诊断罕见遗传疾病的多模态模型
  • 网站服务器监控:Lighttpd指标解读
  • numactl 设置 numa 内存分配规则
  • VUE项目基于源码实现可视化编程技术的探索
  • 【C语言教程】【常用类库】(十二)信号处理库 - <signal.h>
  • 【论文速读】字节跳动音乐生成模型 Seed-Music
  • keepalived实现高可用
  • Spark内置函数:字符串、日期和时间函数、聚合函数、数值函数、条件判断函数、窗口函数
  • YOLOv11改进策略【卷积层】| ECCV-2024 Histogram Transformer Block 适用于噪声大,图像质量低的检测任务