Skip to main content
davidra7
Associate III
May 26, 2020
Question

STM32H747XI MIPI-DSI on M4 core

  • May 26, 2020
  • 1 reply
  • 941 views

Hi,

I am migrating my software from STM32F778AI to STM32H747XI due to performance issues..

I decided to handle basic operations and display on M4 core (include TouchGFX) and heavy calculations on M7 core.

I use external SDRAM and enabled FMC and initialized and it is working.

My MIPI-DSI commands working because I able to initialize my display (and tearing effect pin) but when I try to refresh the display the display don't change but I get HAL_DSI_EndOfRefreshCallback interrupt.

This exactly code working on my STM32F778AI so I don't think it is initialization issue but I think it is LTDC/DSI not working on M4 core.

Is there any special settings that I need to add to make DSI+LTDC with External RAM on M4 Core?

DSI:

static void MX_DSIHOST_DSI_Init(void)
{
 
 /* USER CODE BEGIN DSIHOST_Init 0 */
 
 /* USER CODE END DSIHOST_Init 0 */
 
 DSI_PLLInitTypeDef PLLInit = {0};
 DSI_HOST_TimeoutTypeDef HostTimeouts = {0};
 DSI_PHY_TimerTypeDef PhyTimings = {0};
 DSI_LPCmdTypeDef LPCmd = {0};
 DSI_CmdCfgTypeDef CmdCfg = {0};
 
 /* USER CODE BEGIN DSIHOST_Init 1 */
 
 /* USER CODE END DSIHOST_Init 1 */
 hdsi.Instance = DSI;
 hdsi.Init.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_DISABLE;
 hdsi.Init.TXEscapeCkdiv = 2;
 hdsi.Init.NumberOfLanes = DSI_ONE_DATA_LANE;
 PLLInit.PLLNDIV = 10;
 PLLInit.PLLIDF = DSI_PLL_IN_DIV1;
 PLLInit.PLLODF = DSI_PLL_OUT_DIV1;
 if (HAL_DSI_Init(&hdsi, &PLLInit) != HAL_OK)
 {
 Error_Handler();
 }
 HostTimeouts.TimeoutCkdiv = 1;
 HostTimeouts.HighSpeedTransmissionTimeout = 0;
 HostTimeouts.LowPowerReceptionTimeout = 0;
 HostTimeouts.HighSpeedReadTimeout = 0;
 HostTimeouts.LowPowerReadTimeout = 0;
 HostTimeouts.HighSpeedWriteTimeout = 0;
 HostTimeouts.HighSpeedWritePrespMode = DSI_HS_PM_DISABLE;
 HostTimeouts.LowPowerWriteTimeout = 0;
 HostTimeouts.BTATimeout = 0;
 if (HAL_DSI_ConfigHostTimeouts(&hdsi, &HostTimeouts) != HAL_OK)
 {
 Error_Handler();
 }
 PhyTimings.ClockLaneHS2LPTime = 20;
 PhyTimings.ClockLaneLP2HSTime = 18;
 PhyTimings.DataLaneHS2LPTime = 10;
 PhyTimings.DataLaneLP2HSTime = 13;
 PhyTimings.DataLaneMaxReadTime = 0;
 PhyTimings.StopWaitTime = 7;
 if (HAL_DSI_ConfigPhyTimer(&hdsi, &PhyTimings) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_DSI_ConfigFlowControl(&hdsi, DSI_FLOW_CONTROL_BTA) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_DSI_SetLowPowerRXFilter(&hdsi, 10000) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_DSI_ConfigErrorMonitor(&hdsi, HAL_DSI_ERROR_NONE) != HAL_OK)
 {
 Error_Handler();
 }
 LPCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_DISABLE;
 LPCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_DISABLE;
 LPCmd.LPGenShortWriteTwoP = DSI_LP_GSW2P_DISABLE;
 LPCmd.LPGenShortReadNoP = DSI_LP_GSR0P_DISABLE;
 LPCmd.LPGenShortReadOneP = DSI_LP_GSR1P_DISABLE;
 LPCmd.LPGenShortReadTwoP = DSI_LP_GSR2P_DISABLE;
 LPCmd.LPGenLongWrite = DSI_LP_GLW_DISABLE;
 LPCmd.LPDcsShortWriteNoP = DSI_LP_DSW0P_DISABLE;
 LPCmd.LPDcsShortWriteOneP = DSI_LP_DSW1P_DISABLE;
 LPCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_DISABLE;
 LPCmd.LPDcsLongWrite = DSI_LP_DLW_DISABLE;
 LPCmd.LPMaxReadPacket = DSI_LP_MRDP_DISABLE;
 LPCmd.AcknowledgeRequest = DSI_ACKNOWLEDGE_DISABLE;
 if (HAL_DSI_ConfigCommand(&hdsi, &LPCmd) != HAL_OK)
 {
 Error_Handler();
 }
 CmdCfg.VirtualChannelID = 0;
 CmdCfg.ColorCoding = DSI_RGB888;
 CmdCfg.CommandSize = 320;
 CmdCfg.TearingEffectSource = DSI_TE_EXTERNAL;
 CmdCfg.TearingEffectPolarity = DSI_TE_FALLING_EDGE;
 CmdCfg.HSPolarity = DSI_HSYNC_ACTIVE_LOW;
 CmdCfg.VSPolarity = DSI_VSYNC_ACTIVE_LOW;
 CmdCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH;
 CmdCfg.VSyncPol = DSI_VSYNC_FALLING;
 CmdCfg.AutomaticRefresh = DSI_AR_ENABLE;
 CmdCfg.TEAcknowledgeRequest = DSI_TE_ACKNOWLEDGE_DISABLE;
 if (HAL_DSI_ConfigAdaptedCommandMode(&hdsi, &CmdCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_DSI_SetGenericVCID(&hdsi, 0) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN DSIHOST_Init 2 */
 
 /* USER CODE END DSIHOST_Init 2 */
 
}

LTDC :

static void MX_LTDC_Init(void)
{
 
 /* USER CODE BEGIN LTDC_Init 0 */
 
 /* USER CODE END LTDC_Init 0 */
 
 LTDC_LayerCfgTypeDef pLayerCfg = {0};
 
 /* USER CODE BEGIN LTDC_Init 1 */
 
 /* USER CODE END LTDC_Init 1 */
 hltdc.Instance = LTDC;
 hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
 hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
 hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
 hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
 hltdc.Init.HorizontalSync = 0;
 hltdc.Init.VerticalSync = 0;
 hltdc.Init.AccumulatedHBP = 0;
 hltdc.Init.AccumulatedVBP = 0;
 hltdc.Init.AccumulatedActiveW = 320;
 hltdc.Init.AccumulatedActiveH = 360;
 hltdc.Init.TotalWidth = 320;
 hltdc.Init.TotalHeigh = 360;
 hltdc.Init.Backcolor.Blue = 0;
 hltdc.Init.Backcolor.Green = 0;
 hltdc.Init.Backcolor.Red = 0;
 if (HAL_LTDC_Init(&hltdc) != HAL_OK)
 {
 Error_Handler();
 }
 pLayerCfg.WindowX0 = 0;
 pLayerCfg.WindowX1 = 320;
 pLayerCfg.WindowY0 = 0;
 pLayerCfg.WindowY1 = 360;
 pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
 pLayerCfg.Alpha = 0;
 pLayerCfg.Alpha0 = 0;
 pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
 pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
 pLayerCfg.FBStartAdress = 0xC0000000;
 pLayerCfg.ImageWidth = 320;
 pLayerCfg.ImageHeight = 360;
 pLayerCfg.Backcolor.Blue = 0;
 pLayerCfg.Backcolor.Green = 0;
 pLayerCfg.Backcolor.Red = 0;
 if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN LTDC_Init 2 */
 
 /* USER CODE END LTDC_Init 2 */
 
}

additional comments:

  1. I use HAL_DSI_Start(&hdsi); when I initialize display.
  2. I tried to initialize SDRAM in M7 and M4 without any change.
  3. I checked my SDRAM and it seems to work.
  4. On my STM32F778AI I also use external ram for display

Is there anything that I forget?

I need to use MDMA?

Thanks,

David

This topic has been closed for replies.

1 reply

davidra7
davidra7Author
Associate III
May 26, 2020

Small update:

If I migrate this code to M7 code it is working... But not working on M4.