IT技术之家

首页 > 嵌入式

嵌入式

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

发布时间:2022-10-24 18:00:04 嵌入式 0次 标签:单片机 stm32 嵌入式硬件 蓝牙 LED
小白转行入门系列---手机蓝牙控制STM32开发板,打开和熄灭LED,二极管...

文章目录

引言导读一、通信基础知识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", 即可灯亮,发送其他则灯灭。