重新开始学习的记录——#3-1:USART関連(重写prinf标准输出到串口)

大意了,本来想今天看ADC和DMA的(至少看一个吧),结果。。。。

掉进printf的坑里了(经验主义害死人)。。。。。

库函数也没仔细能看完。。。。。

直接说结论:只写了fputc函数,没有处理微库相关的设置

链接:https://www.cnblogs.com/jasonchan1202/p/9673548.html

下面是吐槽。。。。。呜呜呜呜

老样子,使用STM32CubeMX配置USART1。之后就简单试了一下端口的收发

然后,我就掉进坑里了······

为了方便输出消息,会去重定向printf标准输出到串口输出。也就是,重写一个名为fputc的函数,大概是下面这样:

int fputc(int ch,FILE* f)
{
  uint8_t temp[1]={ch};
  {
    //调用库函数,参数分别是:初始化串口的结构体,
    //                 发送数据用的字符/字符串,
    //                 发送的字节数,
    //                 最长等待时间
    HAL_UART_Transmit(&huart1,temp,1,2);
  }
  return HAL_OK;
}

我在重写后,随手写了个测试输出“USART1 TEST”.

但是把程序烧进去之后却没有反应。开始怀疑的方向是两个:1、usart1的端口配置错误;2、重写fputc时某个参数调用异常。而这两个问题都在看了数遍代码之后就被排除了。

而调试呢,发现连main函数都进不去。欸,就是在启动文件卡着,欸,就是玩。。。

调试画面

可怜我一个两百多斤的老胖子,下班饭都没吃,还要被调试折磨。。。不讲武德。。。

最后,我妥协了。我真调查不出来了。

结果,只是一个设置就好了····

只需要设置一下微库!!!!微库!!!!

啊~~~我胃哭啊

参照着链接去设置了,果然好了

ps:核心内容是看的人家的博客,没一点自己理解的东西,我都不敢点哪个“原创”

### 回答1: USART3_printf 是一个用于在 STM32 微控制器上使用 USART3 串口进行输出的函数。它可以将格式化的字符串和变量打印到串口上,类似于 C 语言中的 printf 函数。 以下是一个简单的例子,演示了如何在 STM32 上使用 USART3_printf 函数: ```c #include "stdio.h" #include "stm32f4xx.h" void USART3_printf(char* fmt, ...) { char buffer[256]; va_list args; va_start(args, fmt); vsprintf(buffer, fmt, args); va_end(args); int len = strlen(buffer); for (int i = 0; i < len; i++) { while (!(USART3->SR & USART_SR_TXE)); USART3->DR = buffer[i]; } } int main() { // 初始化 USART3 串口 RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; RCC->APB1ENR |= RCC_APB1ENR_USART3EN; GPIOD->MODER |= GPIO_MODER_MODE8_1 | GPIO_MODER_MODE9_1; GPIOD->AFR[1] |= (7 << GPIO_AFRH_AFSEL8_Pos) | (7 << GPIO_AFRH_AFSEL9_Pos); USART3->BRR = 42000000 / 9600; USART3->CR1 |= USART_CR1_TE | USART_CR1_UE; // 使用 USART3_printf 函数输出信息 USART3_printf("Hello, world!\r\n"); while (1) { // do something } } ``` 在上面的例子中,我们首先定义了一个 USART3_printf 函数,它使用 vsprintf 函数将格式化的字符串和变量转换为一个字符数组,并通过 USART3 的 DR 寄存器一个一个地发送到串口。在 main 函数中,我们初始化了 USART3 串口,并使用 USART3_printf 函数输出了一条 "Hello, world!" 的信息。 ### 回答2: USART3_printf是指在使用STM32USART3串口通信功能时,通过编程使得该串口能够实现数据的打印输出USART3是STM32微控制器中的一个串口模块,用于实现与其他设备的串行通信。而printf是标准C语言库中的一个函数,用于格式化输出数据。 在使用USART3时,可以通过编程将printf函数与该串口模块相关联,实现数据的打印输出。具体过程如下: 1. 首先需要在代码中引入相关头文件,包括stdio.h(包含printf函数定义)和stm32fxx.h(包含USART3模块的寄存器和相关配置)。 2. 接着需要对USART3进行初始化设置,包括波特率、数据位、停止位、校验位等配置。可以通过设置USART3的相应寄存器来实现这些设置。 3. 然后需要通过编程将printf函数与USART3进行关联。这可以通过重定向标准输出流来实现。具体做法是重写stdio.h中的标准I/O函数,使得输出的数据通过USART3进行发送。 4. 在程序中使用printf函数进行数据的格式化输出。可以使用类似于标准C语言中的printf格式控制符,来指定需要输出的数据类型和格式。输出的数据将会通过USART3发送出去。 通过上述步骤,我们就可以在使用USART3串口通信功能时,通过printf函数来实现数据的打印输出。这对于调试和调试过程中的信息输出非常有用,能够方便地查看程序的执行过程和数据的状态。 ### 回答3: USART3_printf 是一个功能函数,用于将数据通过USART3串口进行打印输出USART3 是一种通用异步收发传输器,它是STM32系列微控制器中的一个外设模块。USART3能够通过串口与其他设备进行通信,比如电脑、其他微控制器等。 printf 是一个常用的C语言函数,用于格式化输出USART3_printf 就是基于 printf 函数的封装,通过 USART3 串口将格式化后的数据发送出去。 USART3_printf 可以接受不同类型的参数,如字符型、整型、浮点型等,并将这些参数格式化成 ASCII 码,然后通过 USART3 串口发送出去。这样,我们就可以在开发过程中通过 USART3 串口及时打印出一些调试信息、变量的数值等。 USART3_printf 的使用非常简单,只需调用该函数,并传入所要打印的格式化字符串和相关参数即可。例如,可以使用以下代码实现通过 USART3 将字符串 "Hello World!" 打印出来: ``` USART3_printf("Hello World!"); ``` 通过上述代码,"Hello World!" 字符串会被格式化成 ASCII 码,并通过 USART3 串口发送出去,最终在外部设备上显示出来。 总之,USART3_printf 是一个方便的工具函数,能够简化开发过程中的调试工作,并提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值