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