stm32串口调试助手_Advanced Clock板调试(五)

蓝牙模块的调试,在我们本文中,主要是蓝牙模块通过发送或接收空间电磁信号,进而通过此种方式与手机app或者电脑客户端进行数据的交互,使用蓝牙自己的接收与发送功能进行数据的收发。蓝牙接收数据后,通过其既有的与STM32F407相连接的串口进行数据交互(在我们本板中,蓝牙与STM32核心交互为通过串口2,即UART2来进行交互的)。

814080d50c3b280507609e0f4d457c98.png      e6197b54a1d32fef59efe882b6cdf948.png

如上所描述为整体的数据大致的流向说明。在此,我们详细阐明蓝牙、串口、STM32芯片之间数据信息的具体发送接收流程,如下图所示:

e347e5456ee60f3504d890888e60cf8f.png

如上图,链路 1 具体解释为,手机专用的调试蓝牙 app 键入数据,蓝牙通过自身功能接收手机 app 键入数据,当蓝牙接收到数据后,通过 uart2 将数据发送给 stm32 ,然后 stm32 将接收到蓝牙的数据再通过串口 1 发送给我们的串口调试助手 XCOM2.0 如上图,链路 2 具体解释为,我们直接通过代码,将数据送给 stm32 ,此时 stm32 通过串口 2 将数据发送给蓝牙,蓝牙再通过自身的功能,将数据发送给手机 app 进行显示。 如上图,链路 3 具体解释为,手机专用的调试蓝牙 app 键入数据,蓝牙通过自身功能接收手机 app 键入数据,当蓝牙接收到数据后,通过 uart2 将数据发送给 stm32 ,然后 stm32 将接收到蓝牙的数据再通过串口 2 回传给蓝牙模块,蓝牙再通过自身的功能,将数据发送给手机接收, app 显示。 通过以上举例,我们将三条链路的大致数据流向整明白以后,可以总结得知:其实,该运行调试试验以串口的接收与发送为主,蓝牙模块其实近似可以看做无线串口(该串口用于手机与蓝牙之间的交互),其实大多通信大致如此,后面我们会继续推出 WiFi 模块的调试大同小异,不过 WiFi 模块我们使用到串口 3 ,即 uart3 来与 32 芯片进行交互。 在我们本篇推送中,笔者将以链路 1 为例,来编写说明其相关操作代码,其他链路大同小异,举一反三即可实现相关操作。实现该操作的大致代码流程如下:   1.初始化HAL库、初始化系统时钟、初始化延时函数   2.初始化串口相关参数,设置波特率,输入输出模式等   3.编写HAL_UART_MspInit函数,在该函数中对相关IO口进行初始化,初始化串口和IO口时钟、设置复用及IO口模式   4.使能串口接收中断,开启接收中断   5.编写中断服务函数,调用中断通用处理函数   6.编写中断回调函数,实现我们想要实现的逻辑,如将接收来的数据取出,使用Transmit函数将数据进行发送等操作。

如下为具体的代码块截图:

首先,在本实验中串口 1 和串口 2 都使用到了,故我们需要分别使能串口 1 和串口 2 ,并初始化其对应的相关参数,如下图所示

d98323da455bcb925704271100bc9d60.png

fd75aaa52b315bf31e33a8d352e07212.png

其次,由于串口初始化函数 UART_Init 函数体内部会调用 Msp 这个弱函数,所以我们需要重新定义编写弱函数,并在该函数中对串口和 IO 口进行时钟使能、初始化 IO 口,并设置 IO 口相关参数,设置复用等模式,并将相关 IO 口复用为串口。同时设置中断优先级并使能中断通道,如下图所示:

6e0b57f5759e3773001539400d492843.png

c99d255c2d6bba62d6f674845143ac05.png

如上面代码块截图所示,由于在该实验中我们同时用到了串口 1 和串口 2 ,并且在调用了串口初始化函数后,都会进入 MspInit 函数,在这个函数体里面,我们分别对 IO 口的复用操作,所以为了区分串口 1 对应的参数设置和串口 2 对应的参数设置,我们需要在前面判断串口 1 和串口 2 ,然后再 if 条件语句内部进行相应的处理。 再接下来,由于在我们本实验中用到了 uart1 和 uart2 的接收中断,所以我们需要使能串口 1 和串口 2 的接收中断,并开启接收中断。如下图所示:

7915b36cd6414725dad6cc36ca2c1109.png

若遇到外部传输,并接收到相关数据时,由于使能并开启了串口 1 和串口 2 的相关接收中断,各自串口在接收到数据时,会进入对应的中断服务函数。所以我们需要编写对应的中断服务函数,并在该函数中调用中断公用处理函数,如下所示:

1bf920011ef7e30e21180af6f69f72a5.png

ce95079256e333f2c0b4503ecae27ad2.png

如此以来,若是串口 1 收到数据,就进入串口 1 相关的中断处理,若是串口 2 收到数据,就进入串口 2 相关的中断处理,进入到中断公用处理函数后,函数体内部会调用回调函数,该回调函数也是一个弱函数,需要我们用户来编写,在该弱函数中编写我们用户需要到的真正的逻辑,如下图所示:

33f77d043c91f00df5d7af02ea9c04bd.png

同上面 MspInit 函数一样,由于在该实验中我们同时用到了串口 1 和串口 2 ,并且在调用了中断处理公用函数后,都会进入这个中断回调函数,在这个函数体里面,我们分别实现对于串口 1 中断和串口 2 中断的相关操作,所以为了区分串口 1 对应的中断操作和串口 2 对应的中断操作,我们需要在前面判断串口 1 和串口 2 ,然后再 if 条件语句内部进行相应的处理。上面语句的含义大致为,若串口 1 接收到数据(该数据从我们的 XCOM 来键入, 32 芯片通过串口 1 来接收),我们将该数据取出,使用 Transmit 函数通过串口 2 发送,即发送给蓝牙模块。 当发送给蓝牙模块时候,此时会有两种选择: 第一,如果蓝牙处于未连接状态,我们通过 XCOM2.0 向蓝牙发送 AT 相关指令( AT 相关指令详见汇承官网蓝牙模块调试说明),蓝牙会马上回传数据,此时,蓝牙会通过串口 2 将数据回传,即若串口 2 接收到数据(该数据由蓝牙来回传, 32 芯片通过串口 2 来接收),我们将该数据取出,使用 Transmit 函数通过串口 1 发送,即发送给 XCOM2.0 进行显示。 第二,如果按压蓝牙处于连接状态,此时蓝牙会自动处于透传模式,通过 XCOM2.0 通过串口 1 向 stm32 发送相关数据, stm32 收到数据马上接受并将该数据取出,经过串口 2 将数据发送给蓝牙,此时蓝牙由于处于透传模式,不会马上回传数据,而是会将蓝牙接收到的数据显示于手机 app 界面。相反,通过手机 app 向蓝牙发送也大同小异,一样的道理,如下图所示,为手机 app 发送相关数据界面:

2338d492fda60557fe0d10c3b77f5de6.png

对应的XCOM会接收到相应的数据传输,如下图所示:

07d3c662987281fcf18bc15ba9e02a42.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值