STM32HAL库学习技巧1:基于STM32CubeMX printf重定向

STM32CubeMX配置后printf重定向(渝兴未到科技)

最近我找了好多都相识的文档,虽然百度上面一找一大把,我这边还是来写一下用STM32CubeMX配置好项目后如何做printf 重定向串口设置,有什么不对的地方希望大家提出来指正!!!

首先还是软件

在这里插入图片描述
用这个软件配置的大家有使用过的应该都不陌生把!!
然后我们随便配置一个项目!! 生成

既然是串口打印 一定要配置个串口哦 !!我这儿用的USART1

在这里插入图片描述
就像这样 !! 时钟简单弄一下 就生成文件了!! 我这边使用的是keil5 用的stm32f103c8t6
然后就生成文件
在这里插入图片描述

打开工程

在这里插入图片描述
额!!这里要勾选上!!原理嘛 我在网上找了一堆!!大家可以自己去了解一下!
在这里插入图片描述

然后 我们接下来开始配置重定向的函数

我写的简单就写在main.c 里面 hal库里面 对串口发送函数进行了包装

在这里插入图片描述

int fputc(int ch, FILE *f)
{

	HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, 0xFFFF); 
	while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//等待发送完成

	//while ((USART1->SR & 0X40) == 0); 
    //USART1->DR = (uint8_t) ch;
    return ch;
}

上面的&huart1 是根据自己定义的 使用的UART串口,(uint8_t *)ch 是数据值,1 是字节,0xFFFF 是超时时间。
在这里插入图片描述

printf函数使用自然也需要调用C语言的库

在这里插入图片描述

#include “stdio.h”

然后编译一下

在这里插入图片描述
然后使用就 C语言的printf 的使用。
然后我还是给个传送门大家可以参考一下

链接:https://pan.baidu.com/s/1HdWfzGwXAup2EZb8cWLl6A
提取码:uvq9

大家可以加入我们的交流群!!
在这里插入图片描述

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用STM32 HAL库的时候,我们可以使用DMA方式进行串口数据发送,同时也可以通过重定向printf输出到串口。下面给出一种实现方式: 首先,在初始化串口时,需要开启DMA传输模式。例如: ```c // 初始化串口 huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } // 开启DMA传输模式 __HAL_UART_ENABLE_DMA(&huart2, UART_DMA_TX); ``` 接着,我们需要在代码中实现重定向printf输出到串口的功能。可以通过重写标准输出流中的`_write`函数来实现。例如: ```c int _write(int file, char *ptr, int len) { if (file == STDOUT_FILENO || file == STDERR_FILENO) { // 确保DMA传输完成 while (HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX) ; // 启动DMA传输 HAL_UART_Transmit_DMA(&huart2, (uint8_t *)ptr, len); return len; } errno = EIO; return -1; } ``` 这里我们判断输出流是标准输出流或标准错误输出流时,才进行串口DMA传输。同时,为了避免重复启动DMA传输,需要等待之前的传输完成。 最后,我们就可以在代码中使用printf输出到串口了,例如: ```c printf("Hello, world!\r\n"); ``` 这样,我们就实现了STM32 HAL库串口DMA发送并与printf重定向的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值