打印
[STM32L0]

STM32-串口通讯协议开发03(学习小马哥四轴小记)

[复制链接]
2029|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
硬件连接

原理图:


e-link32与DragongFly连接图:

本实验用到USART1,他的Tx引脚对应MCU的PA9,Rx引脚对应MCU的PA10。我们将PA9和PA10引出来到OpenMV的接口排针Tx->P5,Rx->P4。


使用特权

评论回复
沙发
和下土|  楼主 | 2021-9-27 19:23 | 只看该作者
软件实现
IO引脚复用功能初始化
我们需要将PA9和PA10当做USART1的Tx和Rx引脚来用,也就是说此节课的PA9和PA10已不是通用IO的作用了,而是芯片内部的外设的接口引脚。STM32将这种应用叫做“I0引脚复用”,这也就说PA9将被配置成“复用推挽输出模式”,PA10将被配置成“复用上拉输入模式”。

使用特权

评论回复
板凳
和下土|  楼主 | 2021-9-27 19:24 | 只看该作者
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需要初始化为复用模式。其他外设复用方法类似。

使用特权

评论回复
地板
和下土|  楼主 | 2021-9-27 19:28 | 只看该作者
USART的IO引脚初始化
USART1GPIO配置如下图所示:



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

使用特权

评论回复
5
和下土|  楼主 | 2021-9-27 19:30 | 只看该作者
USART外设初始化流程
USART的初始化所需要调用到stm32f4xx_usart.c和stm32f4xx_usart.h文件,其中.h文件中存放了关于USART的所有功能接口函数,大家需要仔细研究。在这里就不一一讲解。

USART1外设初始化的步骤如下图所示:



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

使用特权

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



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

使用特权

评论回复
7
和下土|  楼主 | 2021-9-27 19:35 | 只看该作者
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文件,然后添加到工程中来(一定要注意包含头文件路径)。

使用特权

评论回复
8
kyzhd| | 2021-9-28 09:13 | 只看该作者
好帖,感谢分享。

使用特权

评论回复
9
和下土|  楼主 | 2021-9-28 13:26 | 只看该作者
Main.c里的程序写好后,编译通过后下载进入DragonFly学习平台,如果会发现D5闪烁,说明程序运行良好。然后打开串口调试助手,设置必须严格按照USART初始化的帧格式设置,否者无法正常通信如图所示:

使用特权

评论回复
10
和下土|  楼主 | 2021-9-28 13:27 | 只看该作者
最后按硬件连接图连接电脑,串口调试助手上显示如下图所示:

使用特权

评论回复
11
和下土|  楼主 | 2021-9-28 13:28 | 只看该作者
如出现如图说示数据说明DragonFly串口与电脑串口通信成功,如果没有数据可参考我每节课后附的源码仔细对比研究。

使用特权

评论回复
12
和下土|  楼主 | 2021-9-28 13:29 | 只看该作者
注意:

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

使用特权

评论回复
13
和下土|  楼主 | 2021-9-28 13:32 | 只看该作者
如果你用的是UTF8的编码格式,是不能打印汉语的,需要更改成ANSI编码,更改编码方式Edit->configuration->Encoding:后面对话框里选择。如下图:

使用特权

评论回复
14
wakayi| | 2021-10-11 11:13 | 只看该作者
自定义的协议吗

使用特权

评论回复
15
wowu| | 2021-10-11 11:15 | 只看该作者
反馈信号处理比较重要

使用特权

评论回复
16
木木guainv| | 2021-10-11 11:23 | 只看该作者
能下载工程文件吗

使用特权

评论回复
17
xiaoqizi| | 2021-10-11 11:57 | 只看该作者
编码格式如何确定呢

使用特权

评论回复
18
tpgf| | 2021-10-11 12:05 | 只看该作者
有些格式显示出来确实是乱码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

1067

帖子

0

粉丝