STM32F407VET6的FSMC配置LCD(7789)

/************************************FSMC配置***********************************************/

SRAM_HandleTypeDef hsram1;

void MX_FSMC_Init(void)
{
  FSMC_NORSRAM_TimingTypeDef readWriteTiming = {0};
  FSMC_NORSRAM_TimingTypeDef writeTiming = {0};
    
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;//使用NE1
  hsram1.Init.DataAddressMux= FSMC_DATA_ADDRESS_MUX_DISABLE;//地址/数据线不复用
  hsram1.Init.MemoryType= FSMC_MEMORY_TYPE_SRAM;//SRAM
  hsram1.Init.MemoryDataWidth= FSMC_NORSRAM_MEM_BUS_WIDTH_16;//16位数据宽度
  hsram1.Init.BurstAccessMode= FSMC_BURST_ACCESS_MODE_DISABLE;//是否使能突发访问,仅对同步突发存储器有效,此处未用到
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
  hsram1.Init.WrapMode= FSMC_WRAP_MODE_DISABLE;//自动换行模式:关闭
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;//存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
  hsram1.Init.WriteOperation= FSMC_WRITE_OPERATION_ENABLE;//存储器写使能
  hsram1.Init.WaitSignal= FSMC_WAIT_SIGNAL_DISABLE;//等待使能位,此处未用到
  hsram1.Init.ExtendedMode= FSMC_EXTENDED_MODE_ENABLE;//读写使用不同的时序
  hsram1.Init.AsynchronousWait= FSMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;//禁止突发写
  hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
    
    /*FMC读时序控制寄存器*/
    readWriteTiming.AddressSetupTime= 0x0F;    //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns
    readWriteTiming.AddressHoldTime= 0;
    readWriteTiming.DataSetupTime= 60;        //数据保存时间为60个HCLK    =6*60=360ns
    readWriteTiming.AccessMode= FSMC_ACCESS_MODE_A;    //模式A
    /*FMC写时序控制寄存器*/
    writeTiming.BusTurnAroundDuration= 0;        //总线周转阶段持续时间为0,此变量不赋值的话会莫名其妙的自动修改为4。导致程序运行正常
    writeTiming.AddressSetupTime= 9;        //地址建立时间(ADDSET)为9个HCLK =54ns 
    writeTiming.AddressHoldTime= 0;
    writeTiming.DataSetupTime= 8;        //数据保存时间为6ns*9个HCLK=54n
    writeTiming.AccessMode= FSMC_ACCESS_MODE_A; //模式A

  if(HAL_SRAM_Init(&hsram1, &readWriteTiming, &writeTiming) != HAL_OK)
  {
    Error_Handler( );
  }
}

static uint32_t FSMC_Initialized = 0;

static void HAL_FSMC_MspInit(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(FSMC_Initialized) 
    {
    return;
  }
  FSMC_Initialized = 1;

  __HAL_RCC_FSMC_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_FSMC;    
    
  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;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);


  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7
                                                |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_14
                                                |GPIO_PIN_15;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}

void HAL_SRAM_MspInit(SRAM_HandleTypeDef* sramHandle)
{
  HAL_FSMC_MspInit();
}

static uint32_t FSMC_DeInitialized = 0;

static void HAL_FSMC_MspDeInit(void)
{
  if(FSMC_DeInitialized) 
    {
    return;
  }
  FSMC_DeInitialized = 1;
  __HAL_RCC_FSMC_CLK_DISABLE();

  HAL_GPIO_DeInit(GPIOE, 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_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7
                                                |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_14
                                                |GPIO_PIN_15);
}

void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* sramHandle)
{
  HAL_FSMC_MspDeInit();
}

