AnsweredAssumed Answered

DMA usages between memory to peripheral

Question asked by Louiey on Oct 16, 2015

I'm trying to use DMA for graphic LCD control on F429(STM32Cube_FW_F4_V1.8.0).
LCD spec is 160x128 and color is 16bit(RGB565) and bus type is 8bit parallel.
So I'm using FMC to access LCD and now it's working well and I need to improve LCD update speed.
Actually if I increase AHB/SYS clock, its bus clock is increasing so could manage to get fast LCD update but I should increase its clock speed so I'm trying to use DMA to improve its speed. (I think DMA will clear my problem, isn't it?)

I wrote LCD_Write_DMA API to send color data to LCD and testing but it didn't send any data to LCD, external device.
My API code is like as below...
uint16_t dma_color;
static void LCD_Write_DMA(uint16_t word, uint32_t word_len)
     dma_color = word;
     /* DMA controller clock enable */

     /* Configure DMA request hdma_memtomem_dma2_stream0 on DMA2_Stream0 */
     hDma2Stream0.Instance                          = DMA2_Stream0;
     hDma2Stream0.Init.Channel                     = DMA_CHANNEL_0;
     hDma2Stream0.Init.Direction                = DMA_MEMORY_TO_PERIPH;
     hDma2Stream0.Init.PeriphInc                = DMA_PINC_DISABLE;
     hDma2Stream0.Init.MemInc                     = DMA_MINC_DISABLE;
     hDma2Stream0.Init.PeriphDataAlignment      = DMA_PDATAALIGN_HALFWORD;
     hDma2Stream0.Init.MemDataAlignment           = DMA_PDATAALIGN_HALFWORD;
     hDma2Stream0.Init.Mode                          = DMA_NORMAL;
     hDma2Stream0.Init.Priority                     = DMA_PRIORITY_HIGH;
     hDma2Stream0.Init.FIFOMode                     = DMA_FIFOMODE_ENABLE;
     hDma2Stream0.Init.FIFOThreshold           = DMA_FIFO_THRESHOLD_FULL;
     hDma2Stream0.Init.MemBurst                     = DMA_MBURST_SINGLE;
     hDma2Stream0.Init.PeriphBurst                = DMA_PBURST_SINGLE;

     /* DMA interrupt init */
     HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
     HAL_DMA_Start_IT(&hDma2Stream0, (uint32_t)&dma_color, LCD_DATA, word_len*2);

I keep calling LCD_Clear() to see there is a data coming out from bus but even though I changed some parameters, I couldn't manage to work with DMA.
As I said, it's working well with FMD without DMA so init and LCD relates config/HW connection is correct.
I could confirm srcAddr/dstAddr/DataLen is valid at DMA API but whenever I call "LCD_Write_DMA", I cannot see data coming from F427, there is no CS/RS/BUS/RD/WR signal coming.

Could anyone help what I missing and wrong?

Many thanks.
Louie Yang.