// DMA 7A - kopírování v rámci paměti (Memory to Memory) // pro rozumné srovnání s kopírováním pomocí smyčky se vyplatí zapnout optimalizaci // v rámci ukázky využijeme DMA na zkopírování obsahu "buffer8" do "buffer16" #include "stm32f0xx.h" #include "stm32f0xx_ll_bus.h" #include "stm32f0xx_ll_rcc.h" #include "stm32f0xx_ll_gpio.h" #include "stm32f0xx_ll_utils.h" #include "stm32f0xx_ll_tim.h" #include "stm32f0xx_ll_dma.h" void init_clock(void); void init_gpio(void); void DMA_init(void); volatile uint16_t buffer16[2048]={0}; // cíl transferu //const uint8_t buffer8[2048]={0,1,2,3,4,5}; // zdroj transferu FLASH volatile uint8_t buffer8[2048]={0,1,2,3,4,5}; // zdroj transferu SRAM volatile uint16_t time_dma,time_cyklus; // na měření času uint16_t i; int main(void){ init_clock(); // 48MHz (HSE bypass) DMA_init(); // konfiguruje DMA Channel1 (Mem2Mem) // Využijeme TIM6 k orientačnímu měření doby přenosu LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6); // clock pro TIM6 LL_TIM_SetPrescaler(TIM6,47); // 1MHz clock pro TIM6 LL_TIM_GenerateEvent_UPDATE(TIM6); // vyvolat přepsání Prescaleru - pro jistotu LL_TIM_SetCounter(TIM6,0);// vymazat counter LL_TIM_EnableCounter(TIM6); // zahájit měření času // u Mem2Mem se zahájí přenos okamžitě s povolením kanálu LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1); // povolme kanál while(!LL_DMA_IsActiveFlag_TC1(DMA1)){}; LL_TIM_DisableCounter(TIM6); // ukončit měření času time_dma=LL_TIM_GetCounter(TIM6); // zjistit přibližnou dobu trvání přenosu // jsme čistotní a uklidíme po sobě vlajky LL_DMA_ClearFlag_GI1(DMA1); LL_DMA_ClearFlag_HT1(DMA1); LL_DMA_ClearFlag_TC1(DMA1); // a nebo úklid provedeme elegantněji pomocí CMSIS // DMA1->IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CHTIF1 | DMA_IFCR_CTCIF1; // pro sorvnání ještě kopírování pomocí smyčky LL_TIM_SetCounter(TIM6,0); LL_TIM_EnableCounter(TIM6); // zahájit měření času for(i=0;i