STM32
直播中

1123127317

8年用户 1033经验值
擅长:制造/封装 接口/总线/驱动
私信 关注
[问答]

如何利用STM32F4串口重定向Printf()?

如何利用STM32F4串口重定向Printf()?

回帖(1)

王建

2021-12-1 14:36:20
IO引脚复用功能初始化

我们需要将PA9和PA10当做USART1的Tx和Rx引脚来用,也就是说此节课的PA9和PA10已不是通用IO的作用了,而是芯片内部的外设的接口引脚。STM32将这种应用叫做“I0引脚复用”,这也就说PA9将被配置成“复用推挽输出模式”,PA10将被配置成“复用上拉输入模式”。
IO引脚的复用功能

我们知道,STM32F4 有很多的片内外设,这些外设的外部引脚都是由GPIO 复用得来的。也就是说,一个 GPIO如果可以复用为片内外设的功能引脚,那么当这个 GPIO 作为片内外设使用的时候,就叫做复用。并且片内外设的功能引脚也不是随意复用的,也就是说片内外设的功能引脚是特定在某个或者多个GPIO引脚上的。例如USART1的Tx引脚就固定在PA9/PA15上,Rx引脚就固定在PA10/PB3上。具体的哪个外设可以在哪个GPIO上进行复用,详细知识在《RM0383_STM32F411CCU6_Reference manual》第八章和《STM32f411xC Datasheet》芯片数据手册有详细的讲解。我们这里只讲解外设复用配置库函数。
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
第一个参数GPIO_TypeDef* GPIOx:表示哪个GPIO端口。
第二个参数uint16_t GPIO_PinSource:表示哪个IO口。
第三个参数uint8_t GPIO_AF:哪个外设功能。
我们来看看这最后一个参数uint8_t GPIO_AF的可能取值。如图下图所示:





例如:我们需要将PA9和PA10复用为USART1的Tx和Rx引脚,我们就可以调用此函数实现。





如上所示调用GPIO_PinAFConfig();就将PA9和PA10复用为复用为USART1的Tx和Rx引脚了,当然PA9和PA10需要初始化为复用模式。其他外设复用方法类似。
USART的IO引脚初始化

USART1GPIO配置如下图所示:





GPIO在上一节已讲过无需多说,需要注意是void GPIO_Config(void);是我们自己写的函数,还有就是PA9只需要配置成复用输出模式,PA10需要配置成复用输入模式。
USART外设初始化流程

USART的初始化所需要调用到stm32f4xx_usart.c和stm32f4xx_usart.h文件,其中.h文件中存放了关于USART的所有功能接口函数,大家需要仔细研究。在这里就不一一讲解。
USART1外设初始化的步骤如下图所示:





如上图所示USART1初始化的流程,这也是所有外设的初始化流程,和GPIO初始化不一样的地方,就是第四步外设使能,我们初始化完成后一定要使外设,否者外设将不会正常工作。
Printf()函数的重定向

经过前面的流程我们已经完成了所有的初始化工作,我们下面就可以直接调用串口数据发送函数USART_SendData();和串口数据接收函数USART_ReceiveData();来时实现DragonFly学习平台与电脑的通信实验,也就是通过USART1将数据打印到电脑。我们刚学习C语言时都是通过函数printf()将需要显示的数据打印到电脑,但是原来我们是在电脑上直接编程可以直接调用此函数,但是我们现在在STM32上编程则无法直接调用printf()来打印数据。那我们就需要将printf()重定向到串口,然后实现打印功能。如下图所示:





这个函数很简单就是调用USART_SendData()函数发送一字节数据,然后等待数据发送完成。USART_GetFlagStatus(USART1,USART_FLAG_TXE);的意义是获取USART1的发送数据寄存的状态,如果有数据函数就返回0,如果没有数据函数就返回1。
Printf的打印实验

外设准备完成,我们就在main.c里调用printf();打印一句话到电脑串口调试助手代码如图所示:





看上图我们发现和上一节GPIO的main.c差别较大,这次显得更简洁。主要是这次我们将GPIO外设初始函数和USART外设初始化函数分别放在单独的.c和.h文件中,然后像第一节课我们添加库文件一样将,led.c和led.h还有usart.c和usart.h都添加到我们之前预留的DRIVER工程文件夹中,然后我们以后需要调用哪个外设就只需包含他的头文件,直接调用即可。
如图2,3行代码就是包含了GPIO和USART的头文件,初始化GPIO和USART时,只需要调用我们提前写的初始化函数即可,像上图11、12那样调用LED_init();和USART_init();两个函数就将两个GPIO和USART初始化完成了。这样让我们的项目更容易管理也看起来更简洁,建议大家以后也用此方法。每个外设就建一个.c和.h文件,然后添加到工程中来(一定要注意包含头文件路径)。
Main.c里的程序写好后,编译通过后下载进入DragonFly学习平台,如果会发现D5闪烁,说明程序运行良好。然后打开串口调试助手,设置必须严格按照USART初始化的帧格式设置,否者无法正常通信如图所示:





最后按硬件连接图连接电脑,串口调试助手上显示如下图所示:





如出现如图说示数据说明DragonFly串口与电脑串口通信成功,如果没有数据可参考我每节课后附的源码仔细对比研究。
注意:



  • 写这个函数和调用printf()时需要包含“#include “stdio.h””的头文件,否者会报错。
  • 函数写完需要单击的图标,然后定位到Target界面勾选Use Micro LIB。如下图:









  • 如果你用的是UTF8的编码格式,是不能打印汉语的,需要更改成ANSI编码,更改编码方式Edit->configuration->Encoding:后面对话框里选择。如下图:






举报

更多回帖

发帖
×
20
完善资料,
赚取积分