/*********************************************LCD配置*****************************************************/
//LCD地址结构体
typedef struct
{
    volatile u16 LCD_REG;
    volatile u16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,A16作为数据命令区分线 
//注意设置时STM32内部会右移一位对其!                 
#define LCD_BASE        ((u32)(0x60000000 | 0x0001FFFE))     
#define LCD             ((LCD_TypeDef *) LCD_BASE)


/*
* 描述: LCD芯片初始化
* 参数: 无
* 返回: 无*/
void LCD_GPIO_Init(void)
{    
    GPIO_InitTypeDef  GPIO_InitStruct;
    
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    
    //背光灯
  GPIO_InitStruct.Pin = LCD_BG_GPIO_PIN;
  HAL_GPIO_Init(LCD_BG_GPIO, &GPIO_InitStruct);    
    
    HAL_GPIO_WritePin(LCD_BG_GPIO, LCD_BG_GPIO_PIN, GPIO_PIN_RESET); //背光关
    //复位引脚
  GPIO_InitStruct.Pin = LCD_RST_GPIO_PIN;
  HAL_GPIO_Init(LCD_RST_GPIO, &GPIO_InitStruct);        
    
    HAL_GPIO_WritePin(LCD_RST_GPIO, LCD_RST_GPIO_PIN, GPIO_PIN_RESET);    
    
    MX_FSMC_Init();
}
/*
* 描述: LCD背光灯 开
* 参数: 无
* 返回: 无*/
void LCD_BG_ON(void)
{
    HAL_GPIO_WritePin(LCD_BG_GPIO, LCD_BG_GPIO_PIN, GPIO_PIN_SET); 
}
/*
* 描述: LCD背光灯 开
* 参数: 无
* 返回: 无*/
void LCD_BG_OFF(void)
{
  HAL_GPIO_WritePin(LCD_BG_GPIO, LCD_BG_GPIO_PIN, GPIO_PIN_RESET); 
}
/*
* 描述: 写LCD寄存器地址
* 参数: 无
* 返回: 无*/
void LCD_WR_REG(volatile u16 LCD_Reg)     
{    
    LCD_Reg = LCD_Reg;
    LCD->LCD_REG=LCD_Reg;//写入要写的寄存器序号        
}
/*
* 描述: 写LCD数据
* 参数: 无
* 返回: 无*/
void LCD_WR_DATA(volatile u16 LCD_RegValue)
{
    LCD_RegValue = LCD_RegValue;
    LCD->LCD_RAM=LCD_RegValue;        
}

//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
    volatile u16 ram;            //防止被优化
    ram=LCD->LCD_RAM;    
    return ram;     
}
/*
* 描述: 配置寄存器
* 参数: 无
* 返回: 无*/
void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)
{
  LCD->LCD_REG=LCD_Reg;
  LCD->LCD_RAM=LCD_RegValue;         
}
/*
* 描述: 写wramcmd命令
* 参数: 无
* 返回: 无*/
void LCD_WriteRAM_Prepare(void)
{
  LCD_WR_REG(lcddev.wramcmd);      
}
/*
* 描述: LCD复位
* 参数: 无
* 返回: 无*/
void LCD_Reset(void)
{
  HAL_GPIO_WritePin(LCD_RST_GPIO,LCD_RST_GPIO_PIN,GPIO_PIN_SET); //
  HAL_Delay(10);
  HAL_GPIO_WritePin(LCD_RST_GPIO,LCD_RST_GPIO_PIN,GPIO_PIN_RESET); //
  HAL_Delay(50);
  HAL_GPIO_WritePin(LCD_RST_GPIO,LCD_RST_GPIO_PIN,GPIO_PIN_SET); //
  HAL_Delay(150);
}
/*
* 描述: LCD相关参数命令初始化
* 参数: 无
* 返回: 无*/
void LCD_SetParam(void)
{     
  lcddev.wramcmd=0x2C;
  lcddev.dir=0;//                      
  lcddev.width=240;
  lcddev.height=320;
  lcddev.setxcmd=0x2A;
  lcddev.setycmd=0x2B;    
  LCD_WriteReg(0x36,0x0A);  //屏幕刷新方向
}
/*
* 描述: LCD初始化
* 参数: 无
* 返回: 无*/
void LCD_Init(void)
{
  LCD_GPIO_Init();
  LCD_Reset(); //
//     
//    //尝试9341 ID的读取        
//    LCD_WR_REG(0X04);                   
//    lcddev.id=LCD_RD_DATA();    //dummy read     
//    lcddev.id=LCD_RD_DATA();    //读到0X00
//    lcddev.id=LCD_RD_DATA();       //读取93                                   
//    lcddev.id<<=8;
//    lcddev.id|=LCD_RD_DATA();      //读取41     
    
    LCD_WR_REG(0x11);
    HAL_Delay(120);

    LCD_WR_REG(0x36);
    LCD_WR_DATA(0x00);


    LCD_WR_REG(0x3A);
    LCD_WR_DATA(0X05);

    LCD_WR_REG(0xB2);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x33);
    LCD_WR_DATA(0x33);

    LCD_WR_REG(0xB7);
    LCD_WR_DATA(0x35);

    LCD_WR_REG(0xBB);       //vcom
    LCD_WR_DATA(0x32);      //30

    LCD_WR_REG(0xC0);
    LCD_WR_DATA(0x0C);

    LCD_WR_REG(0xC2);
    LCD_WR_DATA(0x01);

    LCD_WR_REG(0xC3);       //vrh
    LCD_WR_DATA(0x10);      //17 0D

    LCD_WR_REG(0xC4);       //vdv
    LCD_WR_DATA(0x20);      //20

    LCD_WR_REG(0xC6);
    LCD_WR_DATA(0x0f);

    LCD_WR_REG(0xD0);
    LCD_WR_DATA(0xA4);
    LCD_WR_DATA(0xA1);

    LCD_WR_REG(0xE0);       //Set Gamma
    LCD_WR_DATA(0xd0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x07);
    LCD_WR_DATA(0x0a);
    LCD_WR_DATA(0x28);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0X44);
    LCD_WR_DATA(0x42);
    LCD_WR_DATA(0x06);
    LCD_WR_DATA(0x0e);
    LCD_WR_DATA(0x12);
    LCD_WR_DATA(0x14);
    LCD_WR_DATA(0x17);

    LCD_WR_REG(0XE1);       //Set Gamma
    LCD_WR_DATA(0xd0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x07);
    LCD_WR_DATA(0x0a);
    LCD_WR_DATA(0x28);
    LCD_WR_DATA(0x31);
    LCD_WR_DATA(0x54);
    LCD_WR_DATA(0x47);
    LCD_WR_DATA(0x0e);
    LCD_WR_DATA(0x1c);
    LCD_WR_DATA(0x17);
    LCD_WR_DATA(0x1b);
    LCD_WR_DATA(0x1e);

    LCD_WR_REG(0x2A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xef);

    LCD_WR_REG(0x2B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0x3f);
    
    HAL_Delay(120);
    LCD_WR_REG(0x29);       //display on
  
        
  LCD_SetParam();// 设置屏幕控制相关参数
    LCD_BG_ON();    //背光灯关闭
    
    LCD_ClearALL(BRED);
}
 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值