/************************************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);
}