STM32におけるDMA高速メモリー転送

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

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

以下はDMA2/Stream0にメモリー間転送を割り当てた場合のプログラム例です。
dma.c
#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)
{
	// メモリー転送完了時に実行される割り込み処理
}
2019/05/20