STM32のDMA(Direct Memory Access)はメモリー同士での転送も可能で、memcpy(を介したアセンブラ命令)を使うよりも2倍ほど高速です。大きなデータをコピーしたい場合はこの機能を積極的に使っていきましょう。

STM32CubeMXではメモリー間転送に特化したAPIは用意されていないため初期設定の手入力が必要ですが、全体としての作業は多くはありません。

以下はDMA2/Stream0にメモリー間転送を割り当てた場合のプログラム例です。
#define BUFFER_SIZE 256
uint8_t base_buffer[256];    // 転送元バッファ
uint8_t target_buffer[256];    // 転送先バッファ

void InitDMA()
{
    // 優先度の指定
    HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
    // DMA割り込みを有効にする
    HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
}

void CopyMemory()
{
    // 転送の開始(DMAハンドラ、転送元アドレス、転送先アドレス、転送サイズ)
    HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, base_buffer, target_buffer, BUFFER_SIZE);
}

void DMA2_Stream0_IRQHandler(void)
{
    // メモリー転送完了時に実行される割り込み処理
}