Question
Problem with DMA on STM32H743IIT6 + IS42S16160J + lcd 800x480 module
environment
STM32H743IIT6 FK743M2-IIT6
SRAM IS42S16160J External 16-bit 32M byte SDRAM
External QSPI driver W25Q64
LCD 4.3” RGB043M2-800*480*VI1.2

I have 2 problems with this module
- if I write a line on line y = 0 ok but if y = 10 see wrong lcd output with many pixels blink
-

if I use the DMA to write on lcd no output
If I use 0x24000000 instead of 0xC0000000 like FRAMEBUFFER_ADDRESS both lines are ok but the 0x24000000 address cannot be used to fill oll the 800x480 lcb area
Consider that this BSP_LCD_Clear() is able to fill alll the lcd area without problems.
void BSP_LCD_Clear(uint32_t Color)
{
uint32_t index = 0;
// Estrae i componenti R, G, B dal colore a 32-bit
uint8_t r = (Color >> 16) & 0xFF;
uint8_t g = (Color >> 8) & 0xFF;
uint8_t b = Color & 0xFF;
// Converte in RGB565 (16-bit)
uint16_t color16 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
volatile uint16_t *pFB = (uint16_t *)0xC0000000;
for(index = 0; index < (800 * 480); index++)
{
pFB[index] = color16;
}
}
int main(void)
{
__HAL_RCC_GPIOH_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET); // LED acceso fisso durante l'init
__HAL_RCC_LTDC_FORCE_RESET();
__HAL_RCC_FMC_FORCE_RESET();
for(volatile uint32_t i = 0; i < 10000; i++);
__HAL_RCC_LTDC_RELEASE_RESET();
__HAL_RCC_FMC_RELEASE_RESET();
HAL_Init();
HAL_Delay(200);
SystemClock_Config();
MPU_Config();
MX_GPIO_Init();
MX_DMA2D_Init();
MX_FMC_Init();
HAL_Delay(50);
// 5. Configurazione LED Blu (PH7)
__HAL_RCC_GPIOH_CLK_ENABLE();
//GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_SET);
// 6. Configurazione Retroilluminazione LCD (PH6)
// Nota: Ricorda che il pin VLED sullo schema richiede 5V hardware
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_SET); // Backlight ON
// Configurazione pin di Reset LCD (PH4)
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// Sequenza di reset hardware del display
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_SET); // Rilascia il reset
HAL_Delay(50);
// Sequenza di reset hardware del display
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_SET);
HAL_Delay(100); // Attendi che il pannello LCD si avvii internamente
MX_LTDC_Init();
BSP_LCD_Init();
BSP_LCD_SelectLayer(0);
BSP_LCD_SetLayerVisible(0, ENABLE);
BSP_LCD_Clear(0xFFFF0000); // Schermo Rosso
HAL_Delay(1000);
BSP_LCD_Clear(0xFF00FF00); // Schermo Verde
HAL_Delay(1000);
BSP_LCD_Clear(0xFF0000FF); // Schermo Blu
HAL_Delay(1000);
BSP_LCD_Clear(0xFF000000);
BSP_LCD_DrawPixel(0, 0, 0xFFFF);
BSP_LCD_DrawPixel(1, 0, 0xFFFF);
BSP_LCD_DrawPixel(2, 0, 0xFFFF);
BSP_LCD_DrawPixel(3, 0, 0xFFFF);
BSP_LCD_DrawPixel(4, 0, 0xFFFF);
BSP_LCD_DrawPixel(5, 0, 0xFFFF);
BSP_LCD_DrawPixel(6, 0, 0xFFFF);
HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_IMMEDIATE);
BSP_LCD_DrawPixel(0, 10, 0xFFFF);
BSP_LCD_DrawPixel(1, 10, 0xFFFF);
BSP_LCD_DrawPixel(2, 10, 0xFFFF);
BSP_LCD_DrawPixel(3, 10, 0xFFFF);
BSP_LCD_DrawPixel(4, 10, 0xFFFF);
BSP_LCD_DrawPixel(5, 10, 0xFFFF);
BSP_LCD_DrawPixel(6, 10, 0xFFFF);
HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_IMMEDIATE);
while (1)
{
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);
}
}
void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t Color)
{
if (Xpos >= 800 || Ypos >= 480) return;
uint8_t r = (Color >> 16) & 0xFF;
uint8_t g = (Color >> 8) & 0xFF;
uint8_t b = Color & 0xFF;
uint16_t color16 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
volatile uint16_t *pFB = (volatile uint16_t *)0xC0000000;
// Scrittura diretta senza sovraccarichi
pFB[((uint32_t)Ypos * 800) + Xpos] = color16;
}
static void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct = {0};
HAL_MPU_Disable();
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = FRAMEBUFFER_ADDRESS;
MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; // Modificato per consentire il caching corretto sulla SDRAM
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; // Abilitato
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; // Abilitato
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; // ex MPU_TEX_LEVEL0
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
void SystemClock_Config(void)
{
// Spegni preventivamente il PLL3 per pulire lo stato a caldo
__HAL_RCC_PLL3_DISABLE();
while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) != RESET) {}
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 4;
RCC_OscInitStruct.PLL.PLLN = 8;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
// Configurazione del PLL3 per generare il Pixel Clock dell'LTDC (~26.6 MHz)
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLL3.PLL3M = 4;
PeriphClkInitStruct.PLL3.PLL3N = 50;
PeriphClkInitStruct.PLL3.PLL3P = 2;
PeriphClkInitStruct.PLL3.PLL3Q = 2;
PeriphClkInitStruct.PLL3.PLL3R = 30; // Pixel Clock = ~26.6 MHz
PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;
PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_PLL3_ENABLE();
while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) == RESET) {}
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Abilita i clock per tutte le porte GPIO e per l'LTDC
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_LTDC_CLK_ENABLE();
__HAL_RCC_FMC_CLK_ENABLE(); // <-- FONDAMENTALE PER LA SDRAM
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
// --- CLOCK, SYNC & DE ---
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // CLK (PG7)
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); // VS (PI9), HS (PI10)
GPIO_InitStruct.Pin = GPIO_PIN_10;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); // DE (PF10)
// --- RED (R1 - R7) ---
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// --- GREEN (G0 - G7) ---
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
// --- BLUE (B1 - B7) ---
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
// Abilita il clock FMC
__HAL_RCC_FMC_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
// GPIOD
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 |
GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// GPIOE
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | 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;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
// GPIOF
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 |
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
// GPIOG
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 |
GPIO_PIN_8 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// GPIOH
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
}
static void MX_LTDC_Init(void)
{
LTDC_LayerCfgTypeDef pLayerCfg = {0};
__HAL_RCC_LTDC_CLK_ENABLE();
__DSB();
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_IIPC;
#define HBP 80
#define VBP 40
#define HSW 1
#define VSW 1
#define HFP 190
#define VFP 22
#define LCD_Width 800
#define LCD_Height 480
#define LCD_Pixels 800*480
//#define LCD_MemoryAdd 0xD0000000
hltdc.Init.HorizontalSync = HSW - 1;
hltdc.Init.VerticalSync = VSW -1 ;
hltdc.Init.AccumulatedHBP = HBP + HSW -1;
hltdc.Init.AccumulatedVBP = VBP + VSW -1;
hltdc.Init.AccumulatedActiveW = LCD_Width + HSW + HBP -1;
hltdc.Init.AccumulatedActiveH = LCD_Height + VSW + VBP -1;
hltdc.Init.TotalWidth = LCD_Width + HSW + HBP + HFP - 1;
hltdc.Init.TotalHeigh = LCD_Height + VSW + VBP + VFP - 1;
hltdc.Init.Backcolor.Blue = 0;
hltdc.Init.Backcolor.Green = 0;
hltdc.Init.Backcolor.Red = 0;
if (HAL_LTDC_Init(&hltdc) != HAL_OK)
{
Error_Handler();
}
// Configurazione unica e pulita del Layer 0
pLayerCfg.WindowX0 = 0;
pLayerCfg.WindowX1 = LCD_Width - 1;
pLayerCfg.WindowY0 = 0;
pLayerCfg.WindowY1 = LCD_Height - 1;
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
pLayerCfg.Alpha = 255;
pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
pLayerCfg.FBStartAdress = FRAMEBUFFER_ADDRESS;
pLayerCfg.ImageWidth = LCD_Width;
pLayerCfg.ImageHeight = LCD_Height;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;
if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
{
Error_Handler();
}
}
static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)
{
FMC_SDRAM_CommandTypeDef Command = {0};
// 1. Clock Enable Command
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(hsdram, &Command, 0xFFFF);
HAL_Delay(2);
// 2. Precharge All Command
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(hsdram, &Command, 0xFFFF);
// 3. Auto-Refresh Command (8 cicli)
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(hsdram, &Command, 0xFFFF);
// 4. Load Mode Register (0x220 = CAS 2, Burst Length 1, Sequential)
Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0x220;
HAL_SDRAM_SendCommand(hsdram, &Command, 0xFFFF);
// 5. Program Refresh Rate
HAL_SDRAM_ProgramRefreshRate(hsdram, 1386);
}
static void MX_FMC_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming = {0};
hsdram1.Instance = FMC_SDRAM_DEVICE;
hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
// Corretto per W9825G6KH (32MB): 9 bit colonna, 13 bit riga
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; // <-- CORRETTO A 13
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; // ex 2
SdramTiming.LoadToActiveDelay = 2;
SdramTiming.ExitSelfRefreshDelay = 7;
SdramTiming.SelfRefreshTime = 4;
SdramTiming.RowCycleDelay = 7;
SdramTiming.WriteRecoveryTime = 3;
SdramTiming.RPDelay = 2;
SdramTiming.RCDDelay = 2;
if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
{
Error_Handler();
}
SDRAM_Initialization_Sequence(&hsdram1);
}
static void MX_DMA2D_Init(void)
{
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_M2M;
//hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
hdma2d.Init.OutputOffset = 0;
// Configura il Layer 0 per corrispondere al Layer LTDC attivo
hdma2d.LayerCfg[0].InputOffset = 0;
//hdma2d.LayerCfg[0].InputColorMode = DMA2D_INPUT_ARGB8888;
hdma2d.LayerCfg[0].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[0].InputAlpha = 0;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA2D_ConfigLayer(&hdma2d, 0) != HAL_OK) // <-- Modificato a 0
{
Error_Handler();
}
}
