历史上的今天
返回首页

历史上的今天

今天是:2025年06月18日(星期三)

正在发生

2019年06月18日 | stm32 TFTLCD驱动原理(三)

2019-06-18 来源:eefocus

代码的实现


(1)


首先是对 TFTLCD 进行引脚初始化


static void LCD_GPIO_Config ( void )

{

GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能复用IO时钟:复用为fsmc功能 */

RCC_APB2PeriphClockCmd ( RCC_APB2Periph_AFIO, ENABLE );   

  

/* 使能FSMC对应相应管脚时钟 */

RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE );

  FSMC_LCD_CS_APBxClock_FUN ( FSMC_LCD_CS_CLK, ENABLE );

  FSMC_LCD_DC_APBxClock_FUN ( FSMC_LCD_DC_CLK, ENABLE );

  FSMC_LCD_BK_APBxClock_FUN ( FSMC_LCD_BK_CLK, ENABLE );

  /* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10 */

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_8 | GPIO_Pin_9 | 

GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;

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_Init ( GPIOE,  & GPIO_InitStructure ); 

/* 配置FSMC相对应的控制线

* PD4-FSMC_NOE   :LCD-RD

* PD5-FSMC_NWE   :LCD-WR

* PG12-FSMC_NE4  :LCD-CS

* PF0-FSMC_A0    :LCD-DC

*/

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 

GPIO_Init (GPIOD, & GPIO_InitStructure );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 

GPIO_Init (GPIOD, & GPIO_InitStructure );

  

GPIO_InitStructure.GPIO_Pin = FSMC_LCD_CS_PIN; 

GPIO_Init ( FSMC_LCD_CS_PORT, & GPIO_InitStructure );  

GPIO_InitStructure.GPIO_Pin = FSMC_LCD_DC_PIN; 

GPIO_Init ( FSMC_LCD_DC_PORT, & GPIO_InitStructure );

  /* 配置LCD背光控制管脚BK*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Pin = FSMC_LCD_BK_PIN; 

GPIO_Init ( FSMC_LCD_BK_PORT, & GPIO_InitStructure );

  /* 初始化时先不开背光 */

  GPIO_ResetBits(FSMC_LCD_BK_PORT,FSMC_LCD_BK_PIN);

}


FSMC模式配置以及时序

/**

  * 函数功能: LCD  FSMC 模式配置

  * 输入参数: 无

  * 返 回 值: 无

  * 说    明:读写使用相同时间配置

  */

static void LCD_FSMC_Config ( void )

{

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

FSMC_NORSRAMTimingInitTypeDef  fsmc_lcd;

/* 使能FSMC时钟*/

RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );

 

fsmc_lcd.FSMC_AddressSetupTime      = 0x02; //地址建立时间

fsmc_lcd.FSMC_AddressHoldTime       = 0x00; //地址保持时间

fsmc_lcd.FSMC_DataSetupTime         = 0x05; //数据建立时间

fsmc_lcd.FSMC_BusTurnAroundDuration = 0x00;

fsmc_lcd.FSMC_CLKDivision           = 0x00;

fsmc_lcd.FSMC_DataLatency           = 0x00;

fsmc_lcd.FSMC_AccessMode            = FSMC_AccessMode_B; //模式B比较适用于LCD

FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_LCD_BACKx;

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;

FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_NOR;

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;

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_Disable;

FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = & fsmc_lcd;

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = & fsmc_lcd;  

FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure ); 

/* 使能 FSMC_Bank1_NORSRAM4 */

FSMC_NORSRAMCmd ( FSMC_LCD_BACKx, ENABLE );  

}


可以看出对LCD的操作转化为对地址的操作

/* 宏定义 --------------------------------------------------------------------*/

/******************************************************************************

2^26 =0X0400 0000 = 64MB,每个 BANK 有4*64MB = 256MB

64MB:FSMC_Bank1_NORSRAM1:0X6000 0000 ~ 0X63FF FFFF

64MB:FSMC_Bank1_NORSRAM2:0X6400 0000 ~ 0X67FF FFFF

64MB:FSMC_Bank1_NORSRAM3:0X6800 0000 ~ 0X6BFF FFFF

64MB:FSMC_Bank1_NORSRAM4:0X6C00 0000 ~ 0X6FFF FFFF

选择BANK1-BORSRAM4 连接 TFT,地址范围为0X6C00 0000 ~ 0X6FFF FFFF

YS-F1P开发板选择 FSMC_A0 接LCD的DC(寄存器/数据选择)脚

寄存器基地址 = 0X6C00 0000

RAM基地址 = 0X6C00 0002 = 0X6C00 0000+(1<<(0+1))

如果电路设计时选择不同的地址线时,地址要重新计算  

*******************************************************************************/

