2024-01-18 04:25 PM
Hi,
I have a Nucleo-U5A5ZJ-Q board which i replace the mcu with a STM32U5A9ZJT6.
I'm trying to use LTDC to control a 800x480 LCD (WF50FTYAGDNN0#) via RGB888.
Eventually running touchgfx, but I have fallen over at the first hurdle.
I have read many tutorials and forum posts and no one seems to have the same issue as me.
I started a blank project and followed this
https://support.touchgfx.com/docs/development/board-bring-up/how-to/03-display-internal
But my display remains a black screen, I then probed PD3 (LTDC_CLK) where I expected the 25Mhz clock signal that was configured, but saw nothing.
I also tried switching the pins "Max output speed" to Very High as I saw somewhere that this was required.
I then switched PD3 to GPIO_Output and toggled it to make sure connections are correct.
Is there something wrong with my clock setup? I tried a test of toggling a pin in the while loop with a 1ms delay and the scope says a full cycle took 4ms instead of the expected 2ms... but then I set the delay to 10ms and eveything is as expected on the scope.
Note about the display: it doesn't have Hsync and Vsync lines I assume this means it is permanently in DE mode and I can leave those pins floating from the mcu?
Any help would really be appreciated as I have been going at this for a couple of days now.
Solved! Go to Solution.
2024-01-20 03:18 PM
@STOne-32 is it possible this could have been fused like the U5A5 with the LTDC disabled? All peripheral registers are presenting as stuck-at-zero
@PhilipC can you provide a clear picture of the top markings of the IC you mounted.
2024-01-19 12:35 PM - edited 2024-01-19 12:37 PM
I observed the registers as i stepped through the HAL_LTDC_Init() and none of the LTDC registers are being updated, so LTDC is never setup nor enabled as they aren't being written to... what could cause this?
The init vars do have the cubemx values in them
2024-01-19 12:59 PM
Make sure the LTDC clock is explicitly enabled in the RCC
LTDCEN in RCC_APB2ENR
2024-01-19 01:21 PM
Yes, this is set.
2024-01-19 01:50 PM
And all the registers are still stuck-at-zero?
There's an AHB clock, and an LCD_CLK, but the APB one is supposed to allow for register access.
Check the chip identifications
printf("CPUID %08X DEVID %03X REVID %04X\n", SCB->CPUID, DBGMCU->IDCODE & 0xFFF, (DBGMCU->IDCODE >> 16) & 0xFFFF);
2024-01-19 02:06 PM
Yes, LTDC registers still stuck on 0.
Sorry, I don't know what these IDs are for.
CPUID 410FD214 DEVID 481 REVID 3001
2024-01-19 02:25 PM
Establishing what core/step you have, to relate to the issue or errata
0x481: STM32U59x/5Ax, 0x3001: revision X
And your HAL_LTDC_MspInit() looks materially similar to
/**
* @brief LTDC MSP Initialization
* This function configures the hardware resources used in this example
* @PAram hltdc: LTDC handle pointer
* @retval None
*/
void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc)
{
if(hltdc->Instance==LTDC)
{
/* USER CODE BEGIN LTDC_MspInit 0 */
/* USER CODE END LTDC_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LTDC_CLK_ENABLE();
/* LTDC interrupt Init */
HAL_NVIC_SetPriority(LTDC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LTDC_IRQn);
HAL_NVIC_SetPriority(LTDC_ER_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LTDC_ER_IRQn);
/* USER CODE BEGIN LTDC_MspInit 1 */
/* USER CODE END LTDC_MspInit 1 */
}
}
2024-01-19 02:32 PM
Mine has got the GPIO setup in it aswell but yeah.
I also tried adding restart and release after the clk enable but made no difference.
void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hltdc->Instance==LTDC)
{
/* USER CODE BEGIN LTDC_MspInit 0 */
/* USER CODE END LTDC_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInit.LtdcClockSelection = RCC_LTDCCLKSOURCE_PLL2;
PeriphClkInit.PLL2.PLL2Source = RCC_PLLSOURCE_HSE;
PeriphClkInit.PLL2.PLL2M = 1;
PeriphClkInit.PLL2.PLL2N = 9;
PeriphClkInit.PLL2.PLL2P = 2;
PeriphClkInit.PLL2.PLL2Q = 2;
PeriphClkInit.PLL2.PLL2R = 6;
PeriphClkInit.PLL2.PLL2RGE = RCC_PLLVCIRANGE_1;
PeriphClkInit.PLL2.PLL2FRACN = 3072.0;
PeriphClkInit.PLL2.PLL2ClockOut = RCC_PLL2_DIVR;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/* Peripheral clock enable */
__HAL_RCC_LTDC_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**LTDC GPIO Configuration
PE2 ------> LTDC_R0
PE3 ------> LTDC_R1
PE4 ------> LTDC_B0
PE5 ------> LTDC_G0
PE6 ------> LTDC_G1
PF13 ------> LTDC_B1
PE7 ------> LTDC_B6
PE8 ------> LTDC_B7
PE9 ------> LTDC_G2
PE10 ------> LTDC_G3
PE11 ------> LTDC_G4
PE12 ------> LTDC_G5
PE13 ------> LTDC_G6
PE14 ------> LTDC_G7
PE15 ------> LTDC_R2
PD8 ------> LTDC_R3
PD9 ------> LTDC_R4
PD10 ------> LTDC_R5
PD11 ------> LTDC_R6
PD12 ------> LTDC_R7
PD14 ------> LTDC_B2
PD15 ------> LTDC_B3
PD0 ------> LTDC_B4
PD1 ------> LTDC_B5
PD3 ------> LTDC_CLK
PD6 ------> LTDC_DE
PE0 ------> LTDC_HSYNC
PE1 ------> LTDC_VSYNC
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13
|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_LTDC;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_LTDC;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0
|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_LTDC;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* LTDC interrupt Init */
HAL_NVIC_SetPriority(LTDC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LTDC_IRQn);
HAL_NVIC_SetPriority(LTDC_ER_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(LTDC_ER_IRQn);
/* USER CODE BEGIN LTDC_MspInit 1 */
/* USER CODE END LTDC_MspInit 1 */
}
}
2024-01-20 03:02 AM - edited 2024-01-20 04:33 AM
I tried the following and LTDC register will not accept anything.
LTDCRST = 0
LTDCEN = 1
while (1)
{
/* USER CODE END WHILE */
temp = LTDC->GCR;
LTDC->GCR = 1;
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Could it be something with my clock setup?
I added an I2C peripherial and after MX_I2C1_Init() i can see values in the I2C registers, but nothing for LTDC...
2024-01-20 12:35 PM
So, which one is it, PLL2 or PLL3?
Read out and check/post relevant RCC registers content.
JW