小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

2022-12-05,,,,

@

目录
引言导读
一、通信基础知识
1.1 通信到底传输的是什么?
1.2 比特率和波特率
习题
1.1 双工和单工
习题
1.2 串行和并行
1.3 异同通信和同步通信
习题
二、连接STM32单片机
2.1 编程环境
2.2 硬件接线
2.2.1 接线图
2.2.1 硬件介绍和设置
2.3 编码
2.3 手机控制二极管

引言导读

    本文适合小白简单入门,大神请绕行。想讲的尽量透彻,所以篇幅啰嗦,介意的绕行。

    蓝牙模块基本是通用的,所以看这一篇教程,如果你的蓝牙模块与我的不一样,也不要担心,原理是通的。

    蓝牙是通信的一种,故想要学好STM32与蓝牙连接,掌握一点点基本通信知识是需要的。

    本次涉及到的硬件包括STM32F103C8T6最小系统板(其实其他版本都是可以的)和蓝牙模块买的是集芯微的BLE5.0(这家挺便宜,就是资料少,JDY-31,HC-06等都可以),此外还需要面包板和杜邦线若干。

    买的蓝牙模块没有焊接排针,而且竟然是小号排针,又手残焊接不好。最后,买了锡膏和热风机焊接,小号排针用网线代替了(网线也可以当作杜邦线用)。不过锡膏有毒,所以焊接时候注意通风,使用时最好带手套或者之类的,具体自动百度或者bilibili。

一、通信基础知识

1.1 通信到底传输的是什么?

在逻辑层面,通信传输的是比特也就是二进制数。在物理层面上,当线路为电路时,发送方发送一个个持续小段时间的电压信号来表示这些二进制数,比如双方约定一个0.001秒的0V代表数字0,5V代表数字1,发送方发送先后发送两个持续0.001秒的0V和一个0.001秒的5V,就是相当于发送了001。这种持续一段时间的电压信号就是码元。当线路为无线电波时,码元就是一份份的电波了。由于电信号是一种波,所以可以认为我们在线路上传输了一个个波。

1.2 比特率和波特率

通信速度有多快呢?在逻辑层面上,用比特率(Bitrate)来衡量,它代表单位时间内传输的bit数量,单位是bit/s。在物理层面上,使用波特率(Baudrate),它表示单位时间内传输的码元(即,波)数量,码元就是上面的提到的电平信号,所以叫做波特率。通常下一个码元代表一个二进制数,这时比特率和波特率是相等。也有不等的时候,比如用0V表示0,2V表示1,4V表示2,6V表示3,这时候一个码元代表一个四进制数,则比特率是波特率的二倍。

习题

开放题目,言之成理即可,只考虑一般情形,不考虑特殊情况。

    比特率和波特率的区别和联系?

1.1 双工和单工

通信类似于AB市通车,码元类似于一辆辆汽车。

名词 定义 例子
单工通信 通信线路是单向,从始至终都是发送方和接收方是固定的 车子只能从A市到B市,B市的车子不能开往A市。
双工通信 线路是双向,数据可以从A流向B,也可以从B流向A,即通信双方都可以发信息给对方,又可以分为半双工和全双工 A市的车可以开到B市,B市的车子也可以到A市。
全双工 线路全时段对双方开放,任何时间任何一方都可以发送信息给对方 AB市之间路很宽,两市间车子可以自由来往
半双工 线路只能在某段时间内对某方开放,双方轮流使用线路,即指某时间内,只能一方发送一方接受。 AB两个城市间公路很窄,只能容纳一辆车通行,AB两方约定8点-9点是车子只能从A市到B,9-10点是B市到A市,这样轮流交替。

单工和双工是对应的,按照线路是双向的还是单向的进行划分。

全双工和半双工是成对,他们是按照线路是否全时间段对双方开放使用。

全双工比半双工要复杂,效率高,发送数据多,成本更高。半双工要简单,双方需要约定好时间,不然会撞车

习题

开放题目,言之成理即可,只考虑一般情形,不考虑特殊情况。

    两人交谈属于哪种通信?
    校会上,校长发言属于哪种通信?
    两人吵架属于哪种通信?
    上课传纸条属于哪种通信?

1.2 串行和并行

