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

硬件连接

原理图:

 

e-link32与DragongFly连接图:

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

软件实现

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:后面对话框里选择。如下图:

大家如果有什么不懂或者疑惑,可以关注公众号:“电子开发学习”和QQ群“260909804”中查相关资料和询问~~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值