0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入剖析esp32c3的系统底层启动

嵌入式IoT 来源:嵌入式IoT 作者:bigmagic 2021-07-06 10:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.本文概述对于esp32的玩法,基本上定位都是做上层应用,乐鑫官方提供的ESP-IDF物联网开发框架已经十分的完善,做上层应用按照这套框架进行开发,完全不必了解底层的实现细节。作为一个深入研究riscv底层的爱好者来说,跳过ESP-IDF框架,直接像使用单片机一样去使用ESP32C3更加有意思。本文的目的就是理解ESP32C3的裸机开发流程,像玩单片机一样去使用这个riscv的mcu

2.esp32c3分析对于esp32c3玩法,从玩家来看可能更加类似ESP8266,相比8266,可以做如下表格对比:

8266C366

cpuXtensaRISCV

时钟频率160MHz160MHz

WIFIIEEE 802.11 b/g/n;2.4GHz;HT20;up to 75 MbpsIEEE 802.11 b/g/n;2.4GHz;HT20;up to 150 Mbps

蓝牙N/ABluetooth LE v5.0

SRAM160 KB400KB

ROM0384KB

RTC ROM1KB8KB

简单对比一下,不难发现esp32的还是与8266有点类似,而从目前的信息来看,esp32c3芯片的定价也是基本上和8266差不多的。

玩esp32c3,除了可以学习riscv架构,也能够对底层系统的嵌入式编程有着更加深刻的理解。

3.esp32c3系统启动流程如果按照乐鑫ESP-IDF正常的启动流程来看,启动过程有三个阶段

bootloader第一阶段

该阶段主要是上电后,从ROM中运行,并且将bootloader第二阶段程序从flash的0x0地址偏移处搬运到RAM中。

SOC上电后,直接执行复位向量代码,通过检测GPIO_STRAP_REG的寄存器的状态来确定启动模式。

一般来说,有三种启动模式:

reset from deep sleep

这种启动模式就是系统从深度睡眠中被唤醒。

power up

上电启动

看门狗复位

bootloader第二阶段

该程序开始存放在flash的0x0地址处,其中的作用是从flash中加载分区表,并且决定启动的程序位置,对于OTA来说非常有用处。而且也有一些flash程序的解压或者压缩的代码,安全启动,以及 over-the-air updates(OTA)等等。然后将程序的数据段放到DROM,指令段放到DRAM中。

主程序启动

第二阶段启动后,加载主程序并且运行自己的程序的业务逻辑。主要的流程就是首先初始化C语言的执行环境,设置栈指针地址,运行FreeRTOS操作系统,然后运行main任务线程,执行app_main。用户自己在app_main中编写自己的逻辑。

4.分析esp32c3上的裸机程序目的是让esp32c3上电后直接启动我们自己编写的裸机程序,那么首先ROM中的程序是不能改变的。

https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_cn.pdf

要写裸机代码,首先需要看懂技术手册,在芯片Boot控制的这一章节,有描述ESP32C3的启动一共有三个Strapping管脚GPIO2,GPIO8,GPIO9。

通过这个三个引脚的组合,可以控制boot模式。

启动模式GPIO2GPIO8GPIO9

SPI Boot 模式1x1

Download Boot模式110

对于SPI模式,又分为两种方式:

常规flash启动

这种模式支持安全启动,程序直接在RAM中。

直接启动方式

不支持安全启动,程序直接运行在flash中,默认使用这种方式时,需要将程序的bin文件的前两个字节(地址:0x42000000)为0xaebd041d。

而对于Download Boot模式,可以将UART0或者USB下载代码到flash中或者SRAM中,这样可以直接在SRAM中运行。

而本文的实验过程采用的是直接启动方式。

在编写裸机代码之前,首先来看一下memory map。

对于数据的布局如下

程序的链接脚本可设置如下:

MEMORY

{

irom (x): org = 0x42000000, len = 0x400000

drom (r): org = 0x3C000000, len = 0x400000

ram (rw): org = 0x3FC80000, len = 0x50000

rtc_ram (rx): org = 0x50000000, len = 0x2000

}

因为涉及到数据段和代码段的地址分离问题,当程序编译成一整个固件的时候,在flash中的存在形式就是一个elf格式的文件,通过内存的加载,将代码段,数据段分别放到IRAM和DRAM中,同时将栈指针地址,数据段,bss段指向ram中。这样就完成了裸机程序的布局。

接下来要开始构建裸机工程了。

5.esp32c3裸机工程的构建在自行构建裸机工程的时候,也参考一些国外工程师的一些代码,最后结合自己的理解,通过meson+ninja构建出属于自己的esp32c3裸机代码实验平台。

为什么不用cmake或者makefile,原因是makefile的跨平台效率不是很好,而且语法比较复杂,而cmake也比较慢,所以想到以后可能会到windows上开发,换一种高效简单的工程构建方式比较,就采用meson+ninja build。关于构建语法规则这里不做赘述。只介绍工程如何使用。

