STM32
登录
直播中
1123127317
8年用户
1033经验值
擅长:制造/封装 接口/总线/驱动
私信
关注
[问答]
如何利用STM32F4串口重定向Printf()?
开启该帖子的消息推送
STM32F407
如何利用
STM32
F4串口重定向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:后面对话框里选择。如下图:
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:后面对话框里选择。如下图:
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32F407
如何去实现
stm32F
0和
stm32F4
的
printf
重定向
呢
2021-12-02
677
如何去实现sw
4stm32
串口重定向
呢
2021-12-02
640
怎么去解决
STM32
串口重定向
printf
出现FILE未定义的问题呢
2021-12-02
2141
STM32
使用
串口重定向
printf
打印时程序不执行是为啥呢?
2021-12-01
754
串口重定向
是什么意思?
2021-12-08
5233
如何去实现
STM32
printf
的
串口重定向
呢
2021-12-01
560
如何实现
printf
()函数与scanf()的
串口重定向
?
2021-12-01
696
如何将
串口重定向
printf
函数呢
2021-12-01
838
如何去实现
printf
()函数与scanf()的
串口重定向
呢
2021-12-02
1495
如何去实现
STM32
的
串口重定向
呢
2022-02-18
665
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分