SFMC驱动LCD心得

  1. 硬件:神舟王STM32F439开发板,3.2寸320*240LCD液晶芯片ID8989.
  2. 接口为 16位数据,指令、数据切换A0。对于初始化如下:
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{	
  GPIO_InitTypeDef GPIO_InitStruct;
	__HAL_RCC_FMC_CLK_ENABLE();				//ʹÄÜFMCʱÖÓ
	__HAL_RCC_GPIOD_CLK_ENABLE();			//ʹÄÜGPIODʱÖÓ
	__HAL_RCC_GPIOE_CLK_ENABLE();			//ʹÄÜGPIOEʱÖÓ
	__HAL_RCC_GPIOF_CLK_ENABLE();			//ʹÄÜGPIOFʱÖÓ
		__HAL_RCC_GPIOG_CLK_ENABLE();			//ʹÄÜGPIOFʱÖÓ 
	/** FMC GPIO Configuration
  PF0   ------> FMC_A0
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE11   ------> FMC_D8
  PE12   ------> FMC_D9
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PD4   ------> FMC_NOE
  PD5   ------> FMC_NWE
  PG12   ------> FMC_NE4
  */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  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;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = 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_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;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
                          |GPIO_PIN_5;
  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;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_12;
  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;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}
  1. FMC配置如下,初始化需要慢速写入指令读取读取ID号:
	GPIO_InitTypeDef GPIO_Initure;
	FMC_NORSRAM_TimingTypeDef FMC_ReadWriteTim;
	FMC_NORSRAM_TimingTypeDef FMC_WriteTim;
    
	__HAL_RCC_GPIOC_CLK_ENABLE();			//¿ªÆôGPIOCʱÖÓ
	GPIO_Initure.Pin=GPIO_PIN_7;            //PB7,±³¹â¿ØÖÆ
	GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //ÍÆÍìÊä³ö
	GPIO_Initure.Pull=GPIO_PULLDOWN;          //ÉÏÀ­
	GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //¸ßËÙ
	HAL_GPIO_Init(GPIOC,&GPIO_Initure); 
    
	SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;                
	SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;    
    
	SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK4;     //ʹÓÃNE4
	SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //µØÖ·/Êý¾ÝÏß²»¸´ÓÃ
	SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;   //SRAM
	SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16λÊý¾Ý¿í¶È
	SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //ÊÇ·ñʹÄÜÍ»·¢·ÃÎÊ,½ö¶Ôͬ²½Í»·¢´æ´¢Æ÷ÓÐЧ,´Ë´¦Î´Óõ½
	SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//µÈ´ýÐźŵļ«ÐÔ,½öÔÚÍ»·¢Ä£Ê½·ÃÎÊÏÂÓÐÓÃ
	SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;   //´æ´¢Æ÷ÊÇÔڵȴýÖÜÆÚ֮ǰµÄÒ»¸öʱÖÓÖÜÆÚ»¹ÊǵȴýÖÜÆÚÆÚ¼äʹÄÜNWAIT
	SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //´æ´¢Æ÷дʹÄÜ
	SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;           //µÈ´ýʹÄÜλ,´Ë´¦Î´Óõ½
	SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //¶ÁдʹÓò»Í¬µÄʱÐò
	SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//ÊÇ·ñʹÄÜͬ²½´«ÊäģʽϵĵȴýÐźÅ,´Ë´¦Î´Óõ½
	SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //½ûֹͻ·¢Ð´
	SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
    
	//FMC¶ÁʱÐò¿ØÖƼĴæÆ÷
	FMC_ReadWriteTim.AddressSetupTime=0xFF;        //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ15¸öHCLK 1/180M*15=5.5ns*15=82.5ns
	FMC_ReadWriteTim.AddressHoldTime=0xFF;
	FMC_ReadWriteTim.DataSetupTime=0xFF;           //Êý¾Ý±£´æʱ¼ä(DATAST)Ϊ70¸öHCLK	=5.5*70=385ns
  FMC_ReadWriteTim.CLKDivision = 0;
  FMC_ReadWriteTim.DataLatency = 0;
	FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //ģʽA
	//FMCдʱÐò¿ØÖƼĴæÆ÷
	FMC_WriteTim.AddressSetupTime=0xFF;            //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ15¸öHCLK=82.5ns
	FMC_WriteTim.AddressHoldTime=0xFF;
	FMC_WriteTim.DataSetupTime=0xFF;               //Êý¾Ý±£´æʱ¼ä(DATAST)Ϊ5.5ns*15¸öHCLK=82.5ns
  FMC_WriteTim.CLKDivision = 0x0;
  FMC_WriteTim.DataLatency = 0x0;
	FMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //ģʽA
	HAL_SRAM_Init(&SRAM_Handler,&FMC_ReadWriteTim,&FMC_WriteTim);	
  1. 完成配置后重新写入时序控制寄存器数据:
	FMC_ReadWriteTim.AddressSetupTime=0x09;        //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ15¸öHCLK 1/180M*15=5.5ns*15=82.5ns
	FMC_ReadWriteTim.AddressHoldTime=0x0;
	FMC_ReadWriteTim.DataSetupTime=0x08;           //Êý¾Ý±£´æʱ¼ä(DATAST)Ϊ70¸öHCLK	=5.5*70=385ns
  FMC_ReadWriteTim.CLKDivision = 0;
  FMC_ReadWriteTim.DataLatency = 0;
	FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //ģʽA
	//FMCдʱÐò¿ØÖƼĴæÆ÷
	FMC_WriteTim.AddressSetupTime=0x09;            //µØÖ·½¨Á¢Ê±¼ä(ADDSET)Ϊ15¸öHCLK=82.5ns
	FMC_WriteTim.AddressHoldTime=0x00;
	FMC_WriteTim.DataSetupTime=0x08;               //Êý¾Ý±£´æʱ¼ä(DATAST)Ϊ5.5ns*15¸öHCLK=82.5ns
  FMC_WriteTim.CLKDivision = 0x0;
  FMC_WriteTim.DataLatency = 0x0;
	FMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //ģʽA
		  FMC_NORSRAM_Timing_Init(SRAM_Handler.Instance, &FMC_ReadWriteTim, SRAM_Handler.Init.NSBank); 
		FMC_NORSRAM_Extended_Timing_Init(SRAM_Handler.Extended, &FMC_WriteTim, SRAM_Handler.Init.NSBank,  SRAM_Handler.Init.ExtendedMode);  
  
  1. 完成。
    重点:读取ID需要慢速,负责读取为空。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值