首先本文的环境只在Linux上环境下做编译,并在windows平台上下载程序。整个平台后期会完全在windows上进行开发。

1.从github上下载代码

git clone git@github.com:bigmagic123/esp32c3_bare_metal.git

该工程项目主要用于研究esp32c3裸机实验平台。

2.下载riscv交叉编译工具链

首先需要下载教程编译工具链。

https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases/tag/v10.1.0-1.1/

下载对应版本的riscv最新的交叉编译工具链即可。

3.设置gcc路径

直接修改esp32c3_bare_metal/example/cross.txt中的路径即可。

4c66a4ba-ddc8-11eb-9e57-12bb97331649.png

替换自己的编译路径即可。

4.编译程序

meson setup _build --cross-file cross.txt

cd _build

ninja

6.esp32c3裸机代码下载与运行首先需要下载python3。可以在windows系统上进行操作。

安装好后,可以输入pip install esptool。

下载完成后,esp32c3通过串口调试助手连接到电脑

下载完成,可以通过esptool探测芯片ID。

通过下面的命令烧录并启动串口

esptool.py --port COM4 --baud 921600 write_flash 0x0000 demo.bin

python -m serial.tools.miniterm COM4 115200

如果退出,可以输出下面的命令

ctrl + ]

这样就可以将程序烧录到flash中了。

7.分析裸机驱动程序的编写编写裸机程序,在对于esp32c3的编程模型中,可以使用ROM的里面的程序进行设计。

其原理就是ROM中运行程序,每个函数都有特定的地址,只需要知道ROM函数对应的地址,就可以通过访问地址,从而访问函数。