/******************************* ILI9488 显示屏的 FSMC 参数定义 ***************/

#define FSMC_LCD_CMD                   ((uint32_t)0x6C000000)     //FSMC_Bank1_NORSRAM1用于LCD命令操作的地址

#define FSMC_LCD_DATA                  ((uint32_t)0x6C000002)      //FSMC_Bank1_NORSRAM1用于LCD数据操作的地址      

#define LCD_WRITE_CMD(x)               *(__IO uint16_t *)FSMC_LCD_CMD  = x 

#define LCD_WRITE_DATA(x)              *(__IO uint16_t *)FSMC_LCD_DATA = x

#define LCD_READ_DATA()                *(__IO uint16_t *)FSMC_LCD_DATA


模块的初始化操作。

/**

  * 函数功能: 液晶模组初始化

  * 输入参数: 无

  * 返 回 值: 无

  * 说    明:无

  */

uint32_t BSP_LCD_Init(void)

{

LCD_GPIO_Config();

LCD_FSMC_Config();

  

  lcd_id=LCD_ReadID();

  if(lcd_id==0x548066 || lcd_id==0x8066)

  {

    ILI9488_REG_Config();

  }

  LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK);

  LCD_DELAY(2000);

  

  return lcd_id;

}


显示屏的基本操作函数

* 扩展变量 ------------------------------------------------------------------*/

/* 函数声明 ------------------------------------------------------------------*/

uint32_t BSP_LCD_Init(void);

void LCD_SetDirection(uint8_t ucOtion);

void LCD_OpenWindow(uint16_t usX,uint16_t usY,uint16_t usWidth,uint16_t usHeight);

void LCD_Clear(uint16_t usX,uint16_t usY,uint16_t usWidth,uint16_t usHeight,uint16_t usColor);

void LCD_SetPointPixel(uint16_t usX,uint16_t usY,uint16_t usColor);

uint16_t LCD_GetPointPixel(uint16_t usX,uint16_t usY);

void LCD_DrawLine(uint16_t usX1,uint16_t usY1,uint16_t usX2,uint16_t usY2,uint16_t usColor);

void LCD_DrawRectangle(uint16_t usX_Start,uint16_t usY_Start, uint16_t usWidth,uint16_t usHeight,uint16_t usColor,uint8_t ucFilled);

void LCD_DrawCircle(uint16_t usX_Center,uint16_t usY_Center,uint16_t usRadius,uint16_t usColor,uint8_t ucFilled);

void LCD_DispChar_EN(uint16_t usX,uint16_t usY,const char cChar,uint16_t usColor_Background,uint16_t usColor_Foreground,USB_FONT_Typdef font);

void LCD_DispString_EN(uint16_t usX,uint16_t usY,const char *pStr,uint16_t usColor_Background,uint16_t usColor_Foreground,USB_FONT_Typdef font);

#endif /* __BSP_LCD_H__ */


资料地址:链接:http://pan.baidu.com/s/1qXIV8ny 密码:9o4k



推荐阅读

史海拾趣

Econais公司的发展小趣事

Econais公司成立于XXXX年,其创始人是一群在无线通信技术领域拥有深厚背景和丰富经验的工程师。他们看到了物联网(IoT)和机器对机器(M2M)通信的巨大潜力,并希望通过自己的技术,为全球的设备提供高效、稳定的无线连接方案。于是,Econais应运而生,专注于研发超低功耗(ULP)和高性能的无线模块。

Delkin Devices公司的发展小趣事

Delkin Devices公司成立于1986年,总部设在美国加利福尼亚州的圣迭戈市。公司由一群富有远见和创造力的工程师和企业家创立,他们看到了未来数据存储技术的巨大潜力。在创立初期,Delkin Devices专注于研发和生产高质量的闪存存储设备,以满足当时市场对数据存储不断增长的需求。通过不断的技术创新和优质的客户服务,Delkin Devices逐渐在电子行业中崭露头角。

ADATA公司的发展小趣事

Delkin Devices公司成立于1986年,总部设在美国加利福尼亚州的圣迭戈市。公司由一群富有远见和创造力的工程师和企业家创立,他们看到了未来数据存储技术的巨大潜力。在创立初期,Delkin Devices专注于研发和生产高质量的闪存存储设备,以满足当时市场对数据存储不断增长的需求。通过不断的技术创新和优质的客户服务,Delkin Devices逐渐在电子行业中崭露头角。

