На примере F429 дискавери
украден здесь http://en.radzio.dxp.pl/stm32f429idiscovery/
Инит SDRAM можно брать сразу, полностью рабочий .
Работа с SDRAM :
// SDRAM base address for Bank 2 #define SDRAM_BASE 0xD0000000 // SDRAM size is 8MB #define SDRAM_SIZE 0x00800000
Инит LTDC пришлось переписывать ибо в их примере внешний 640x480.
А на дискавирине еще и рулить дисплеем надо через SPI
Что изменилось:
Тайминги синхро LCD -
#define LCD_WIDTH 240 #define LCD_HEIGHT 320 #define HFP 10 #define HSYNC 10 #define HBP 20 #define VFP 4 #define VSYNC 2 #define VBP 2 #define ACTIVE_W (HSYNC + LCD_WIDTH + HBP - 1) #define ACTIVE_H (VSYNC + LCD_HEIGHT + VBP - 1) #define DISP_ACCUM_HORIZ_BACKPORCH (HSYNC + HBP - 1) #define DISP_ACCUM_VERT_BACKPORCH (VSYNC + VBP - 1) #define TOTAL_WIDTH (HSYNC + HBP + LCD_WIDTH + HFP - 1) #define TOTAL_HEIGHT (VSYNC + VBP + LCD_HEIGHT + VFP - 1)
Тактирование LCD
#define PLLSAI_N 192 /* Multiplier for input clock (which is HSE/M) */ #define PLLSAI_R 4 /* Divider 1; /4 */ #define PLLSAI_DIVR 2 /* Divider 2; 0=/2, 1=/4, 2=/8, 3=/16 */ #define PLLSAI_Q 4 RCC->PLLSAICFGR = (PLLSAI_N << 6) | (PLLSAI_Q << 24) | (PLLSAI_R << 28); RCC->DCKCFGR = (RCC->DCKCFGR & (~RCC_DCKCFGR_PLLSAIDIVR)) | (PLLSAI_DIVR << 16); /* Enable SAI PLL */ RCC->CR |= RCC_CR_PLLSAION; /* wait for SAI PLL ready */ while((RCC->CR & RCC_CR_PLLSAIRDY) == 0){};
Конфиг окна
/* Synchronization Size Configuration */ LTDC->SSCR = ((HSYNC - 1) << 16) | (VSYNC - 1); /* Back Porch Configuration */ LTDC->BPCR = (((HSYNC+HBP) - 1) << 16) | ((VSYNC+VBP) - 1); /* Active Width Configuration */ LTDC->AWCR = (ACTIVE_W << 16) | (ACTIVE_H); /* Total Width Configuration */ LTDC->TWCR = (TOTAL_WIDTH << 16) | (TOTAL_HEIGHT);
Конфиг слоя 1.
/* Pixel Format Configuration */ LTDC_Layer1->PFCR = 2; /* Window Horizontal Position Configuration */ LTDC_Layer1->WHPCR = ((DISP_ACCUM_HORIZ_BACKPORCH + LCD_WIDTH) << 16) | (DISP_ACCUM_HORIZ_BACKPORCH+1); LTDC_Layer1->WVPCR = ((DISP_ACCUM_VERT_BACKPORCH + LCD_HEIGHT) << 16) | (DISP_ACCUM_VERT_BACKPORCH+1); /* Color Frame Buffer Address */ LTDC_Layer1->CFBAR = SDRAM_BASE; /* Color Frame Buffer Length */ LTDC_Layer1->CFBLR = ((LCD_WIDTH * PIXELWIDHT) << 16) | ((LCD_WIDTH * PIXELWIDHT) + 3); /* Enable Layer */ LTDC_Layer1->CFBLNR = LCD_HEIGHT; LTDC_Layer1->CR |= LTDC_LxCR_LEN; // Enable layer1 /* Immediate Reload */ LTDC->SRCR = LTDC_SRCR_IMR; /* Enable LTDC */ LTDC->GCR = LTDC_GCR_LTDCEN;
Пока застолблю , описание и чистка потом