27,508
社区成员




void LCD_Init(void)
{
u16 i;
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
RCC->AHBENR|=1<<8; //??FSMC??
RCC->APB2ENR|=1<<0; //??PORTB??
RCC->APB2ENR|=1<<3; //??PORTB??
RCC->APB2ENR|=1<<5; //??PORTD??
RCC->APB2ENR|=1<<6; //??PORTE??
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE|RCC_APB2Periph_AFIO);//使能PORTB,D,E,G以及AFIO复用功能时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//PORTD复用推挽输出
GPIO_InitStructure.GPIO_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_13|GPIO_Pin_14|GPIO_Pin_15; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//PORTE复用推挽输出
GPIO_InitStructure.GPIO_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; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// // //PORTG12复用推挽输出 A0
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; // //PORTD复用推挽输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOG, &GPIO_InitStructure);
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0xf; // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK
writeTiming.FSMC_AddressHoldTime = 0x0; //地址保持时间(A
writeTiming.FSMC_DataSetupTime = 0x3; ////数据保存时间为4个HCLK
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_LCD_BACKx;// 这里我们使用NE4 ,也就对应BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_LCD_BACKx, ENABLE); // 使能BANK1
LCD_EN=1;//开启TFT电源
LCD_LED=1; //点亮背光
LCD_RESET=1; //复位引脚
delay_ms(5); // delay 5 ms
LCD_RESET=0; //复位
delay_ms(200); // delay 50 ms
LCD_RESET=1; //复位完成
delay_ms(300); // delay 50 ms
LCD_WriteReg(0x0000,0x0001);
// if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
// {
//尝试9341 ID的读取
LCD_WR_REG(0XD3);
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读到0X00
lcddev.id=LCD_RD_DATA(); //读取93 或者94
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读取41 或者86或者88
// }
// printf(" LCD ID:%x\r\n",lcddev.id); //打印LCD ID
// LCD_WR_REG( 0x11 );
// delay_ms( 120 );
// LCD_WR_REG( 0x29 ); /* Display ON (29h) */
LCD_WR_REG( 0XF7 );
LCD_WR_DATA( 0xA9 );
LCD_WR_DATA( 0x51 );
LCD_WR_DATA( 0x2C );
LCD_WR_DATA( 0x82 ); /* DSI write DCS command, use loose packet RGB 666 */
/* Power Control 1 (C0h) */
LCD_WR_REG( 0xC0 );
LCD_WR_DATA( 0x11 );
LCD_WR_DATA( 0x09 );
/* Power Control 2 (C1h) */
LCD_WR_REG( 0xC1 );
LCD_WR_DATA( 0x41 );
/* VCOM Control (C5h) */
LCD_WR_REG( 0XC5 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x80 );
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
LCD_WR_REG( 0xB1 );
LCD_WR_DATA( 0xB0 );
LCD_WR_DATA( 0x11 );
/* Display Inversion Control (B4h) */
LCD_WR_REG( 0xB4 );
LCD_WR_DATA( 0x02 );
/* Display Function Control (B6h) */
LCD_WR_REG( 0xB6 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x22 );
/* Entry Mode Set (B7h) */
LCD_WR_REG( 0xB7 );
LCD_WR_DATA( 0xc6 );
/* HS Lanes Control (BEh) */
LCD_WR_REG( 0xBE );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x04 );
/* Set Image Function (E9h) */
LCD_WR_REG( 0xE9 );
LCD_WR_DATA( 0x00 );
LCD_WR_REG( 0x36 );
LCD_WR_DATA( 0x08 );
/* Interface Pixel Format (3Ah) */
LCD_WR_REG( 0x3A );
LCD_WR_DATA( 0x55 ); /* 0x55 : 16 bits/pixel */
/* PGAMCTRL (Positive Gamma Control) (E0h) */
LCD_WR_REG( 0xE0 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x07 );
LCD_WR_DATA( 0x10 );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x0B );
LCD_WR_DATA( 0x41 );
LCD_WR_DATA( 0x89 );
LCD_WR_DATA( 0x4B );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x0C );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x18 );
LCD_WR_DATA( 0x1B );
LCD_WR_DATA( 0x0F );
/* NGAMCTRL (Negative Gamma Control) (E1h) */
LCD_WR_REG( 0XE1 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x1A );
LCD_WR_DATA( 0x04 );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x06 );
LCD_WR_DATA( 0x2F );
LCD_WR_DATA( 0x45 );
LCD_WR_DATA( 0x43 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x32 );
LCD_WR_DATA( 0x36 );
LCD_WR_DATA( 0x0F );
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
LCD_Display_Dir(0); //默认为竖屏
LCD_Clear(BLUE);//显示蓝色背景
// LCD_Fill(0,0,200,200,BLUE);
}
L
//LCD重要参数集
typedef struct
{
u16 width; //LCD 宽度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
u16 wramcmd; //开始写gram指令
u16 setxcmd; //设置x坐标指令
u16 setycmd; //设置y坐标指令
}_lcd_dev;
//LCD参数
extern _lcd_dev lcddev; //管理LCD重要参数
//LCD的画笔颜色和背景色
extern u16 POINT_COLOR;//默认红色
extern u16 BACK_COLOR; //背景颜色.默认为白色
#define FSMC_LCD_BACKx FSMC_Bank1_NORSRAM1
//////////////////////////////////////////////////////////////////////////////////
//-----------------LCD端口定义----------------
#define LCD_LED PAout(8) //LCD背光 PB0
#define LCD_EN PAout(12) //LCD背光 PB0
#define LCD_RESET PDout(3) //LCD背光 PB0
#define LCD_DCX PDout(13) //LCD背光 PB0
#define LCD_CS PDout(13) //LCD背光 PB0
//LCD地址结构体
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线
//注意设置时STM32内部会右移一位对其!
#define LCD_BASE ((u32)(0x60000000 | 0x0007FFFE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
//////////////////////////////////////////////////////////////////////////////////
//扫描方向定义
#define L2R_U2D 0 //从左到右,从上到下
#define L2R_D2U 1 //从左到右,从下到上
#define R2L_U2D 2 //从右到左,从上到下
#define R2L_D2U 3 //从右到左,从下到上
#define U2D_L2R 4 //从上到下,从左到右
#define U2D_R2L 5 //从上到下,从右到左
#define D2U_L2R 6 //从下到上,从左到右
#define D2U_R2L 7 //从下到上,从右到左
#define DFT_SCAN_DIR L2R_U2D //默认的扫描方向
//画笔颜色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
//GUI颜色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
//以上三色为PANEL的颜色
#define LIGHTGREEN 0X841F //浅绿色
//#define LIGHTGRAY 0XEF5B //浅灰色(PANNEL)
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
void LCD_WR_DATA(u16 data);
void LCD_WR_REG(u16 regval);
void LCD_Init(void); //初始化
Hi 楼主,我使用https://github.com/RobertoBenjami/stm32_graphics_display_drivers 中的STM32F407VET6 FSMC16 ILI9488,能够正常显示,但是竖屏是从右上角开始显示的,并且如果显示字符,也是反着的。想问一下你的LCD_Display_Dir这个里面是如何配置的?我有尝试去设置0x36寄存器,但是也不能正确的从左上角显示。
ID都读对了,怎么D0和D1会反呢?
一年了,这么长的时间忘记结束了,这个事情解决了,是FSMC_D0 D1搞错顺序了
屏幕供电电源有没有问题,是不是电源设计提供不了那么大的电流
如何回读,直接读取吗?像读取ID那样?