OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2428|回复: 1

[LCD模块] 移植探索者F4的TFT触摸屏程序到STM32F407VET6之后,为什么屏幕可以正常亮,但是却无法正常显示?附上板子电路图以及代码

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-7-23
在线时间
2 小时
发表于 2021-7-23 19:46:57 | 显示全部楼层 |阅读模式
/********************lcd.h文件********************/
/********************lcd.h文件********************/
/********************lcd.h文件********************/

//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; //背景颜色.默认为白

//////////////////////////////////////////////////////////////////////////////////         
//-----------------LCD端口定义----------------
#define        LCD_LED PBout(1)                  //LCD背光                     PB1            
//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线
//注意设置时STM32内部会右移一位对其! 111 1110=0X7E                            
#define LCD_BASE        ((u32)(0x6C000000 | 0x0007FFFE))          //Ox0007FFFE是我修改之后的值 因为vet6板子上是用的A18作为数据命令区分线
#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_Init(void);                                                                                                                   //初始化
void LCD_DisplayOn(void);                                                                                                        //开显示
void LCD_DisplayOff(void);                                                                                                        //关显示
void LCD_Clear(u16 Color);                                                                                                         //清屏
void LCD_SetCursor(u16 Xpos, u16 Ypos);                                                                                //设置光标
void LCD_DrawPoint(u16 x,u16 y);                                                                                        //画点
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color);                                                                //快速画点
u16  LCD_ReadPoint(u16 x,u16 y);                                                                                         //读点
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);                                                                         //画圆
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);                                                        //画线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);                                                   //画矩形
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);                                                   //填充单色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);                                //填充指定颜色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);                                                //显示一个字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);                                                  //显示一个数字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);                                //显示 数字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);                //显示一个字符串,12/16字体

void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);
u16 LCD_ReadReg(u16 LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
void LCD_SSD_BackLightSet(u8 pwm);                                                        //SSD1963 背光控制
void LCD_Scan_Dir(u8 dir);                                                                        //设置屏扫描方向
void LCD_Display_Dir(u8 dir);                                                                //设置屏幕显示方向
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);        //设置窗口                                                                                                                                                                                                                                                       
//LCD分辨率设置
#define SSD_HOR_RESOLUTION                800                //LCD水平分辨率
#define SSD_VER_RESOLUTION                480                //LCD垂直分辨率
//LCD驱动参数设置
#define SSD_HOR_PULSE_WIDTH                1                //水平脉宽
#define SSD_HOR_BACK_PORCH                46                //水平前廊
#define SSD_HOR_FRONT_PORCH                210                //水平后廊

#define SSD_VER_PULSE_WIDTH                1                //垂直脉宽
#define SSD_VER_BACK_PORCH                23                //垂直前廊
#define SSD_VER_FRONT_PORCH                22                //垂直前廊
//如下几个参数,自动计算
#define SSD_HT        (SSD_HOR_RESOLUTION+SSD_HOR_BACK_PORCH+SSD_HOR_FRONT_PORCH)
#define SSD_HPS        (SSD_HOR_BACK_PORCH)
#define SSD_VT         (SSD_VER_RESOLUTION+SSD_VER_BACK_PORCH+SSD_VER_FRONT_PORCH)
#define SSD_VPS (SSD_VER_BACK_PORCH)

#endif  


部分引脚图

部分引脚图

                   引脚示意图

TFT接口图

TFT接口图

                 TFT屏幕接口示意图




/*****************lcd初始化函数中配置端口的代码****************/
/*****************lcd初始化函数中配置端口的代码****************/
/*****************lcd初始化函数中配置端口的代码****************/
  GPIO_InitTypeDef  GPIO_InitStructure;
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
  FSMC_NORSRAMTimingInitTypeDef  writeTiming;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE, ENABLE);//使能PD,PE,PF,PG时钟  
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟  
       

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PB15 推挽输出,控制背光
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 //PB15 推挽输出,控制背光
       
  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;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  
       
  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;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  


  GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12

  GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC);//PF12,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC);


  readWriteTiming.FSMC_AddressSetupTime = 0XF;         //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns       
  readWriteTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(ADDHLD)模式A未用到       
  readWriteTiming.FSMC_DataSetupTime = 60;                        //数据保存时间为60个HCLK        =6*60=360ns
  readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  readWriteTiming.FSMC_CLKDivision = 0x00;
  readWriteTiming.FSMC_DataLatency = 0x00;
  readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A


        writeTiming.FSMC_AddressSetupTime =9;              //地址建立时间(ADDSET)为9个HCLK =54ns
  writeTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(A               
  writeTiming.FSMC_DataSetupTime = 8;                 //数据保存时间为6ns*9个HCLK=54ns
  writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  writeTiming.FSMC_CLKDivision = 0x00;
  writeTiming.FSMC_DataLatency = 0x00;
  writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A


  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用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_Bank1_NORSRAM4, ENABLE);  // 使能BANK1

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-7-23
在线时间
2 小时
 楼主| 发表于 2021-7-23 19:50:07 | 显示全部楼层
除了改了端口配置以及原子哥的源代码这条语句有修改之后“#define LCD_BASE        ((u32)(0x6C000000 | 0x0007FFFE))  ” 源代码中其他地方没有任何改动
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 08:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表