Lab4 DMA2D Embedded Systems

Dependencies:   BSP_DISCO_F746NG mbed

Revision:
0:919da762f527
Child:
1:751d3c9544ea
diff -r 000000000000 -r 919da762f527 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Oct 21 11:21:14 2017 +0000
@@ -0,0 +1,153 @@
+//#include "mbed.h"
+
+/**
+  ******************************************************************************
+  * @file    main.c
+  * @author  Ac6
+  * @version V1.0
+  * @date    01-December-2013
+  * @brief   Default main function.
+  ******************************************************************************
+*/
+
+
+#include "stm32f7xx.h"
+#include "stm32746g_discovery.h"
+#include "stm32746g_discovery_lcd.h"
+#include "stm32f7xx_hal_dma2d.h"
+#include "ARGB4444_150x150.h"
+
+#define LCD_MEM_ADDR (LCD_FB_START_ADDRESS + (480 * 272) * 4)
+
+void SystemClock_Config(void)
+{
+  RCC_ClkInitTypeDef RCC_ClkInitStruct;
+  RCC_OscInitTypeDef RCC_OscInitStruct;
+  HAL_StatusTypeDef ret = HAL_OK;
+
+  /* Enable HSE Oscillator and activate PLL with HSE as source */
+  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+  RCC_OscInitStruct.PLL.PLLM = 25;
+  RCC_OscInitStruct.PLL.PLLN = 400;
+  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+  RCC_OscInitStruct.PLL.PLLQ = 8;
+
+  ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
+  if(ret != HAL_OK)
+  {
+    while(1) { ; }
+  }
+
+  /* Activate the OverDrive to reach the 200 MHz Frequency */
+  ret = HAL_PWREx_EnableOverDrive();
+  if(ret != HAL_OK)
+  {
+    while(1) { ; }
+  }
+
+  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
+  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
+  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
+  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
+
+  ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_6);
+  if(ret != HAL_OK)
+  {
+    while(1) { ; }
+  }
+}
+
+DMA2D_HandleTypeDef hdma2d;
+
+void DMA2D_Config(void);
+uint32_t ramBuffer[(150 * 150 * 2) / 4];
+uint32_t offset = ((272 - 150) / 2 * 480 + (480 - 150) / 2) * 4;
+
+int main(void)
+{
+    int xpos_offset = 0;
+    HAL_Init();
+    //SystemClock_Config();
+
+    BSP_LCD_Init();
+    BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
+    BSP_LCD_Clear(LCD_COLOR_BLACK);
+    BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
+    BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
+    BSP_LCD_SetFont(&Font16);
+
+    DMA2D_Config();
+
+    HAL_DMA2D_Start(&hdma2d, (uint32_t)&ARGB4444_150x150, (uint32_t)&ramBuffer, 150, 150);
+    while(HAL_DMA2D_PollForTransfer(&hdma2d, 1000) != HAL_OK);
+
+    hdma2d.Init.Mode = DMA2D_M2M_PFC;
+    hdma2d.Init.ColorMode = DMA2D_ARGB8888;
+    hdma2d.Init.OutputOffset = 480 - 150;
+
+    hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+    hdma2d.LayerCfg[1].InputAlpha = 0xff;
+    hdma2d.LayerCfg[1].InputColorMode = CM_ARGB4444;
+    hdma2d.LayerCfg[1].InputOffset = 0;
+
+    HAL_DMA2D_Init(&hdma2d);
+    HAL_DMA2D_ConfigLayer(&hdma2d, 1);
+    HAL_DMA2D_Start(&hdma2d, (uint32_t)&ramBuffer, LCD_FB_START_ADDRESS + offset, 150, 150);
+    while(HAL_DMA2D_PollForTransfer(&hdma2d, 1000) != HAL_OK);
+
+    for(;;){
+        // fill the previous position of image
+        hdma2d.Init.Mode = DMA2D_R2M;
+        HAL_DMA2D_Init(&hdma2d);
+        //HAL_DMA2D_Start(&hdma2d, 0x00000000, LCD_FB_START_ADDRESS + offset + xpos_offset, 150, 150);
+        HAL_DMA2D_Start(&hdma2d, 0x00000000, LCD_MEM_ADDR, 480, 272);
+        while(HAL_DMA2D_PollForTransfer(&hdma2d, 1000) != HAL_OK);
+        // and move to the next
+        xpos_offset += 4;
+        if (xpos_offset == 300)
+            xpos_offset = 0;
+        hdma2d.Init.Mode = DMA2D_M2M_PFC;
+        hdma2d.Init.ColorMode = DMA2D_ARGB8888;
+        hdma2d.Init.OutputOffset = 480 - 150;
+        hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+        hdma2d.LayerCfg[1].InputAlpha = 0xff;
+        hdma2d.LayerCfg[1].InputColorMode = CM_ARGB4444;
+        hdma2d.LayerCfg[1].InputOffset = 0;
+        HAL_DMA2D_Init(&hdma2d);
+        HAL_DMA2D_ConfigLayer(&hdma2d, 1);
+        //HAL_DMA2D_Start(&hdma2d, (uint32_t)&ramBuffer, LCD_FB_START_ADDRESS + offset + xpos_offset, 150, 150);
+        HAL_DMA2D_Start(&hdma2d, (uint32_t)&ramBuffer, LCD_MEM_ADDR + offset + xpos_offset, 150, 150);
+        while(HAL_DMA2D_PollForTransfer(&hdma2d, 1000) != HAL_OK);
+        hdma2d.Init.OutputOffset = 0;
+        hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+        hdma2d.LayerCfg[1].InputAlpha = 0xff;
+        hdma2d.LayerCfg[1].InputColorMode = CM_ARGB8888;
+        hdma2d.LayerCfg[1].InputOffset = 0;
+        HAL_DMA2D_Init(&hdma2d);
+        HAL_DMA2D_ConfigLayer(&hdma2d, 1);
+        HAL_DMA2D_Start(&hdma2d, LCD_MEM_ADDR, LCD_FB_START_ADDRESS, 480, 272);
+        while(HAL_DMA2D_PollForTransfer(&hdma2d, 1000) != HAL_OK);
+        HAL_Delay(50);
+    }
+}
+
+void DMA2D_Config(void) {
+    hdma2d.Init.Mode = DMA2D_M2M;
+    hdma2d.Init.OutputOffset = 0;
+    hdma2d.Init.ColorMode = DMA2D_ARGB4444;
+
+    hdma2d.Instance = DMA2D;
+
+    hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+    hdma2d.LayerCfg[1].InputAlpha = 0xff;
+    hdma2d.LayerCfg[1].InputOffset = 0;
+    hdma2d.LayerCfg[1].InputColorMode = CM_ARGB4444;
+
+    HAL_DMA2D_Init(&hdma2d);
+    HAL_DMA2D_ConfigLayer(&hdma2d, 1);
+}