IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 乐鑫ESP32-C3项目(9)- 上电启动流程的简要分析 -> 正文阅读

[嵌入式]乐鑫ESP32-C3项目(9)- 上电启动流程的简要分析

参考资料:

技术规格书

技术参考书

调试openocd手册

应用程序的启动流程 - ESP32-C3 - — ESP-IDF 编程指南 latest 文档

一,芯片复位运行的流程

1,上电复位执行一级引导程序(固化在芯片ROM,无法修改)

2,一级引导程序工作:

根据芯片boot启动模式判断是否SPI,或下载启动模式

???如果是spi启动模式,则从flash 0x0处加载二级引导程序到IRAM中运行。

???如果是下载启动模式,则等待UART0/USB(jtag)接口

??

Boot启动模式

获取bootstrap 3个引脚的状态(寄存器GPIO_STRAP_REG?0x0038?):

GPIO2?GPIO8?GPIO9(弱上拉)

?1 ? ? ? ? ?x?????????????????1?????????????????????????????????SPI启动?(加载flash中的程序)

?1 ? ? ? ? ?1?????????????????0?????????????????????????????????下载启动 模式(UART0?或?USB )

?

Note:?启动时,一般是将程序加载到IRAM运行;但是?寄存器(地址:0x42000000)= 0xaebd041d时,直接在flash运行.

eFuse存储器控制一级引导程序启动打印:

eFuse?的?EFUSE_UART_PRINT_CONTROL?

=0?默认,打印

=1 GPIO8=0?上电打印?GPIO8=1?上电不打印

=2 GPIO8=1?上电打印?GPIO8=0?上电不打印

=3?不打印

3,二级引导程序: 从flash加载分区表信息,加载主程序(app_main)到RAM,并处理主程序所有数据和代码段,flash高速映射只读段(从flash运行时)。

二级引导程序路径:(build/bootloader/bootloader.bin)

二,分析启动流程相关信息

0,分析前准备工作

0.1?硬件连接

1,开发板?USB-jtag?接电脑?USB

2,开发板UART0?接?USB-TTL,?再接?电脑USB?(UART0是ESP32C2调试信息默认输出接口。

0.2?打开三个终端:helloworld项目终端,openOCD终端,telnet终端。

开始分析:

获取固件信息(二级引导程序、主程序、分区表)和UART0打印的调试信息

hellowordl终端run

get_idf (一键导入编译工具环境)

idf.py build

idf.py flash?

build过程得到的信息(截取)

hello_world.bin(项目主程序)?binary?size 0x24a10?bytes. Smallest app partition is 0x100000 bytes. 0xdb5f0 bytes (86%) free.

espressif/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 espressif/hello_world/build/bootloader/bootloader.bin(二级引导程序)

Bootloader binary?size 0x4eb0?bytes. 0x3150 bytes (39%) free.

Project build complete. To flash, run this command:

esptool/esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32c3 ?write_flash --flash_mode dio --flash_size detect --flash_freq 80m?0x0?build/bootloader/bootloader.bin?0x8000?build/partition_table/partition-table.bin?0x10000?build/hello_world.bin

or run 'idf.py -p (PORT) flash'

项目生产的三部分信息在flash中的分布:

1,二级引导程序的flash烧录地址是:0x0??size 0x4eb0 bytes

2,分区表flash烧录地址是: 0x8000

3,主程序的flash烧录地址是0x10000?size 0x24a10 bytes.

执行?idf.py partition-table?得到分区别信息

Partition table binary generated. Contents:

*******************************************************************************

# ESP-IDF Partition Table

# Name, Type, SubType, Offset, Size, Flags

nvs,data,nvs,0x9000,24K,

phy_init,data,phy,0xf000,4K,

factory,app,factory,0x10000,1M,

*******************************************************************************

分区表的配置:在项目根目录的文件sdkconfig文件中?Partition Table部分内容。该文件是idf框架的配置文件,可以通过idf.py menuconfig查看和修改。当前使用的是预配置的?“Single factory app, no OTA”?配置。打开sdkconfig可以看到分区表的offset配置为0x8000.?

CONFIG_PARTITION_TABLE_OFFSET=0x8000

有三个分区表:其中子名称为factory?,类型Type为app的分区?会被二级引导程序识别并加载到IRAM中。其他两个分区表(nvs,phy_init)存放一些数据。

关于分区表的详细描述:

分区表 - ESP32-C3 - — ESP-IDF 编程指南 latest 文档

Helloworld?终端运行:

idf.py monitor

监听UART0的信息。(必要时指定串口?-p port)

OPENOCD终端运行run

get_idf

openocd -f board/esp32c3-builtin.cfg

返回信息:

Open On-Chip Debugger? v0.10.0-esp32-20211111 (2021-11-10-21:44)

Licensed under GNU GPL v2

For bug reports, read

http://openocd.org/doc/doxygen/bugs.html

Info : only one transport option; autoselect 'jtag'

Warn : Transport "jtag" was already selected

Info : Listening on port 6666 for tcl connections

Info : Listening on port 4444 for telnet connections

Info : esp_usb_jtag: Device found. Base speed 40000KHz, div range 1 to 255

Info : clock speed 40000 kHz

Info : JTAG tap: esp32c3.cpu tap/device found: 0x00005c25 (mfg: 0x612 (Espressif Systems), part: 0x0005, ver: 0x0)

Info : datacount=2 progbufsize=16

Info : Examined RISC-V core; found 1 harts

Info :? hart 0: XLEN=32, misa=0x40101104

Info : Listening on port 3333 for gdb connections

此时OPENOCD就等待调试程序的连接。

我们先用telnet做简单调试和控制

telnet终端运行run:

telnet localhost 4444

Halt

Reset

Halt

通过openocd?使芯片从新复位运行,和暂停。

在监听UART0的终端就可以看到输出的调试信息:

芯片一级固化程序打印信息:

ESP-ROM:esp32c3-api1-20210207

Build:Feb ?7 2021

rst:0x3 (RTC_SW_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT)

Saved PC:0x20000348

SPIWP:0xee

mode:DIO, clock div:1

load:0x3fcd6100,len:0x17ac?数据段)

