ESP32学习笔记

ESP32的入门使用

软件

要想用电脑控制esp32的软件是Arduino IED,图如下

然后软件中下载好相应的资料,如esp32库

或者另一种工具也可以控制下载

ESP32的启动流程

常识:

(1)esp32启动后跑的是一个freetos的一个操作系统

(2)Arduino会自带很多参考例子,在自己开发的时候,参考例子会有让自己有一个很好的开发思路

ESP32的启动原理:

在操作系统跑起来后,最终会调用到app.main函数。

ESP32的Bootloader(引导加载程序)主要执行以下任务:

  1. 内部模块的基础初始化配置
  2. 根据分区表ota_data(如果存在)选择需要引导的应用程序(app)分区
  3. 将应用程序映像加载到 RAM(IRAM和DRAM)中
  4. 完成以上工作后把控制权转交给应用程序

第一阶段的bootloader加载第二阶段bootloader,第一阶段位于ROM里面,这样我们就没法知道他的源码了,第二阶段的位于0x1000这个flash的地方。

第二阶段的bootloader加载分区表以及用户app,其实就是freertos了,

然后第二个CPU和操作系统的调度器就会运行。

第一阶段的bootloader加载完第二阶段的bootloader之后,通过判断第二阶段bootloader的二进制头就能知道该去哪里指向第二阶段的bootloader。

第二阶段的bootloader去0x8000这个地方加载分区表。分区表里面应该有用户APP的地址。

ISR handlers中断处理函数必须放到IRAM里面,通过加IRAM_ATTR属性就能把代码或者变量放到IRAM里面。

板子启动流程

(1)地址映射


(a)Oxe000 这个地方下载了一些东西。->boot_app0.bin-
(b)Ox1000 这个地方又下载了东西。--bootloader.bine
(c)Ox10000这个地方又下载了东西。-放的是应用程序也就是freertos
(d)0x8000 这个下载了东西。---default.bin 应该就是 default.csv 生成的
 

对于这个下载工具,我们只需要将对应的地址和含有程序的文件填进去,也可以运行

 ESP32基本的函数

常识

(a)cores文件夹就是工程里面默认使用被编译的文件。、
(b)PRO.CPU运行起来freertos之前先运行了app_main函数,此函数在main.cpp文件里面。
(c)除了cores文件夹下面以及librarise.下面的文件,其他的文件都被放到.a库文件里面。esp32\tools\sdk\lib 文件夹下。”
void-loopTask(void*pxParameters)第1个任务里面先调用setup()函数,然后再调用loop()函数,然后一直死循环。而且main函数里面就有setup()函数和loop()函数。setup()函数和loop()函数分别在死循环外和死循环内
因此如果不再setup()里面创建任务的话,相当于只跑一个用户任务。但是如果在loop()函数里面创建任务,就相当于在死循环里面不断创建任务,然后导致CPU承受不了,从而崩溃。

ESP32串口

常识:
(a)arduino.支持c++,而且支持的非常好,所以就可以使用c++进行编程。
(b)libraries 文件夹下面的库文件,如果不包含库的头文件,是没法使用里面的源文件。”
其实Serial就是一个实例。他位于HardwareSerial.cpp文件里面,HardwareSerial类的构造函数传入一个参数就是串口号。
class HardwareSerial: public Stream继承这个类,class-Stream:public Print继承这个类,这个类里面有很多函数,最终是在classHardwareSerial类的 HAL层实现。

ESP32的蓝牙与WiFi

(1)AT固件的使用(固件源码没开源)。
(a)固件下载。
使用工具下载,如下图所示,。

注意:使用这个分区partitions_at_ok.bin,否则就无法正常运行AT固件。
(b)接线方法。
USB端口是下载和调试信息的端口,我们需要另外的一个USB转TTL来连接模块的AT指令端口。

注意:共地,GPIO16是RX接USB转TTL的TX:GPIO17是TX接USB转TTL的RX。

WIFI

(c)wifi的AT指令使用

波特率默认也是115200.

wifi 的作用:

就是通过wifi 发数据,第一种是当做客户端来使用(大部分情况),因为大部分情况ESP32没法进入公网,但是有些网络也可以通过端口映射让ESP32进入公网,第二种情况当做服务器端来使用(必须让ESP32进入公网中,一般通过端口映射进入)。
连接网络之后,就是通过网络交互数据。
其实使用AT固件的话,ESP32没法控制外设,只能当做数据中转站使用。

注意:程序开发时候,要显示串口助手把各种qing'kuang模拟清楚,对AT返回值进行不同的处理,来保证产品的稳定性,

(d)wifi编程。

注意:编程使用的默认规则,先在相关的例程,然后移植测试,如果好用,万事大吉;如果不好用再进行深入分析;如果例程中没有相关的功能,那么找到与例程相关的源文件,在源文件里面找函数来使用。
(d1)触摸传感器使用。。
extern void pinMode(uint8_t pin,uint8_tmode)__attribute__((weak,alias("__pinMode")));

weak的意思弱函数,如果其他地方重新定义此函数,这里定义的将不起作用。

