Démarrage rapide ESP32 (10): Système de stockage ESP32

1. Introduction au système de stockage ESP32

Le système de stockage ESP32 est divisé en stockage sur puce et stockage hors puce.

Le stockage sur puce comprend:

  • 448 Ko de ROM pour le démarrage du programme et l'appel de fonction du noyau
  • 520 Ko de SRAM sur puce pour le stockage des données et des instructions
  • La mémoire rapide RTC, 8 Ko de SRAM, peut être utilisée pour le stockage des données et
    accessible par le processeur principal lorsque RTC démarre en mode veille prolongée
  • Mémoire lente RTC, 8 Ko de SRAM, accessible par le coprocesseur en mode veille prolongée
  • 1 Kbit eFuse, dont 256 bits sont dédiés au système (adresse MAC et paramètres de la puce); les 768 bits restants sont réservés aux programmes utilisateur, qui
    incluent le cryptage flash et l'ID de puce
  • Le flash intégré ESP32-D2WD dispose d'un flash intégré de 16 Mbit, 40 MHz, qui est connecté à GPIO16, GPIO17, SD_CMD, SD_CLK, SD_DATA_0 et SD_DATA_1.

ESP32 prend en charge plusieurs flash QSPI externes et une mémoire vive statique SRAM. La mémoire flash externe peut être mappée à l'instruction CPU et à l'espace de données en lecture seule en même temps. Le flash externe peut prendre en charge jusqu'à 16 Mo. La SRAM externe peut être mappée à l'espace de données du processeur. La SRAM externe peut prendre en charge jusqu'à 8 Mo. Jusqu'à 4 Mo peuvent être mappés à la fois. Bien que ESP32 puisse prendre en charge plusieurs types de puces RAM, ESP32_SDK prend actuellement en charge ESP_PSRAM32 et ESP_PSRAM64. Une fois la puce démarrée, le programme utilisateur peut mapper une SRAM externe ou clignoter dans l'espace d'adressage du processeur.

2. Mappage d'adresses

Le mappage d'adresses ESP32 est le suivant:
Insérez la description de l'image ici
la partie sous l' adresse 0x4000_0000 appartient à la plage d'adresses du bus de données; la partie de l'
adresse 0x4000_0000 ~ 0x4FFF_FFFF appartient à la plage d'adresses du bus d'instructions;
la partie de l'adresse 0x5000_0000 et au-dessus est la plage d'adresses partagée par le bus de données et le bus d'instructions.

Insérez la description de l'image ici

3. Brève analyse de la SRAM

La mémoire SRAM (Static Random-Access Memory)
SRAM est divisée en IRAM et DRAM:

  • Instructions de stockage IRAM (programme)
  • DRAM stocke des données (tas, etc.)

4. RAM externe (RAM externe) prise en charge par le logiciel

ESP-IDF prend entièrement en charge l'utilisation de la RAM externe dans les applications, initialise la RAM externe au démarrage et offre plusieurs façons de configurer et de traiter la RAM externe.

Initialize SPI RAM when booting the ESP32, Autrement dit, initialisez la RAM SPI au démarrage de ESP32.

Méthode 1. Intégrez la RAM au mappage de mémoire ESP32. Il s'agit d'une option de base pour la RAM externe. La RAM externe pointe vers l'espace d'adressage 0x3F800000 (accès octet). La taille de la zone de la RAM externe est la taille de la RAM SPI (maximum 4 Mo). Placez les données via le pointeur vers la RAM externe.

Méthode 2. Initialisez la RAM et ajoutez-la à l'allocateur de fonctions. Cela permet au programme d'utiliser heap_caps_malloc(size,MALLOC_CAP_SPIRAM)exclusivement une RAM externe assignée. Cette mémoire peut être utilisée puis libérée en utilisant normal free (). Mapper à 0x3F800000.

3 mode de réalisation, initialisation de la RAM, l'ajoute à la fonction de distributeur, et peut être ajoutée à la mémoire malloc()RAM renvoyée du pool. Cela permet à toute application d'utiliser la RAM externe sans avoir à réécrire le code pour l'utiliser heap_caps_malloc. C'est la valeur par défaut.

Méthode 4. Le segment BSS peut être placé dans la RAM externe. Cet espace d'adressage commence à 0x3F800000 et est utilisé pour l'inventaire ESP-IDF lwip, net80211, libpp et bluedroid pour stocker les données initialisées à zéro (segment bss). Passez du segment BSS interne à la RAM externe en appliquant la macro EXT_RAM_ATTR (non initialisée à une valeur de 0) dans la déclaration statique. Cela réduit efficacement la mémoire statique interne utilisée par le segment BSS.

5. Comment utiliser le flash SPI

Les fonctions de fonctionnement liées au flash SPI ont été définies dans ESP-IDF. Nous pouvons appeler l'API associée pour faire fonctionner le flash tant que nous l'initialisons selon les besoins lors de son utilisation. Instructions:

void spi_flash_init();//flash 初始化在使用 spi-flash 之前需要调用此函数进行初始化。
size_t spi_flash_get_chip_size();//获取当前 flash 的容量大小。
/*按照扇区擦除 flash,sector 为扇区号*/
esp_err_t spi_flash_erase_sector(size_t sector);
/*按照地址擦除 flash,start_address 擦除的起始地址,size 是擦除大小,地址必须是 4 的倍数*/
esp_err_t spi_flash_erase_range(size_t start_address, size_t size);
/*将数据写入 flash,dest_addr flash 首地址,src 是要写入数据的首地址,size 是 src 数据的大小*/
esp_err_t spi_flash_write(size_t dest_addr, const void *src, size_t size);

/*从 flash 中读出数据,src_addr 是要 flash, dest 是接收数据的首地址,size 是读取的大小*/
esp_err_t spi_flash_read(size_t src_addr, void *dest, size_t size);

Si vous appelez l'interruption pendant un appel flash, vous devez ajouter l'attribut IARM_ATTR devant la fonction

#include "esp_attr.h"

void IRAM_ATTR gpio_isr_handler(void* arg)
{
    
    
    // ...
}

Ajouter les attributs DRAM_ATTR et DRAM_STR aux constantes

void IRAM_ATTR gpio_isr_handler(void* arg)
{
    
    
   const static DRAM_ATTR uint8_t INDEX_DATA[] = {
    
     45, 33, 12, 0 };
   const static char *MSG = DRAM_STR("I am a string stored in RAM");
}

6. Introduction à la table de partition

Le projet ESP-IDF utilise la table de partition pour enregistrer les informations de chaque zone de la mémoire flash SPI, y compris le programme de démarrage, divers fichiers binaires d'application, les données et le système de fichiers. Reportez-vous à la table de partition ESP32 pour l' introduction de la table de partition .

7. Bibliothèque de stockage non volatile (NVS)

La bibliothèque de stockage non volatile (NVS) est principalement utilisée pour stocker des données au format clé-valeur dans la mémoire flash. Veuillez consulter la bibliothèque de stockage non volatile ESP32 pour plus de détails .

8. Références

Je suppose que tu aimes

Origine blog.csdn.net/zztiger123/article/details/106120855
conseillé
Classement