[应用相关] 串口USART和蓝牙控制led灯

[复制链接]
352|0
wowu 发表于 2025-9-10 15:13 | 显示全部楼层 |阅读模式
3.1常见的通信方式
1.串行通信和并行通信
串行通信:速度比并行慢,占用的硬件资源少,通常只需要时钟线,一两根数据线还有片选线即可

并行通信:速度快,但需要很多根数据线、地址线等

4835068c0f8ce3fdc0.png

2.全双工、半双工和单工通信
·全双工:同一时刻双方可以互相发送、接收数据

·半双工:同一时刻只能有一方给另一方发送数据,即此发彼收,此收彼发

·单工:只能由发送方发送数据给接收方

7869268c0f8c878494.png

3.同步通信和异步通信
同步通信和异步通信都是针对串行通信而言

·异步通信


1.数据是以字符为单位组成字符帧传输的


2.字符帧由发送端一帧一帧的发送,每帧数据均是低位在前,高位在后,通过传输线被接收端一帧一帧的接收


3.发送端和接收端可以有各自独立的时钟来控制数据的发送和接收,这两个时钟各自独立,互不同步

4.接收端依靠字符帧格式来判断发送端是何时开始和结束发送的


5.字符帧也叫做数据帧,由起始位,数据位,奇偶校验位,停止位等部分组成,是异步通信的一个重要指标。

6.同步通信的另一个重要指标是波特率。

·同步通信


1.同步是指在约定的通信速率下,发送端和接收端的时钟信号和相位始终保持一致,保证通信双方在发送和接收数据时具有完全一致的定时关系


2.同步通信把许多字符组成一个信息帧,每帧的开始用同步字符来表示


3.在绝大多数场合下,发送端和接收端,采用的都是同一个时钟,所以在传送数据的同时还要发送时钟信号,以便接收端可以使用时钟信号来确定每一个信息位


4.同步通信一次通信只能传送一帧信息


4.通信速率

对于同步通信,通信速率由时钟信号决定,时钟信号越快,传输速度越快。
对于异步通信来说,需要收发双方提前统一通信速率,这也就是我们串口调试时,波特率不对显示乱码的原因。


1.比特率:系统在单位时间内传输的比特(二进制0或1)个数,通常用Rb表示,单位是比特(bit/s),缩写为bps。

2.波特率:系统在单位时间内传输的码元个数,通常用RB来表示,单位是波特(Bd)

3.码元:码元是通信中 “信号的最小单元”,通过不同状态承载数字信息,其核心作用是将抽象的比特信息转化为可传输的物理信号。

例如:

在二进制通信中,一个高电平信号可以表示 “1”,一个低电平信号可以表示 “0”,那么这个 “高电平” 或 “低电平” 就是一个二进制码元。
在四进制通信中,信号可能有 4 种状态(如相位 0°、90°、180°、270°),每种状态对应一个四进制码元,可表示 2 位二进制数(00、01、10、11)。

4.码元有N个状态时,比特率与波特率的关系式:Rb=RB x log2N

推导逻辑:

1 个 N 进制码元可以表示 N 种状态,对应log₂N个二进制比特(因为 2^ 比特数 = N)。

例如:

二进制(N=2):1 个码元携带log₂2=1比特;
四进制(N=4):1 个码元携带log₂4=2比特;
八进制(N=8):1 个码元携带log₂8=3比特。
波特率(RB)是每秒传输的码元数,因此每秒传输的总比特数(比特率 Rb)= 每秒传输的码元数 × 每个码元携带的比特数,即:
Rb = RB × log₂N。


5.常见的通信协议

在嵌入式中,有众多的通信协议,往往从性能,成本,稳定性,易用性等角度考虑选择合适的协议

3087368c0f8be14e46.jpg

3.2串口基础知识
1.电平特性

3244968c0f8b04ccd0.jpg

2.串口传输协议

4701768c0f8abe7c5e.png

参数概念:
·波特率:一般选波特率都会有9600,19200,115200等选项,其实意思就是每秒传输这么多个码元。

·起始位:先发出一个逻辑‘0”的信号,表示传输数据的开始。


·数据位:可以是5~8位逻辑“0”或”1",先传输Bit0,再传输bit1,以此类推。


·校验位:数据位加上这一位之后,使得“1”的位数应为偶数(偶校验)或者奇数(奇校验),以此来校验数据传送的正确性,校验位是可选的,可以不传输。


·停止位:它是一个字符数据的结束标志,数据线变回逻辑“1"。

3.STM32F103的USART资源

1.STM32103有三个通用同步异步收发器USART,两个通用异步收发器UART,USART也可以当作UART使用。
2.通常使用的是UART功能,USART在某些场合会使用到,选择通信方式使用场合决定。
3.可以通过电平转化芯片变为RS232/RS485电平。