Alias后面的内容是函数别名的意思。

(d2)wifi 使用方式简介。
STATION模式,最常用,我们开发应该就是使用此方式。连接路由器,查看自己的IP和MAC之类的功能。通过路由器连入公网,然后与公网的服务器进行互动。
AP 模式,不常用。设置名字和密码,分配 IP地址等功能。大部分情况只能在局域网使用,相当于模块是 个路由器,因为模块没有公网 IP,所以只能局域网玩耍。

编程要点:
(i)怎么开启这种模式?


(ii) STATION模式怎么扫描AP,怎么接入AP?
WiFi.begin(STA_SSID,STA_PASS);接入路由器的用户名和密码。
WiFi.scanNetworks()函数扫描,返回扫描到网络的个数。
WiFi.getNetworkInfo()函数获取每个扫描到的网络的信息。


(iii) AP模式怎么打开,怎么设置AP的SSID 和密码?
WiFi.mode(WIFI_AP);设置AP模式。WiFi.softAP()可以传入用户名和密码。

(IV)模块怎么创建服务server?怎么创建client?怎么交互数据?。
WiFiServer-server(80);定义一个server实例。
server.begin();开启 server。"
WiFiClient client = server.available(); 是否有客户端连接。
client.available()判断客户端是否上发数据。。
charc=-client.read();读取客户端发过来的数据。
client.stop();关闭连接。


WiFiClient client;创建一个客户。。
client.connect(host, httpPort)连接服务。

client.print()发数据到服务器。
client.available()查询是否有数据可读。
client.readStringUntil("r");读字符串直到\r’,用别的函数也可以。client.stop();

关闭连接。

(V)事件,什么时候知道扫描AP完成了?事件,扫描、连接、断开连接等事件。怎么知道这些事件的发生?。
WiFi.onEvent()函数就可以知道事件发生。

蓝牙

蓝牙通信的概念:
参考这个网址:
https://blog.csdn.net/u013378580/article/details/52891462
理解了概念,你才会明白怎么使用。
广播:向外定时发送一些信息,让其他设备发现自己。
扫描回复:向外发送请求,让外围设备回复自己,让自己知道外面有什么设备。
连接:首先就需要连接。
两个设备连接之前必须进行连接,这个是使用GAP协议。
理解这个图即可理解 GATT协议,

有一些标准的profile定义一个特殊的用途的profile,最终还是要有sevice、characteristic组成。


每个profile 可以包括很多service,每个 service 可以包含很多个characteristic,characteristic才是最终通信的目标。
每个characteristic都有属性,比如读、写这些属性。


这么多 service和characteristic,怎么识别是哪一个?
就是通过一个唯一标号UUID来标记和识别。


都是要扫描设备支持的服务和characteristic。
Characteristic 就是特征的意思。


收发数据是最终目的。
 

 server相关的理论知识:
server里面包含至少一个service,service包含至少一个特征characteristic,characteristic必定有值,这个值就是与client交流对象,还可以有decriptor描述符,描述符就是描述这个characteristic的,描述符有读写属性,描述符也可以被读写,有个比较特殊的描述符0x2902,这个描述符决定了client 是否订阅通知。
通知notify也是一个Characteristic。

Server的使用
打开notify这个例程。
(a)初始化生成一个BLE device。
BLEDevice:init("MyESP32"); 工
(b)创建一个server。
pServer =BLEDevice::createServer()

(c)设置server的连接和断开回调函数。
pServer->setCallbacks(new MyServerCallbacks());--->这样就可以知道什么时候设备连接上了,什么时候又断开了。
(d)创建service。
BLEService *pService- pServer->createService(SERVICE_UUID);
(e)service 创建characteristic。---->此例程的characteristic是用来通知的。
pCharacteristic = pService->createCharacteristic
(f) characteristic 创建描述符。---->不是必须的
写0不订阅,写1订阅。
pCharacteristic->addDescriptor(new BLE2902());

分析了一下descriptor的管理。
(f)开始服务。
pService->start();
(g)开始广播。-→作用就是可以被client 发现,从而能够连接 server,获取 service 中characteristic的值。
(h)设置characteristic的值。
pCharacteristic->setValue(&value, 1);
(i)把characteristic的值广播出去。只有广播,client才能发现sever。
pCharacteristic->notify(); ---->如果client订阅了通知,将会收到这个值。
怎么知道通知的值是什么?
通过分析notify函数和setValue函数就可以知道了。
因为通知这个其实也是通过characteristic实现,也是一个characteristic。

蓝牙通信的目的是什么?怎么开始通信?怎么进行通信?
目的当然数据交换。
通信首先必须握手,这个握手就是连接,怎么知道连接谁?怎么知道现在有谁(有哪些设备)?
流程:
Server进行不停的广播,也就是发广播包,client进行不断的扫描,然后把扫描的广播包进行分析,然后进行连接请求,然后server同意建立连接,最终连接上来。


什么是广播包?广播格式是什么?怎么区分不同的广播包(server广播的包,连接请求的包扫描回复的包)?
区分这些包都是蓝牙规定的!!也就是协议!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨星辰487

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值