esp32上电后,操作系统跑起来后,最终会用到app main函数
板子启动流程:
第一阶段的bootloader加载第二阶段的bootloader,第一阶段的位于ROM中,无法知道其源码。第二阶段的位于0c1000的flash中。
第二阶段的bootloader加载分区表以及用户app,就是freetos。第二个cpu和操作系统的调度器就会执行。
第一阶段的bootloader加载第二阶段的bootloader后,通过判断后者的二进制头就可知第二阶段的bootloader。
中断处理函数必须放入IRAM中,通过加属性。
板子启动
地址映射
setup
1、cores文件夹就是默认使用编译的文件。
2、PEROCPU运行起来freetos之前,先运行了app main函数,此函数在main app里。
3、除了cores文件夹下和librarise下面的文件,其它文件都被放到.a库文件里,esp32\tools\sclk\lib文件夹下。
先调用setup,再调用loop函数,然后一直循环,因此如果不再setup函数里面创建任务的话,相当于跑一个用户程序。
PRO CPU操作系统的任务创建
使用esp32大部分的CPU外设资源都有例程。
arduino支持c++。
librarise文件夹下的库文件,如果不包含库头文件,无法使用里面的源文件。
5 idf怎么阅读编辑源码
6使用工具下载
下载
注意文件选择正确。
这个下载差不多是历时两晚。
错误1:
can’t open file ‘./RESOURCE/IDLE_S.bmp’ (error 0: 操作成功完成。)
把整个安装包换一个路径就好了
错误2:
板子的确插上去了,但是显示的仍然是等待上电同步,应该是板子的问题。
点stop,重新插拔一下,按住boot不放 再点start,有反应之后,再松开boot。尝试了两次,果然连上了。
错误3:
找不见对应的文件,通过果云的群才找到。
wifi的AT指令使用
1、波特率默认是115200。
2、USB和TTL,共地,GPIO16是RX接USB转TTL的TX。
AT指令使用(教程)
实践失败
版本过低问题,无AT指令库。又下载5.13版本。
以上是因为没有按boot键。
按Boot键重新下载。
wifi用处
发数据,当作客户端使用(大部分),因为大部分情况esp32无法进入公网,有些网络也可以进入公网;
当作服务器端来使用,必须让esp32进入公网,一般通过端口映射进入。
连接网络后,就是通过网络交互数据。
使用AT固件,esp32无法控制外设,只能当作数据中转站使用。
看AT指令集(wifi)
网络调试助手,串口网络数据调试器。
建立station连接局域网路由器。
向局域网收发数据。
连接公网IP进行收发数据。
程序开发时要先用串口助手把各种情况模拟清楚,对AT返回值进行不同处理,保证产品稳定性。
连接上wifi:
连接局域网
蓝牙指令使用
7 源码阅读与阅读查询技巧
1.使用阅读软件source insight。
关闭杀毒软件后才下载了一个破解版的。
2.添加源文件。
3.添加头文件,按照视频教程已添加一部分头文件,但是还有很多库被编译成了.a文件,所以要添加头文件(tools sdk include)。
4.同步,解析符号链接。
5.例程查找定义技巧。
6.c++中的类相当于c语言中的结构体。
冒号表示继承。
::表示域,类的成员函数的实现。
public 被他修饰的成员变量或者成员函数可以直接被实例直接调用。
private 被其修饰的只能在类内部使用,且不能被继承。
protect类和继承者才能被使用。
Source Insight可以快速的对源程序结构以及源程序中出现的变量、函数进行分析,并且用不同的图标来表示,如用:
表示宏定义,如头文件、条件编译命令等。
表示变量
表示函数
同时,源程序的文本用不同的颜色来显示,表示代码的不同意义。其中默认注释为蓝色显示,变量和函数用深蓝色显示,头文件用黄色表示等。这些显示规则我们可以通过设置菜单来改变,不过建议大家不要修改这些属性,这样便于大家的源程序互相阅读。
文件以.c或.cpp结尾.
Source Insight使用教程https://blog.csdn.net/guotao1983/article/details/81866594
编程移植技巧
wifi编程
现在相关例程里做移植测试。
没有相关功能,找到与例程相关的源文件。
8触摸传感器例程分析
因为没有按键呀。按下电容值大,输出脉冲少,电压速率变化慢。
由软件或专用硬件计时
触摸管脚是否受到触碰:
1.由软件直接检查触摸传感器的寄存器
2.由触摸监测模块发起的中断信号判断
3.由触摸监测模块上的CPU视口从Deep-sleep中唤醒判断
extern void pinMode(uint8_t pin,uint8_t mode)_ _attibute((weak,allas("__pinMode")));
weak 弱函数,如果在其它地方重新定义此函数,这里的定义将不起作用
Alias是后面的函数的别名的意思,
运行touchread
可添加中断
WIFI使用方式简介
STATION模式,类似客户端,最常用,开发用此模式,连接路由器,查看自己的IP和MAC之类的功能。通过路由器连入公网,然后与公网的服务器进行互动。
STA模式,不常用,设置名字和密码,分配IP地址等功能。大部分只能在局域网使用,模块相当于一个路由器,因为模块没有公网IP,只能局域网使用。
编程要点
1.如何开启此模式
2.怎么扫描AP,如何接入AP
WiFi.begin(STA_SSID, STA_PASS);接入路由器的用户名和密码
scanNetworks()函数扫描,返回扫描到网络的个数
getNetworkinfo()函数获取每个扫描到的网络的信息
3.AP模式如何打开,设置AP的SSID和密码
WiFi.mode(WIFI_AP);设置AP的模式
WiFi.softAP(AP_SSID);可传用户名密码
4.模块怎么创建服务sever和client,怎么交互数据
WiFiServer server(80);定义一个server实例
Serial.begin(115200);开启server
WiFiClient client = server.available();是否有客户端连接
if (client.available())判断客户端是否有上发数据
char c = client.read(); 读取客户端发来的数据
client.stop();关闭连接
WiFiClient client;创建一个客户
client.connect(host, httpPort)连接服务
client.print()发送数据到服务器
client.available()查询是否有数据可读
client.readStringUntil(’\r’);读字符串直到’\r’,用别的函数也可以读字符串
client.stop();关闭连接
5.事件,什么时候扫描完成,连接,断开连接等事件,怎么知道此事件发生。
WiFi.onEvent();函数可知事件发生
6.其它高级用法,进行HTTP请求等
编程
WIFI切换例程,直观感受此例程如何开启AP和STATION,以及事件处理方法。
WiFi当作客户端,连入一个sever等待客户端连入,或者创建一个client连接公网的IP(就是socket编程),然后和这个服务进行数据交换。
WIFi当作AP,此时不能连入路由器,连入路由器的都是STATION模式。
10模式切换及事件处理
可用touchResd代替digitalRead
延时消抖
11WIFI当作STATION接入路由器
实践