3553168c0f8a535d8e.jpg

STM32F103UART框图

7008668c0f8a092350.png

1.TX:数据发送端口
2.RX:数据接收端口
3.SW_RX:在单线和智能卡模式下接收数据,属于内部端口,没有实际的外部引脚
4.RTS:在硬件流控制下用于指示设备准备好可以接收数据了,低电平表示可以接收数据。
5.CTS:在硬件流控制下用于指示设备以及发送完数据了,如果是高电平那么在本次数据发送完成后会阻塞下一次的传输,只有在低电平的时候才允许下一次传输。
6.CK:同步时钟端口,在同步通信模式下使用,用于输出同步时钟信号。

数据寄存单元

289968c0f89a8471f.png

1.TDR:发送数据寄存器

2.RDR:接收数据寄存器

3.在UART外设中只有一个寄存器UASRT_DR是一个双向寄存器,取决于CPU是读这个寄存器还是写这个寄存器,如果是读就是RDR,如果是写就是TDR

发送接收控制单元

5974068c0f8958fbe0.png

1.CR1/CR2/CR3:控制寄存器控制各种使能,比如UART使能,收发中断使能,DMA使能

2.SR:状态寄存器:用来表明UART的收发状态和错误状态等

3,GTPR:Smartcard和lrDA模式下专用的寄存器

波特率发生器

7340568c0f88f45ae3.png

1.fPCLK:外设总线时钟,USART1在APB2,最高可取72MHZ,剩下四个在APB1,最高可取36MHZ
2. USARTDIV:USART/UART时钟分频器
3.DIV_Mantissa:BBR寄存器的高12bit,用于存放波特率设置的整数部分
4.DIV_Fraction:BRR寄存器的低4bit.用于存放波特率设置值的小数部分,每一位对应的精度是1/2的四次方=0.0625
5.波特率计算公式:baudrate=fPCLK / USARTDIV * 16

UART框图配置步骤

·选择需要使用的USART/UART(根据地址映射表得到地址).

·根据需要的波特率设置BRR寄存器

·根据需求配置控制寄存器中的停止位和校验位.

·根据需求配置同步时钟使能位

·使能USART的发送和接收位

·根据需求使能发送和接收的中断位

·使能RCC中的选中的USART/UART的时钟

·使能USART/UART

·写USART_DR寄存器发送数据,读USART_DR寄存器接收数据

硬件:
1.蓝牙模块HC-05

3434468c0f887ea7dc.png

1.接线

      1.START  状态引出引脚(未连接时输出低电平,连接时输出高电平)

      2.RXE      接收端

      3.TXE      发送端

      4.GND     模块供电负极

      5.VCC      模块供电正极

      6.EN         使能端,需要进入命令模式时接3.3V

2.AT设置工作模式

       1.自动连接模式,又称透传模式

       2.AT模式

进入AT模式的两种方法:

1.按住引脚或EN引脚拉高(接入3.3V),此时灯是慢闪,进入AT模式,波特率默认是38400;这个模式我们叫做原始模式,原始模式下一直处于AT命令模式状态。
2.HC-05上电开机,红灯快闪,按住按键或EN引脚拉高(接入3.3V),HC-05进入AT命令模式,默认波特率是9600;这种模式下是正常模式,正常模式下只有按住按键或拉高EN引脚才处于AT命令状态。(注意:如果波特率没有设置正确,AT命令是执行无效的)

3.基本配置(所有AT命令都必须换行)


正常模式下是9600,AT模式波特率固定为38400,8位数据位,1位停止位,无奇偶校验的通信方式

发送 AT\r\n,回复 OK

发送AT+UART?\r\n,回复+UART9600,0,0

发送AT+UART=115200,0,0\r\n,回复OK
(通过上述步骤波特率即配置成功)

发送AT+NAME=" XXXX",修改蓝牙模块名称为XXXX

发送AT+ROLE=0,蓝牙模式即为从模式

发送AT+CMODE=1,蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接

发送AT+PSWD=1234,蓝牙配对密码为1234

发送AT+UART=9600,0,0,蓝牙通信串口波特率为9600,停止位1位,无校验位

配置完成,需要重启一次


4.AT命令的详细说明


AT+ROLE 设置主从模式:

AT+ROLE? 是查询主从状态;AT+ROLE=1是设成主,AT+ROLE=0是设成从,AT+ROLE=2设成回环角色(Slave-Loop([环角色)--被动连接,接收远程蓝牙主设备数据并将数据原样返回给远程蓝牙)。
AT+RESET: HC-05复位
AT+VERSION?: 获取HC-05的软件版本号,只能获取,不能修改。
AT+ORGL: 恢复出厂默认设置,当把模块设置乱了,使用此命令进行恢复默认值。

AT+ADDR?: 获取HC-05的蓝牙地址码,只能获取,不能修改。
AT+NAME? : 获取HC-05的名字,AT+NAME=BSP-06,修改模块的名字为BSP-06,具体名字自行修改。

AT+CLASS?: 设置查询设备的类型,尽量不要去修改此参数。默认是1F00.

AT+IAC?: 查询设置查询访问码,默认是9E8B33,尽量不要去修改此参数。
AT+PSWD?: 查询设置配对密码,AT+PSWD="0000",密码要有双引号,密码是四位数字.

AT+UART: AT+UART? 是查询当前模块的波特率,AT+UART=波特率是设置.
AT+CMODE:  AT+CMODE?是查询当前连接模式。AT+CMODE=0,1,2(0--指定蓝牙地址连接模式(指定蓝牙地址由绑定指令设置) -一任意蓝牙地址连接模式(不受绑定指令设置地址的约束)2一-回环角色(Slave-Loop)默认连接模式:0)。

AT+BIND: AT+BIND?查询当前绑定地址,AT+BIND=NAP,UAP,LAP(用逗号隔开)。AT+RMADD:从蓝牙配对列表中删除所有认证设备,.AT+STATE?:获取蓝牙模块工作状态,
AT+LINK=NAP,UAP,LAP:与远程设备建立连接。

AT+DISC:断开连接.
AT+RNAME?  NAP, UAP, LAP:获取远程蓝牙设备名称.

AT+ADCN?: 获取蓝牙配对列表中认证设备数。

AT+MRAD? 获取最近使用过的蓝牙认证设备地址。
AT+INQM: 设置查询模式,AT+INQM=1,9,48(1-带RSSI信号强度指示,9-超过9个蓝牙设备响应则终止查询,48-设定超时为48*1.28=61.44秒)

2.ESP8266-01S wifi模块

7372668c0f87b898f6.png

6142268c0f8761884a.png

ESP8266是实现wifi通讯的一个模块种类,有很多分类包含esp8266-12、esp8266-12E、ESP8266-01S、esp32等等。esp8266-01s由一颗esp8266作为主控再由一块flash作为存储芯片组成,带有板载芯片供电采用3.3V电压使用串口进行烧写程序和AT指令集调试,注意芯片一旦烧写了程序便不可使用AT指令集,需要重新刷回AT指令固件才可以使用AT指令集。
WiFi通信的频段和蓝牙一样,都是2.4G免费频段。我们使用ESP8266-01S模块,这款WiFi模块的芯片是乐鑫公司设计的,由安信可公司生产的模组。相当于ARM公司设计芯片,ST公司生产STM32单片机。ESP8266-01S是基于乐鑫ESP8266芯片制造的一款WiFi通信模组,其内部集成了802.11b/g/n协议栈和TCP/IP协议栈,具备完整的Wi-Fi和网络功能。但是多数人都喜欢拿它来做WiFi通信使用。

1.esp8266-01s的三种工作模式


1.1 STA模式(Station)
工作在STA模式下的ESP8266-01S模块就像你的手机一样,它可以接收你家无线路由器发出的WiFi信号,实现了ESP8266-01S模块通过接收路由器的信号而能够上网,跟手机连WiFi上网没区别,当然如果把ESP8266-01S模块按正确方式接在STM32单片机上,就可以实现STM32控制的比如灯、继电器、舵机等具有开关功能的远程控制。


1.2 AP模式(Wireless Access Point)
工作在AP模式下的ESP8266-01S模块就像是一个手机热点一样,也像你家的简易版无线路由器,你自己的手机、Pad、笔记本电脑等都可以连接到此“热点”,从而实现了手机、电脑等设备可以和ESP8266-01S模块进行局域网的无线通信。在AP模式下的ESP8266-01S模块是一个无线网络的创建者,可以理解为此时ESP8266-01S模块是被别的设备连接,即此时的ESP8266-01S模块是一个服务器端,为被他人连接的模式。


1.3 STA+AP模式
两种模式共存,ESP8266-01S模块既可以通过路由器连接到互联网,也可以作为WiFi热点使其他设备连接到这个ESP8266-01S模块,实现广域网与局域网的无缝切换。


2.引脚接线


1.GND    接地   
2.IO2   GPIO2/串口1_TXD   
3.IO0    GPIO0 下载模式:内部拉低,运行模式:外部拉高或悬空。   
4.RXD    USARTO_RXD/GPIO3   
5.TXD    USART0_TXD/GPIO1   
6.EN    芯片使能端、高电平有效   
7.RST    复位   
8.VCC    3.3V供电   
电源供电不足会导致固件程序烧录失败烧录固件的时候会出现一直在等待上电情况,建议采用外部专用电源,使用TTL转串口模块烧录时可以用万用表测试一下TTL转USB模块的3.3V供电是不是达到了稳定的3.3V,如果没有的话需要把ESP8266-01S的VCC接到5V上。该模块出厂时默认自带出厂固件的,但如果进行其他开发需要烧录固件,比如如果想用机智云结合ESP8266-01S开发就需要烧录机智云的固件(这个可以在机智云网站找到),如果想用ESP8266-01S把STM32的数据传到阿里云上,就需要烧录MQTT的固件,因为传数据到阿里云上需要用到MQTT协议。

3.烧录固件


烧录固件引脚接线


ESP8266-01S    TTL转USB模块   


GND                          GND   
1O0                           GND   
102                        悬空不接   
TXD                           RXD   
RXD                           TXD
EN                           3.3V/5V   
RST                         3.3V/5V   
VCC                         3.3V/5V   


测试固件烧录接线:


ESP8266-01S    TTL转USB模块   
VCCI                       3.3V   
GND                        GND   
TXD                         RXD   
RXD                        TXD

4.AT指令

.CR(carriage return):表示函车\r

· LF(Line Feed):表示换行\n
1.DOS和windows采用回车+换行(CR+LF)表示下一行
2.Unix/linux采用换行符(LF)表示下一行
3. MAC OS系统采用回车符(CR)表示下一行


5.小项目:蓝牙控制LED灯项目步骤

·蓝牙模块AT模式基础配置
     1.蓝牙连接ch340模块接线TX、RX、VCC、GND、EN五根引脚

     2.AT指令配置波特率、蓝牙名称、从模式、配对密码

·蓝牙硬件连接
    3.初始化蓝牙连接串口的时钟,引脚和外设配置

    4.串口接收中断服务函数实现数据的接收和发送

代码实现:

1.串口初始化

//串口2初始化
void  myusart2_init(void)
{
     GPIO_InitTypeDef GPIOInitStruct;
     USART_InitTypeDef USARTInitStruct;
         NVIC_InitTypeDef NVIC_Initstruct;
       
           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
            
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2下的GPIOA时钟
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能APB1下的串口2时钟

         //A2配置为TX
         GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
         GPIOInitStruct.GPIO_Pin = GPIO_Pin_2;
         GPIO_Init(GPIOA,&GPIOInitStruct);
                       
         //A3配置为RX
         GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
         GPIOInitStruct.GPIO_Pin = GPIO_Pin_3;
         GPIO_Init(GPIOA,&GPIOInitStruct);
       
       
         USARTInitStruct.USART_BaudRate = 9600;  //设置波特率
         USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //串口硬件控制流
         USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  //配置串口模式
     USARTInitStruct.USART_Parity = USART_Parity_No;  //奇偶校验位
         USARTInitStruct.USART_StopBits = USART_StopBits_1;  //停止位
         USARTInitStruct.USART_WordLength = USART_WordLength_8b;  //数据字节长度                  
         USART_Init(USART2,&USARTInitStruct);//初始化串口结构体                                    
         USART_Cmd(USART2,ENABLE);  //串口2使能                                                
     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  //串口2中断函数配置                           
                       
         NVIC_Initstruct.NVIC_IRQChannel = USART2_IRQn;        //配置中断通道
         NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 0;//定义抢占优先级
         NVIC_Initstruct.NVIC_IRQChannelSubPriority = 0;       //定义响应优先级
         NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;          //NVIC使能
         NVIC_Init(&NVIC_Initstruct);                          //初始化NVIC结构体
                       

}



2.编写串口中断函数

//串口2中断函数
void  USART2_IRQHandler()
{
         char str =0;//定义字符str
       
    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)//检测中断发生

      {
            str =  USART_ReceiveData(USART2);//串口2接收到的数据赋给str

                            
                        if(str == '0')
                        {
                       
                         GPIO_ResetBits(GPIOA,  GPIO_Pin_1);//PA1输出低电平,LED亮
                         
                        }
                                if(str == '1')
                        {
                       
                         GPIO_SetBits(GPIOA,  GPIO_Pin_1); //PA1输出高电平,LED灭
                       
                        }
                       
                         USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断
                                                                               
                }

}



实现结果:
此时手机连接蓝牙模块,手机发送‘0’则LED亮,发送‘1’则LED灭
————————————————
版权声明:本文为CSDN博主「今天阳光明媚吗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2502_90478897/article/details/146285717

您需要登录后才可以回帖 登录 | 注册

本版积分规则

136

主题

4344

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部