見出し画像

Freenove ESP32-S3 CAM PSRAM設定

  • 「Freenove ESP32-S3-WROOM CAM ボード」のPSRAMの設定のメモ

  • 以下の商品を利用した

  • Arduino Librayを使っている場合は、ボードを選べば正しく設定されるはず

    • "ESP32-S3 Dev Module"を選べば、設定されるはず

    • まだ、実際には確認していない

  • 今回はハードの理解を深めるために、ESP IDFでのPSRAMの設定を行ってみる

環境

  • Freenove ESP32 S3 WROOM Board

    • (以下、本記事ではFreenoveボードと呼ぶ)

  • ESP-IDF version Version: v5.3.1

  • ESP32 Camera Driver v2.0.15

    • (以下、esp32-cameraと呼ぶ)

    • idf add-dependency でインストールできる(以下、参考コマンド)

idf.py add-dependency "espressif/esp32-camera"


PSRAMが有効になっていない場合のエラー

  • Freenoveボードには、8MBytesのPSRAMが搭載されているが、

  • ESP IDFでは、正しく設定しないと使えない

  • 8MのPSRAMは、カメラを撮影した画像を処理するのに必要

  • 正しく設定しない場合は、esp_camera_init()を呼び出したとき、以下のようなエラーがでる(はず)

    • 最後の行は筆者のアプリが出力したエラーメッセージ

E (380) cam_hal: cam_dma_config(301): frame buffer malloc failed
E (390) cam_hal: cam_config(390): cam_dma_config failed
E (390) gdma: gdma_disconnect(319): no peripheral is connected to the channel
E (400) camera: Camera config failed with error 0xffffffff
E (410) MYCAM: esp_camera_init() Failed
  • エラーの箇所をソースで追った

  • esp32-cameraにおいては、cam_hal.cでヒープメモリを確保する処理があり、

  • cam_hal.cの、cam_dma_config()の関数で、メモリを確保ている

  • カメラが撮影した画像用のバッファを確保用のメモリが確保できないと、初期化にエラーになり、起動できない

  • 以下のコードは、Frame bufferの数の分だけ、heapメモリをアロケーションする処理をesp32-cameraから抜粋したもの

  • メモリが足りない場合、cam_obj->frames[x].fb.buf が NULLになるので、CAM_CHECK()でエラーになる

  • frame buffer malloc failed などのエラーメッセージが表示されたら、

  • 解像度を下げる、フレームバッファの数を減らす、などをカメラの設定で行えば解決するかもしれない

cam_hal.c


static esp_err_t cam_dma_config(const camera_config_t *config)

for (int x = 0; x < cam_obj->frame_cnt; x++) {
        cam_obj->frames[x].dma = NULL;
        cam_obj->frames[x].fb_offset = 0;
        cam_obj->frames[x].en = 0;
        ESP_LOGI(TAG, "Allocating %d Byte frame buffer in %s", alloc_size, _caps & MALLOC_CAP_SPIRAM ? "PSRAM" : "OnBoard RAM");

        cam_obj->frames[x].fb.buf = (uint8_t *)heap_caps_aligned_alloc(16, alloc_size, _caps);
        CAM_CHECK(cam_obj->frames[x].fb.buf != NULL, "frame buffer malloc failed", ESP_FAIL);

heap_caps_aligned_calloc() 関数について

  • メモリを確保する、失敗した場合は、NULLを返す

  • A pointer to the memory allocated on success, NULL on failure


PSRAMを有効にする設定

  • menuconfig(または、SDK Configuration Editor)で設定できる

  • 今回は、SDK Configuration Editorで設定してみた

  • IDFにおいて、ESP32 Camera Driverをインストールすると、SDK Configuration Editorに「PSRAM関連の設定項目」が現れる

    • インストールしないと現れないかもしれない

  • PSRAMは、[Mode (QUAD/OCT) of SPI RAM chip in use]項目で設定できる

  • QuadモードとOctalモードがある

  • 筆者の環境では、デフォルトがQuadであった

[Mode (QUAD/OCT) of SPI RAM chip in use]
Quad Mode PSRAM
Octal Mode PSRAM
  • Freenoveボードにおいて、PSRAMをQuadにした場合、以下のようなエラーメッセージが表示された

  • 厄介なことに、エラー後、自動で再起動するので、起動、再起動の無限ループになる

  • 無限ループ時、高速にログが流れてしまい、ログを確認できないので、USBを抜くなりして止めてエラーメッセージを確認する必要がある

  • ログを読めば、PSRAMの設定が間違っていると判断できるのだが、ログが見づらく、暴走しているように見えて、かなり焦る

E (188) quad_psram: PSRAM ID read error: 0x00ffffff, PSRAM chip not found or not supported, or wrong PSRAM line mode
E cpu_start: Failed to init external RAM!

(ここで再起動)
  • ESP32-S3のデータシートをみると、オーダリングコードごとのPSRAMの種類がわかる

  • Freenoveボードが、どれなのか調べる必要がある

  • Freenoveボードに搭載されたESP32-S3チップの下側をみると、コードと思われる刻印がある

  • 8MBのOctal SPIとわかる


  • Octal Mode PSRAMに設定したところ、無事に画像処理用のバッファが確保され、正常動作した

  • Arduino Libraryを使っていると、こういうところを意識せずに使えるのは簡単だ

  • IDFで設定すると、より深い理解を得ることができる、と思った



いいなと思ったら応援しよう!