ESP32之ESP-IDF学习笔记2——复位、软硬件信息的获取

本文详细介绍了ESP-IDFV5.1.2中的几个关键API,如esp_system.h中的esp_restart和esp_reset_reason,以及esp_idf_version.h、esp_chip_info.h和esp_flash.h中的函数,展示了如何获取SDK版本、芯片信息和Flash容量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录一下,对知识的整理和复习,方便你我他。。。
只是记录的外设的API函数的使用,外设知识不介绍。
IDF版本V5.1.2

一、需要的头文件

#include "esp_system.h"
#include "esp_idf_version.h"
#include "esp_chip_info.h"
#include "esp_flash.h"

二、API

2.1 esp_system.h

/*
函数: esp_restart
功能: 软件复位ESP
输入: 
返回值: 
*/
void esp_restart(void)

/*
函数: esp_reset_reason
功能: 获取上一次复位的原因
输入: 
返回值: 上一次复位的枚举值
*/
esp_reset_reason_t esp_reset_reason(void)

2.2 esp_idf_version.h

/*
函数: esp_get_idf_version
功能: 获取SDK(IDF)的版本信息
输入: 
返回值: 版本信息
*/
const char* esp_get_idf_version(void)

2.3 esp_chip_info.h

/*
函数: esp_chip_info
功能: 获取芯片的信息
输入: out_info:保存信息的结构体变量
返回值: 
*/
void esp_chip_info(esp_chip_info_t* out_info)

2.4 esp_flash.h

/*
函数: esp_flash_get_size
功能: 返回 menuconfig 中设置的 flash 芯片容量(以字节为单位)
输入: chip:NULL;out_size:保存读取到的flash大小的地址
返回值: ESP_OK -> 成功,other -> 失败
*/
esp_err_t IRAM_ATTR esp_flash_get_size(esp_flash_t *chip, uint32_t *out_size)

/*
函数: esp_flash_get_size
功能: 返回 实际的 flash 芯片容量(以字节为单位)
输入: chip:NULL;out_size:保存读取到的flash大小的地址
返回值: ESP_OK -> 成功,other -> 失败
*/
esp_err_t IRAM_ATTR esp_flash_get_physical_size(esp_flash_t *chip, uint32_t *flash_size)

三、代码

#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_idf_version.h"
#include "esp_chip_info.h"
#include "esp_flash.h"


void app_main(void)
{
    char *tag = "main";
    esp_log_level_set(tag, ESP_LOG_DEBUG); //设置日志等级

    switch(esp_reset_reason())//获取上一次复位的原因
    {
        case ESP_RST_UNKNOWN:
        {
            ESP_LOGD(tag, "ESP_RST_UNKNOWN,复位原因无法确定");
            break;
        }
        case ESP_RST_POWERON:
        {
            ESP_LOGD(tag, "ESP_RST_POWERON, 上电事件导致的复位");
            break;
        }
        case ESP_RST_EXT:
        {
            ESP_LOGD(tag, "ESP_RST_EXT, 外部引脚复位(不适用于ESP32)");
            break;
        }
        case ESP_RST_SW:
        {
            ESP_LOGD(tag, "ESP_RST_SW, 软件复位通过esp_restart");
            break;
        }
        case ESP_RST_PANIC:
        {
            ESP_LOGD(tag, "ESP_RST_PANIC, 由于异常/恐慌导致软件复位");
            break;
        }
        case ESP_RST_INT_WDT:
        {
            ESP_LOGD(tag, "ESP_RST_INT_WDT, 由于中断看门狗而复位(软件或硬件)");
            break;
        }
        case ESP_RST_TASK_WDT:
        {
            ESP_LOGD(tag, "ESP_RST_TASK_WDT, 由于任务看门狗而复位");
            break;
        }
        case ESP_RST_WDT:
        {
            ESP_LOGD(tag, "ESP_RST_WDT, 由于其他看门狗复位");
            break;
        }
        case ESP_RST_DEEPSLEEP:
        {
            ESP_LOGD(tag, "ESP_RST_DEEPSLEEP, 退出深度睡眠模式后复位");
            break;
        }
        case ESP_RST_BROWNOUT:
        {
            ESP_LOGD(tag, "ESP_RST_BROWNOUT, 断电复位(软件或硬件)");
            break;
        }
        case ESP_RST_SDIO:
        {
            ESP_LOGD(tag, "ESP_RST_SDIO, 通过SDIO复位");
            break;
        }
        default: break;
    }

    // vTaskDelay(10000);
    //esp_restart();//复位ESP32
    
    ESP_LOGD(tag, "SDK版本号 : %s",esp_get_idf_version());//获取SDK(IDF)的版本信息

    esp_chip_info_t EspInfo;
    esp_chip_info(&EspInfo);

    switch(EspInfo.model)//模组
    {
        case CHIP_ESP32:
        {
            ESP_LOGD(tag, "模组:ESP32");
            break;
        }
        case CHIP_ESP32S2:
        {
            ESP_LOGD(tag, "模组:ESP32S2");
            break;
        }
        case CHIP_ESP32S3:
        {
            ESP_LOGD(tag, "模组:ESP32S3");
            break;
        }
        case CHIP_ESP32C3:
        {
            ESP_LOGD(tag, "模组:ESP32C3");
            break;
        }
        case CHIP_ESP32C2:
        {
            ESP_LOGD(tag, "模组:ESP32C2");
            break;
        }
        case CHIP_ESP32C6:
        {
            ESP_LOGD(tag, "模组:ESP32C6");
            break;
        }
        case CHIP_ESP32H2:
        {
            ESP_LOGD(tag, "模组:ESP32H2");
            break;
        }
        case CHIP_POSIX_LINUX:
        {
            ESP_LOGD(tag, "模组:POSIX_LINUX");
            break;
        }
        default: break;
    }

    ESP_LOGD(tag, "CPU核心数:%d",EspInfo.cores);
    ESP_LOGD(tag, "芯片版本号:%d",EspInfo.revision);
    ESP_LOGD(tag, "CHIP_FEATURE_x功能标志,%lX",EspInfo.features);//features是uint32_t类型
    if(EspInfo.features & 0x01) ESP_LOGD(tag, "芯片内嵌flash");
    if((EspInfo.features >> 1) & 0x01) ESP_LOGD(tag, "芯片有 2.4GHz WiFi");
    if((EspInfo.features >> 4) & 0x01) ESP_LOGD(tag, "芯片有 蓝牙低功耗");
    if((EspInfo.features >> 5) & 0x01) ESP_LOGD(tag, "芯片有 蓝牙");
    if((EspInfo.features >> 6) & 0x01) ESP_LOGD(tag, "芯片有 IEEE 802.15.4");
    if((EspInfo.features >> 7) & 0x01) ESP_LOGD(tag, "芯片内嵌虚拟SRAM");

    uint32_t size1;
    uint32_t size2;
    esp_flash_get_size(NULL, &size1);//可通过配置项自定义的flash大小
    esp_flash_get_physical_size(NULL, &size2);//实际的flash大小
    ESP_LOGD(tag, "Flash 容量 %ld MB", size1 / (1024 * 1024));
    ESP_LOGD(tag, "Flash 容量 %ld MB", size2 / (1024 * 1024));
}

四、运行结果

在这里插入图片描述

五、补充

  1. 在打印 uint32_t 类型的变量的时候要使用 %ld
  2. idf5.0以下的版本,获取flash大小的函数和头文件路径可能不一样
  3. 通过配置项的flash大小
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值