【ESP32-Korvo测评】(2)初识ESP32
[复制链接]
本帖最后由 cruelfox 于 2021-1-31 11:06 编辑
ESP32这颗芯片,和最为普遍的ARM系MCU之间的差别,还是相当大的。首先是因为处理器核心不同,ESP32用的是Tensilica Xtensa系列处理器(也就是和ESP8266属于近亲),所以基本的开发工具链(汇编、C/C++编译器、调试器等)都是和ARM完全独立的另一套。其次,片上资源、地址空间排布都和ARM Cortex-m那些MCU差异很大,比如STM32开发的应用移植到GD32上面不难,但挪到ESP32就得把底层一套框架都要换了。然后,ESP32是没有内部flash的,只能从内部ROM bootloader程序启动,由bootloader从片外的SPI flash加载程序到SRAM运行(也可能用地址映射方式从外部flash直接运行程序);烧写程序是烧写到片外的flash, 常规办法是上位机和bootloader通过UART交互,间接对flash写入。此外,开发环境也是很不同的风格,除了Xtensa工具链还需要乐鑫的一系列工具(强烈依赖Python)来辅助。
因为ESP32片上SRAM还不算少,又有外扩的(WROVER模块里面)8MB PSRAM可用来存储数据,这块开发板做复杂算法的潜力是具备的。
收到的ESP32-Korvo开发板已经带有演示程序了,不过若仅给板子通电就看不到运行的效果。原因在于USB串口没有启用时其RTS/DTR信号使ESP32的GPIO0和GPIO2拉低(参看我上个帖子对电路的分析),使ESP32 bootloader进入下载模式,没有加载SPI flash中的程序。
当USB串口驱动装上并打开串口之后,ESP32就正常启动了。可以从终端程序看到bootloader输出的日志信息,以及演示程序输出的信息。
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:7128
load:0x40078000,len:11824
ho 0 tail 12 room 4
load:0x40080400,len:7344
entry 0x40080798
I (64) boot: Chip Revision: 3
I (71) boot_comm: chip revision: 3, min. bootloader chip revision: 0
I (42) boot: ESP-IDF v3.2.3-201-gfda11a6-dirty 2nd stage bootloader
I (42) boot: compile time 14:40:42
I (42) boot: Enabling RNG early entropy source...
I (48) qio_mode: Enabling default flash chip QIO
I (53) boot: SPI Speed : 80MHz
I (57) boot: SPI Mode : QIO
I (61) boot: SPI Flash Size : 16MB
I (66) boot: Partition Table:
I (69) boot: ## Label Usage Type ST Offset Length
I (76) boot: 0 factory factory app 00 00 00010000 003c0000
I (84) boot: 1 nvs WiFi data 01 02 003d0000 00004000
I (91) boot: End of partition table
I (96) boot_comm: chip revision: 3, min. application chip revision: 0
I (103) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x16fbd4 (1506260) map
I (510) esp_image: segment 1: paddr=0x0017fbfc vaddr=0x3ffb0000 size=0x00414 ( 1044) load
I (511) esp_image: segment 2: paddr=0x00180018 vaddr=0x400d0018 size=0xc7034 (815156) map
I (733) esp_image: segment 3: paddr=0x00247054 vaddr=0x3ffb0414 size=0x032bc ( 12988) load
I (737) esp_image: segment 4: paddr=0x0024a318 vaddr=0x40080000 size=0x00400 ( 1024) load
I (740) esp_image: segment 5: paddr=0x0024a720 vaddr=0x40080400 size=0x1959c (103836) load
I (797) boot: Loaded app from partition at offset 0x10000
I (797) boot: Disabling RNG early entropy source...
WYB:Slave mode:80 !
WYB:ES7210_MCLK_CTL_REG02 = 0xC3!
************** enter es8311 init **************
Quantized wakeNet5: wakeNet5_v1_hilexin_5_0.95_0.90, mode:0 (Nov 20 2019 14:34:43)
Quantized MN1_2 (Dec 5 2019 20:22:00)
SHIFT: 8, 11, 17, 18, 18, 17, 7, 16, 15, 13,
I (287) MN: ---------------------SPEECH COMMANDS---------------------
I (297) MN: Command ID0, phrase 0: guan bi dian deng
I (297) MN: Command ID1, phrase 1: da kai bai deng
I (307) MN: Command ID2, phrase 2: da kai hong deng
I (307) MN: Command ID3, phrase 3: da kai lv deng
I (317) MN: Command ID4, phrase 4: da kai lan deng
I (317) MN: Command ID5, phrase 5: da kai huang deng
I (327) MN: Command ID6, phrase 6: da kai cheng deng
I (327) MN: Command ID7, phrase 7: da kai zi deng
I (337) MN: ---------------------------------------------------------
ESP32-Korvo V1.1 Firmware V0.1
这时候可以喊“Hi, 乐鑫”唤醒命令词激活(我以前一直以为读作yuexin, 现在才知读作lexin),若成功,则可以看到一圈LED作流水灯状点亮。唤醒后程序会继续等待“打开红灯”之类的语音命令,若识别到语音命令,LED状态作出相应的变化。
从bootloader给的启动信息看到,演示程序加载的镜像分为了6段. 这跟我熟悉的STM32完全不同:STM32编译后的ELF文件提取出代码段连续写到片内flash就完事了。从这里推测,ESP32的程序下载并不是把编译的ELF提取二进制代码写入片外flash这么简单。它的程序怎么启动待我找具体的工程来编译后再分析。
在打开USB串口的状态下,若按着开发板上的Boot按钮再按Reset按钮,也会使板子复位进入下载模式。从串口终端能看到信息,但是要怎么操作就需要乐鑫的工具了。
rst:0x1 (POWERON_RESET),boot:0x23 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
除了使用Python脚本编写的工具,只是下载的话可以用"Flash download tool"程序来做。
不过,我把ESP-skainet SDK里面的default_firmware用这工具先擦除,再下载bin文件,板子就不能启动了,提示“invalid header: 0xffffffff
”错误,反复重启。估计是要写的地址没有填……
|