并行通信指双方之间通过多根信息线(8根以上)传输数据,数据可以并行传输,即公路很宽能够容纳多辆车并行行驶。

串行通信指双方之间通过很少根信息线(8根及以下)传输数据,数据犹如被一根线串起来的珍珠,所以叫做串行。

串行通信抗干扰能力强,线路铺设费用低,速率低。

1.3 异同通信和同步通信

为什么要有同步和异步,或者它们是怎么来的?要想回答这个问题,我们需要考虑一个场景:如何传输大量数据?这个问题是没有完美解决方法的,但是最优方法是:当传输线路等硬件既定时,在线路满负荷下可以最快完成数据传输,也就是说:发送方马不停蹄地发送数据,接收方也及时接收信息,同时为了尽可能保证数据传输安全性,接受方接受一个信息后要给一个是否成功接收的状态,发送方在接受这个状态后才能发送下一个信息。实现这种马不停蹄,最简单是双方按同一套时间步调一致发送、接收和检验信息,就像生产线一样,每个人在规定的时间内步调一致地完成各自的动作,以达到效率最高。这就是同步通信过程。

异步通信则是为了完成小数据量传输,比如操控遥控车,这种场景下通常发送方不定时地发送少量信息,接收方接收后无需回复。相比于同步通信这是不安全的,但是这无所谓,可以通过其他方式来修正这种不安全。比如:遥控汽车,因为某个因素,汽车没有接受到转向,那么人会再次操作一遍转向操作,问题不大。异步通信就不要求双方在同一套时间下进行同步操作,只要它们是相近的时间就好。但是,双方要有相同的波特率。

这里的时间,其实就是时钟周期,类似于人把时间分为年月周日时分秒,时钟周期是把1秒分为很多份,是芯片设备的时间。

习题

    在异步通信中,为什么通常情况下,双方要保持一样的波特率?

二、连接STM32单片机

下面进入正题

2.1 编程环境

    CubeIDE
    面包板和连接线

2.2 硬件接线

下面给出了接线图,

2.2.1 接线图

2.2.1 硬件介绍和设置

買的蓝牙模块如上图,其VDD GND是接输入电源的正负极,他要求输入3.3V电压,我用的STM32板子上的电源。RXD TXD是用于连接STM32板子的,RXDreceive external data引脚,用于接收来自单片机的信息,TXD引脚用于向单片机发送信息。买的模块一般都附赠规格说明书,比如引脚、电压、模块默认蓝牙名字和波特率等。

STM32是通过USART连接蓝牙模块,UART属于异步全双工通信,包含两根线单向通信线,分别接上述提到的两个引脚。我用的是STM32F103C8T6芯片,它自带有三组USART,这里选用USART1,CubeIDE会自动选择PA10和PA9两个引脚与蓝牙进行通信。具体如下图:

2.3 编码

在这里添加如下代码:

  uint8_t rx = 0; // 定义一个无符号整形数,用于接收蓝牙发送的数据。
while (1)
{
/* USER CODE END WHILE */
// 用于接受来自蓝牙发来的数据。
// &huart1 是一个封装好的结构体,代表那两个引脚,HAL_UART_Receive函数会自动识别使用PA10进行接受数据。
// &rx,接收蓝牙信息放到rx中,由于rx是整形数字,直接传递给函数,传过去的只是副本,所以要传递其引用。
// 1,表示接受一个字节(8个二进制)。
// HAL_MAX_DELAY 表示接受一个蓝牙信号后,单片机就停下来死等下次接收蓝牙信息。
HAL_UART_Receive(&huart1, &rx, 1, HAL_MAX_DELAY); // rx == '1', 蓝牙传输过来的是一个字符1而不是数字。
if (rx == '1'){
HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_SET); # 输出高电平,灯亮
}else{
HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_RESET); # 输出低电平,灯灭
}
/* USER CODE BEGIN 3 */
}

编译代码并下载到单片机上。

2.3 手机控制二极管

    搜索下载一款手机蓝牙调试助手,我用的是BLE调试助手这款APP。
    按照蓝牙名字,搜索并连接上蓝牙,然后给蓝牙发送"1", 即可灯亮,发送其他则灯灭。

小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED的相关教程结束。

《小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED.doc》

下载本文的Word格式文档,以方便收藏与打印。