Baton Lock公司的发展小趣事

在快速发展的过程中,Baton Lock意识到产品质量是公司生存和发展的关键。因此,公司投入大量资源加强品质管理,从原材料采购到生产流程控制,再到产品检测,都实施了严格的标准和程序。这一举措有效提升了产品的稳定性和可靠性,赢得了客户的信任。

AiT Semiconductor Inc公司的发展小趣事

AiT公司的创立源自一群对半导体技术充满热情的工程师。他们看到了半导体行业巨大的市场潜力和技术挑战,决心成立一家公司,专注于半导体产品的研发和生产。在创立初期,公司面临资金短缺、市场竞争激烈等诸多困难,但凭借着对技术的执着追求和不懈努力,他们成功开发出了一系列高性能、高品质的半导体产品,逐渐在市场中站稳脚跟。

Essentra Components公司的发展小趣事

Essentra Components公司一直将客户服务放在首位,通过提供优质的售前咨询、售中支持和售后服务,赢得了客户的广泛赞誉。公司不仅为客户提供了丰富的产品选择,还根据客户的具体需求提供定制化的解决方案。此外,公司还建立了完善的物流配送体系,确保产品能够及时、准确地送达客户手中。这些努力使得Essentra Components在客户中树立了良好的口碑,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

求答疑!!!!windows 怎么向 linux 发送一个 .c文件,linux能完整接收编译?

我的目标是在C#平台自动生成一个目标.c文件,而编译工作要使用linux下的gcc编译我的目标.c文件,(考虑到windows下的cygwin编译出来的可执行文件在linux是不能跑的)我现在的问题是:怎么才能把windows下我的.c文件传给到linux编译????? 等待 ...…

查看全部问答>

单片机与TCP/IP网络(ISA总线接口定义)

ISA ISA=Industry Standard Architecture (isa总线) Pin Name Description 引脚 名称 含义 A1 /I/O CH CK I/O channel check; active low=parity error A2 D7 Data bit 7 A3 D6 Data bit 6 A4 D5 Data bit 5 A5 D4 Data bit 4 A6 ...…

查看全部问答>

windows下能开发linux的驱动嘛?

我是初学者,不想装linux,不知道有没有办法在windows下开发linux的驱动啊,那位知道的蝈蝈帮忙指点下,谢谢…

查看全部问答>

Windows Mobile 中有没有免提键的虚拟码

如题,如果没有的话,怎么做才能实现免提的功能?…

查看全部问答>

DOS下RS485双机通讯

问题有三: DOS下232串口编程和485串口编程有区别否,能通用吗? DOS下BC31写485通讯需要注意些什么? 有好点的类库推荐下吗? 谢谢!PS:我的双机是两个PC104…

查看全部问答>

用595驱动16*16点阵遇到很奇怪的问题,实在没检查出问题,在线等

这是程序 #include sbit ser = P3^7; sbit OE = P3^6; sbit RCK = P3^5; sbit SCK = P3^4; sbit G1 = P2^0; sbit G2 = P2^1; char code tab[]= {         0x02,0x00,0x04,0x00,0x1F,0xFF,0xE0,0x00,       ...…

查看全部问答>

DSP包含BIOS系统工程编译出错!

用CCSv4.0编译包含bios系统的工程,出现如下错误: fatal error: file \"D:/Program Files/Texas   Instruments/bios_5_41_02_14/packages/ti/bios/lib/bios.a28FP<clk.o28FP>\"   specifies ISA revision \"C28FPU32\", ...…

查看全部问答>

430学习经验

1.首先你要知道msp430的存储器结构。典型微处理器的结构有两种:冯。诺依曼结构——程序存储器和数据存储器统一编码;哈佛结构——程序存储器和数据存储器;msp430系列单片机属于前者,而常用的mcs51系列属于后者。   0-0xf特殊功能寄存器;0x1 ...…

查看全部问答>

关于MSP430G2231晶振问题

用示波器测P1.0脚观察ACLK输出,发现波形不是方波,频率一直在变从8HZ变到26K,难道是我芯片坏了吗?用万用表测试没有烧,在线等求助…

查看全部问答>

死循环的发生

在使用launchpad仿真时MSP430G2553时经常会出现变量参数溢出导致死循环,有没有哪位兄弟出现过这种问题啊, 例如void delay(uchar num) { while(num) num--; } 经常进入这里导致死循环。大家讨论下关于什么情况下会出现死循环吧…

查看全部问答>