以esp32-s2开发需要了解的地方(esp32-s2为例)

1.系统f复位阶段需要关注的GPIO

ESP32-S2 系列芯片共有 3 个 Strapping 管脚(GPIO0,GPIO45,GPIO46),这几个IO口默认都是内部上拉/下拉的,在芯片的系统复位(上电复位、RTC 看门狗复位、欠压复位、模拟超级看门狗 (analog super watchdog) 复位、晶
振时钟毛刺检测复位)过程中,这3个GPIO的状态会被写入锁存器中,直到MCU关机。

在这里插入图片描述

  • GPIO45:用来选择外部flash的供电电源,此外如果flash是1.8V的话,那么其它信号线也要做一下电平转换。
    在这里插入图片描述
  • GPIO0:用串口下载时,需要提前将此IO短接到GND,然后在上电,即可进入下载模式。
  • GPIO46:用来关闭日志的操作,关闭日志打印,可以节约部分功耗。此外datasheet中说可以由 eFuse 位控制切换到 DAC_1 管脚(这个后面在研究)

2.片上存储

ESP32-S2 系列芯片片上存储包括:

  • 128 KB ROM:用于程序启动和内核功能调用,(乐鑫把常用的函数封装到ROM中,这里也有BL0,第一阶段boot
  • 320 KB 片上 SRAM:用于数据和指令存储
  • RTC 快速存储器:为 8 KB SRAM,可被主 CPU 访问,在 Deep-sleep 模式下可以保存数据
  • RTC 慢速存储器:为 8 KB SRAM,可被主 CPU 或协处理器访问,在 Deep-sleep 模式下可以保存数据
  • 4 Kbit eFuse:其中 1792 位保留给用户使用,例如用于存储密钥和设备 ID

3.地址映射

更详细的可以查看官方文档
下图中的灰色部分为ROM预留的内存,不是开发给客户的。灰色地址不可用
在这里插入图片描述

同时从esp-idf中发现,这些常用的c库函数都 已经赋予了指针,所以大胆猜测,这些函数已经集成进ROM中了
.....
memccpy = 0x4001ab00;
memchr = 0x4001ab24;
memcmp = 0x4001ab40;
memcpy = 0x4001aba8;
memmove = 0x4001acb0;
memrchr = 0x4001acec;
memset = 0x4001ad3c;

在esp32s2.rom.ld中能够看到,gpio相关的操作函数也都封装了进去,看来乐鑫隐藏了一些寄存器的额细节。让用户更多的关心应用程序的编写。

PROVIDE ( gpio_input_get = 0x400193a0 );
PROVIDE ( gpio_input_get_high = 0x400193b4 );
PROVIDE ( gpio_matrix_in = 0x40019430 );
PROVIDE ( gpio_matrix_out = 0x40019460 );
PROVIDE ( gpio_output_disable = 0x400194dc );
PROVIDE ( gpio_output_enable = 0x400194b0 );
PROVIDE ( gpio_output_set = 0x4001933c );
PROVIDE ( gpio_output_set_high = 0x40019374 );
PROVIDE ( gpio_pad_hold = 0x40019654 );
PROVIDE ( gpio_pad_input_disable = 0x400195f0 );
PROVIDE ( gpio_pad_input_enable = 0x400195cc );
PROVIDE ( gpio_pad_pulldown = 0x40019598 );
PROVIDE ( gpio_pad_pullup = 0x40019564 );
PROVIDE ( gpio_pad_select_gpio = 0x40019510 );
PROVIDE ( gpio_pad_set_drv = 0x40019538 );
PROVIDE ( gpio_pad_unhold = 0x4001961c );
PROVIDE ( gpio_pin_wakeup_disable = 0x40019404 );
PROVIDE ( gpio_pin_wakeup_enable = 0x400193c8 );

4.时钟配置

参考官方文档
在这里插入图片描述

5.入口函数

esp32内部rom已经集成了第一阶段代码,第二阶段的bootloader的入口函数为下面的call_start_cpu0();

MEMORY
{
  /* IRAM POOL1, used for APP CPU cache. Bootloader runs from here during the final stage of loading the app because APP CPU is still held in reset, the main app enables APP CPU cache */
  iram_loader_seg (RWX) :           org = 0x40078000, len = 0x8000  /* 32KB, APP CPU cache */
  /* 63kB, IRAM. We skip the first 1k to prevent the entry point being
     placed into the same range as exception vectors in the app.
     This leads to idf_monitor decoding ROM bootloader "entry 0x40080xxx"
     message as one of the exception vectors, which looks scary to users.
  */
  iram_seg (RWX) :                  org = 0x40080400, len = 0xfc00
  /* 64k at the end of DRAM, after ROM bootloader stack */
  dram_seg (RW) :                  	org = 0x3FFF0000, len = 0x10000
}

/*  Default entry point:  */
ENTRY(call_start_cpu0);

6,分区表

分区表如下所示,很清晰,不多说,可以看到分区表在0x8000偏移位置。在这里插入图片描述
烧写命令(可以对比上面的分区表查看)
我编译的helloworld.bin文件就烧写到了0x10000 偏移地址,这个地址对应Factory app.

D:\espressif\python_env\idf4.2_py3.9_env\Scripts\python.exe ..\..\esp-idf-v4.2.1\components\esptool_py\esptool\esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32  write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 build\bootloader\bootloader.bin 0x8000 build\partition_table\partition-table.bin 0x10000 build\hello-world.bin
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值