TFT дисплей и STM32F4

Кто любит RISC в жизни, заходим, не стесняемся.
ImScout
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Вт июн 23, 2015 18:05:12

Re: TFT дисплей и STM32F4

Сообщение ImScout »

Настроил дисплей, Но проблема в слудующем:
После инициализации экран закрышен Синим и все. Что бы я не писал в SDRAM ничего не меняется и не происходит.
Помогите, пожалуйста.
Сам код инициализации:

Код: Выделить всё

/* SDRAM DEFINES */ 
#define SDRAM_BASE			0xD0000000
#define SDRAM_SIZE			0x00800000

#define TMRD(x) 				(x << 0)  	/* Load Mode Register to Active */
#define TXSR(x) 				(x << 4) 	 	/* Exit Self-refresh delay */
#define TRAS(x) 				(x << 8)  	/* Self refresh time */
#define TRC(x)  				(x << 12) 	/* Row cycle delay */
#define TWR(x)  				(x << 16) 	/* Recovery delay */
#define TRP(x)  				(x << 20) 	/* Row precharge delay */
#define TRCD(x)					(x << 24) 	/* Row to column delay */

/* LCD-TFT DEFINES */ 
#define	LCD_WIDTH				240		/* Width */
#define	LCD_HEIGHT			320		/* Height */

#define	HBP							4			/* Horizontal back porch 4*/
#define	HSYNC						8			/* HSync 8*/
#define	HFP							4			/* Horizontal front porch 4*/

#define VBP							1			/* Vertical back porch1 */
#define	VSYNC						2			/* VSync2 */
#define	VFP							1			/* Vertical front porch1 */

#define ACTIVE_W (HSYNC + LCD_WIDTH + HBP - 1)
#define ACTIVE_H (VSYNC + LCD_HEIGHT + VBP - 1)

#define TOTAL_WIDTH  (HSYNC + HBP + LCD_WIDTH + HFP - 1)
#define TOTAL_HEIGHT (VSYNC + VBP + LCD_HEIGHT + VFP - 1)

#define PIXEL_WIDHT 2

void SDRAM_Configuration(void) {

	volatile uint32_t ptr = 0;
	volatile uint32_t i = 0;

	RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;	
	// Initialization step 1
	FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1  | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE_1;
	FMC_Bank5_6->SDCR[1] = FMC_SDCR1_NR_0	  | FMC_SDCR1_MWID_0 | FMC_SDCR1_NB | FMC_SDCR1_CAS;
	// Initialization step 2
	FMC_Bank5_6->SDTR[0] = TRC(7)  | TRP(2);
	FMC_Bank5_6->SDTR[1] = TMRD(2) | TXSR(7) | TRAS(4) | TWR(2) | TRCD(2);
	// Initialization step 3	
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	FMC_Bank5_6->SDCMR 	 = 1 | FMC_SDCMR_CTB2 | (1 << 5);
	// Initialization step 4
	for(i = 0; i  < 1000000; i++);
	// Initialization step 5
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	FMC_Bank5_6->SDCMR 	 = 2 | FMC_SDCMR_CTB2 | (1 << 5);
	// Initialization step 6
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	FMC_Bank5_6->SDCMR 	 = 3 | FMC_SDCMR_CTB2 | (4 << 5);	
	// Initialization step 7
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	FMC_Bank5_6->SDCMR 	 = 4 | FMC_SDCMR_CTB2 | (1 << 5) | (0x231 << 9);
	// Initialization step 8
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	FMC_Bank5_6->SDRTR |= (683 << 1);
	while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	// Clear SDRAM
	//for(ptr = SDRAM_BASE; ptr < (SDRAM_BASE + SDRAM_SIZE); ptr += 4)
	//		*((uint32_t *)ptr) = 0x00000000;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* Function Name  : LTDC_Configuration
* Description    : Setting LTDC for LCD TFT
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
void LTDC_Configuration(void) {

	RCC->APB2ENR |= RCC_APB2ENR_LTDCEN;
	//RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN;
	
	RCC_PLLSAIConfig(320,4,4);	
	RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div16);
	RCC_PLLSAICmd(ENABLE); // Enable PLLSAI Clock 
	while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET){}

	LTDC->SSCR 			= ((HSYNC - 1) << 16) 	| (VSYNC - 1);
	LTDC->BPCR 			= ((HBP - 1) << 16) 	| (VBP - 1);
	LTDC->AWCR 			= (ACTIVE_W << 16) 		| (ACTIVE_H);
	LTDC->TWCR 			= (TOTAL_WIDTH << 16) 	| (TOTAL_HEIGHT);
		
	LTDC_Layer1->WHPCR  = (HBP + HSYNC) | ((HBP + HSYNC + LCD_WIDTH - 1) << 16);
	LTDC_Layer1->WVPCR  = VBP + VSYNC | ((VBP + VSYNC + LCD_HEIGHT - 1) << 16);
	LTDC_Layer1->PFCR   = 2;
	LTDC_Layer1->CFBAR  = SDRAM_BASE;
	LTDC_Layer1->CFBLR  = ((LCD_WIDTH * PIXEL_WIDHT) << 16) | ((LCD_WIDTH * PIXEL_WIDHT) + 3);
	LTDC_Layer1->CR 	= LTDC_LxCR_LEN;
		
	//LTDC->BCCR			= 0xFF0000;
	LTDC->SRCR 			= LTDC_SRCR_IMR;
	LTDC->GCR  			= LTDC_GCR_LTDCEN;

}

void UB_SDRAM_Write16b(uint32_t adr, uint16_t wert)
{
  *(uint16_t*) (SDRAM_BASE + adr) = wert;
}

uint16_t UB_SDRAM_Read16b(uint32_t adr)
{
  uint16_t ret_wert=0;

  ret_wert = *(__IO uint16_t*)(SDRAM_BASE + adr);

  return(ret_wert);
}

Реклама
Ответить

Вернуться в «ARM»