在[esp-idf](https://github.com/espressif/esp-idf)。

components/esp_rom/esp32c3/ld/esp32c3.rom.ld

其中定义了一些rom函数的地址,比如通过串口发送一个字节

uart_tx_one_char = 0x40000068;

其头文件

components/esp_rom/include/esp32c3/rom/uart.h

函数的定义

/**

* @brief Output a char to printf channel, wait until fifo not full.

*

* @param None

*

* @return OK.

*/

STATUS uart_tx_one_char(uint8_t TxChar);

另外,也以通过编程手册进行操作寄存器的编程,这种难度稍微大一些。

https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_cn.pdf

比如在定时器组(TIMG)的章节

在寄存器的控制寄存器,首先TIMG_T0_EN设置为1的时候,使能计数器。

对于ESP32C3的编程,首先配置一下寄存器,使能定时器。

然后可以通过UPDATE寄存器更新寄存器的值。

当使能定时器时,其值不断在增加/减少。每次需要读取数据的时候,需要将上述的31位写0或者1,才能去读T0LO寄存器。

其定时器的值为54位。这样就可以正常通过寄存器操作esp32c3定时器了。

8.总结esp32c3裸机编程,可以清楚的理解esp32的底层启动过程,完全当作单片机来使用。

关于wifi和蓝牙部分,使用rom中提供的函数地址,通过链接脚本和头文件的方式进行函数调用,这样非常方便,而大部分驱动编程则需要自己查询datasheet,操作外设对应的寄存器进行访问。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663528
  • 寄存器
    +关注

    关注

    31

    文章

    5589

    浏览量

    129060
  • 蓝牙
    +关注

    关注

    119

    文章

    6221

    浏览量

    177540
  • 物联网
    +关注

    关注

    2939

    文章

    47317

    浏览量

    407851
  • ESP
    ESP
    +关注

    关注

    0

    文章

    194

    浏览量

    36095

原文标题:esp32c3的系统底层启动分析

文章出处:【微信号:Embeded_IoT,微信公众号:嵌入式IoT】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件
    的头像 发表于 11-28 07:27 702次阅读

    ESP32-C3 mqtt操作实践

    。 cp -r $IDF_PATH/examples/protocols . 接着找到mqtt/tcp的例子。 cd protocols/mqtt/tcp 设置相关的编译目标为esp32c3。 idf.py
    发表于 10-31 06:52

    乐鑫ESP32-C6和ESP32-C61究竟该如何选择?一文读懂本质区别

    乐鑫科技推出的ESP32-C6和ESP32-C61均支持Wi-Fi6,但定位不同。ESP32-C6是多协议枢纽,集成Wi-Fi6、蓝牙5、Zigbee和Thread,适合智能家居网关和Matter
    的头像 发表于 10-28 14:17 1277次阅读
    乐鑫<b class='flag-5'>ESP32-C</b>6和<b class='flag-5'>ESP32-C</b>61究竟该如何选择?一文读懂本质区别

    ESP32-C3赋能物联网设备,开启产品智能化,乐鑫代理商飞睿科技

    ESP32-C3是乐鑫科技推出的高性能物联网芯片,搭载RISC-V单核处理器,支持Wi-Fi/蓝牙5(LE)双模连接。该芯片具有多层安全防护机制(安全启动、Flash加密等)和超低功耗特性(深度睡眠
    的头像 发表于 10-27 10:53 451次阅读
    <b class='flag-5'>ESP32-C3</b>赋能物联网设备,开启产品智能化,乐鑫代理商飞睿科技

    ESP32-C3赋能物联网设备,开启产品智能化,乐鑫代理商飞睿科技

    ESP32-C3是乐鑫科技推出的高性能物联网芯片,搭载RISC-V单核处理器,支持Wi-Fi/蓝牙5(LE)双模连接。该芯片具有多层安全防护机制(安全启动、Flash加密等)和超低功耗特性(深度睡眠
    的头像 发表于 10-27 10:46 309次阅读

    ESP32与DM9051ANX开发版引脚接法说明

    ESP32 C3使用SPI网口芯片DM9051ANX时,以此硬件引腳接法作为参考,使项目目发展行顺利。
    的头像 发表于 10-01 10:35 314次阅读
    <b class='flag-5'>ESP32</b>与DM9051ANX开发版引脚接法说明

    ESP32-S3的MicroPython开发环境搭建

    本文通过搭建Thonny IDE开发环境,了解了如何给ESP32-S3烧录MircoPython固件和MircoPython应用程序。
    的头像 发表于 09-11 16:02 933次阅读
    <b class='flag-5'>ESP32-S3</b>的MicroPython开发环境搭建

    专为 ESP32-P4C5 核心板打造的高效开发利器

    SDK+详尽文档,新手秒上手,高手效率翻倍!双芯片设计,释放澎湃性能ESP32-P4C5核心板采用乐鑫科技的ESP32-P4+ESP32-C5双芯架构!·ESP32-P
    的头像 发表于 08-11 18:19 914次阅读
    专为 <b class='flag-5'>ESP32-P4C</b>5 核心板打造的高效开发利器

    ESP32-C3开发板全面支持小智AI!烧录实战指南来了!

    本文将详细解析基于乐鑫ESP32-C3芯片的ZXAIEC43开发板烧录“小智”AI语音系统的全流程。该方案代码完全开源,支持深度定制开发,适用于智能玩具、潮玩手办及智能家居控制等多元场景。开发环境搭建1.
    的头像 发表于 06-13 18:01 3447次阅读
    <b class='flag-5'>ESP32-C3</b>开发板全面支持小智AI!烧录实战指南来了!

    基于ESP32C3的智能小车设计

    你有没有想过,从零开始亲手制作一辆坚固耐用的遥控越野车?今天,小编就带你走进一个融合机械、电子与物联网的精彩DIY项目——一款由 Seeed Studio XIAO ESP32C3 强力驱动的 3D打印4x4 RC漫游车!
    的头像 发表于 06-04 11:11 1737次阅读
    基于<b class='flag-5'>ESP32C3</b>的智能小车设计

    乐鑫ESP32-C5全面进入量产

    乐鑫信息科技 (688018.SH) 宣布,ESP32-C5 现已全面进入量产。
    的头像 发表于 05-06 16:50 1054次阅读

    乐鑫ESP32-C5全面进入量产!启明云端乐鑫科技代理商

    乐鑫信息科技(688018.SH)宣布,ESP32-C5现已全面进入量产。作为行业首款2.4&5GHz双频Wi-Fi6的RISC-VSoC,ESP32-C5同时集成Bluetooth5(LE
    的头像 发表于 04-30 18:10 839次阅读
    乐鑫<b class='flag-5'>ESP32-C</b>5全面进入量产!启明云端乐鑫科技代理商

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本质上是让 ESP32 设备与豆包的 API 进行通信,以获取相关服务
    的头像 发表于 02-05 13:40 2842次阅读
    <b class='flag-5'>esp32</b>如何接入豆包

    领略ESP32芯片的科技魅力:C6与S3

    作者:Lashley Wang 物联网时代,ESP32 系列芯片大放异彩!想深入了解它们的独特魅力吗?本期将为你详细解读ESP32-C6和ESP32-S3这两款芯片的特性与优势。更有精
    的头像 发表于 01-26 17:48 3854次阅读
    领略<b class='flag-5'>ESP32</b>芯片的科技魅力:<b class='flag-5'>C</b>6与S<b class='flag-5'>3</b>

    原来ESP32竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi数据传输

    如何使用ESP32来做人体检测传感器,对我来说还是挺新鲜的事儿,对你来说是否有也一样呢?接下来我会重点来展开说说如何通过ESP32来实现,这里我用的的是ESP32C3模组;0、前言之前看过乐鑫
    的头像 发表于 12-18 18:12 5350次阅读
    原来<b class='flag-5'>ESP32</b>竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi数据传输