load:0x403ce000,len:0x930??(代码段)

load:0x403d0000,len:0x2d78

entry 0x403ce000(入口地址?call_start_cpu0 )

一级引导程序加载二级引导程序的数据段和代码段。把二级引导程序代码(bootloader)加载到了地址:0x403ce000(这是内部SRAM1的指令空间),数据段加载到0x3fcd6100(内部SRAM1数据空间)

二级程序入口地址?0x403ce000= call_start_cpu0?代码:bootloader_start.c)

参考二级引导程序的代码:

components/bootloader/subproject/main/ld/esp32c3/bootloader.ld

components/bootloader/subproject/main/bootloader_start.c

内部SRAM1可以存放指令和数据,同序访问:

指令空间384KB可读写:0x4038_0000~0x403D_FFFF,

数据空间384KB可读写:0x3FC8_0000 ~ 0x3FCD_FFFF.

二级引导程序打印信息:

I (44) boot: ESP-IDF v5.0-dev-346-g7af719e426-dirty 2nd stage bootloader

I (44) boot: compile time 10:14:41

I (44) boot: chip revision: 3

I (48) boot.esp32c3: SPI Speed ?????: 80MHz

I (53) boot.esp32c3: SPI Mode ??????: DIO

I (57) boot.esp32c3: SPI Flash Size : 2MB

I (62) boot: Enabling RNG early entropy source...

I (68) boot: Partition Table:

I (71) boot: ## Label ???????????Usage ?????????Type ST Offset ??Length

I (78) boot: ?0 nvs ?????????????WiFi data ???????01 02 00009000 00006000

I (86) boot: ?1 phy_init ????????RF data ?????????01 01 0000f000 00001000

I (93) boot: ?2 factory ?????????factory app ?????00 00 00010000 00100000

I (101) boot: End of partition table

I (105) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=06e60h ( 28256) map

I (118) esp_image: segment 1: paddr=00016e88 vaddr=3fc8a000 size=0144ch ( ?5196) load

I (123) esp_image: segment 2: paddr=000182dc vaddr=40380000 size=07d3ch ( 32060) load

I (136) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=127e0h ( 75744) map

I (151) esp_image: segment 4: paddr=00032808 vaddr=40387d3c size=021c8h ( ?8648) load

I (153) esp_image: segment 5: paddr=000349d8 vaddr=50000000 size=00010h ( ???16) load

I (160) boot: Loaded app from partition at offset 0x10000

I (163) boot: Disabling RNG early entropy source...

I (379) cpu_start: Pro cpu up.

I (388) cpu_start: Pro cpu start user code

I (388) cpu_start: cpu freq: 160000000

I (388) cpu_start: Application information:

I (391) cpu_start: Project name: ????hello_world

I (396) cpu_start: App version: ?????1

I (400) cpu_start: Compile time: ????Nov 20 2021 10:14:28

I (406) cpu_start: ELF file SHA256: ?d04f3ff4f7c5b8a8...

I (412) cpu_start: ESP-IDF: ?????????v5.0-dev-346-g7af719e426-dirty

I (419) heap_init: Initializing. RAM available for dynamic allocation:

I (427) heap_init: At 3FC8C2B0 len 00033D50 (207 KiB): DRAM

I (433) heap_init: At 3FCC0000 len 0001F060 (124 KiB): STACK/DRAM

I (440) heap_init: At 50000010 len 00001FF0 (7 KiB): RTCRAM

I (446) spi_flash: detected chip: generic

I (451) spi_flash: flash io: dio

W (454) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.

I (468) sleep: Configure to isolate all GPIO pins in sleep state

I (474) sleep: Enable automatic switching of GPIO sleep configuration

I (482) cpu_start: Starting scheduler.

主程序打印信息:

Hello world!=======world

This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision 3, 2MB external flash

Minimum free heap size: 329596 bytes

Restarting in 10 seconds...

Restarting in 9 seconds...

Restarting in 8 seconds...??(此处被telnet?halt暂停)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:27:35  更:2021-11-28 11:29:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:51:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码