Как объявить глобальные переменные в PSRAM

Никак.

Подробнее

Глобальные переменные всегда идут в .data и .bss , т.е. DRAM.

Причина проста - память под глобальные переменные выделяется задолго до инициализации чего бы то ни было.

Это бутлоадер, который ничегошеньки не знает про PSRAM, пакостит.

Это он, негодяй, загружает бинарник ваш в DRAM и IRAM. Ну, не весь бинарник, а только .data, .bss, еще наверняка что-то.. .iram1.text.*, в частности.

Если вам нужны глобальные переменные гигантские (массивы, там, например), то вам к malloc(). Вернее, даже не так - вам к heap_caps_malloc(). Вот таким образом: heap_caps_malloc(…, MALLOC_CAP_SPIRAM)

Тогда гарантированно выделится память в PSRAM.

Если вы попытаетесь сделать просто malloc(), большого буфера, то он тоже будет выделен в SPIRAM. Ну а если махонький буфер - то как повезет. Скорее всего будет DRAM