Компилятор помещает массивы в секцию (вероятно bss), где вся эта
секция обнуляется startup-кодом еще до входа в main(). Все так
делают, нулями прошивку не заполняют. В ARMе заполнение нулями
происходит 32-битными порциями (обнуленный регистр в цикле
копируется в память), видимо из-за этого ее размер в байтах должен
делиться на 4 байта без остатка. Позже я нашла иной способ - через
дефиницию __no_init, тогда линкер размещает массив в другой
сегмент, который при старте не обнуляется:
#define DACBUFLEN2 773
#pragma location = 0x30020000 // SRAM2
__no_init uint16_t bufferDAC2[DACBUFLEN2];
Кроме того, в CubeMX есть еще и такой код:
#if defined (DATA_IN_D2_SRAM)
/* in case of initialized data in D2 SRAM (AHB SRAM) , enable the D2 SRAM clock (AHB SRAM clock) */
#if defined(RCC_AHB2ENR_D2SRAM3EN)
RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN);
#elif defined(RCC_AHB2ENR_D2SRAM2EN)
RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN);
#else
RCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN);
#endif /* RCC_AHB2ENR_D2SRAM3EN */
Т.е. где-то D2, а где-то AHB.