历史上的今天
返回首页

历史上的今天

今天是:2025年02月28日(星期五)

正在发生

2021年02月28日 | STM32的FSMC驱动TFT笔记

2021-02-28 来源:eefocus

1、FSMC初初了解:


FSMC 包括4个模块:


(1)AHB接口(包括FSMC配置寄存器)


(2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATA RAM 一个是CMD RAM)


(3)NAND闪存和PC卡控制器


(4)外部设备接口


我们驱动TFT很明显用的是第二个模块:NOR闪存。


2、FSMC的外设地址选择


FSMC _Bank 用来选择外接存储器的地址,FSMC所控制的外存储器所映射的地址是0x6000 0000 ~ 0x9fff ffff


其中属于NOR FLASH 的是0x6000 0000 ~ 0x6fff ffff ,然后这部分的地址空间又被分为四份,每份64MB, 编号是BANK1 ~ BANK 4 ,每个BANK 都有一个片选引脚。


而这四个分存储块的片选,则使用NE[4:1]来选择。数据线/地址线/控制线是共享的。


NE1 ->Bank1 NE2->Bank2 NE3->Bank3 NE4->Bank4


第一块:6000 0000h--63ff ffffh


第二块:6400 0000h--67ff ffffh


第三块:6800 0000h--6bff ffffh


第四块:6c00 0000h--6fff ffffh


3、FSMC 驱动LCD


FSMC提供了所有的LCD控制器的信号:


FSMC_D[16:0]:16bit的数据总线


FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4


FSMC NOE:输出使能,连接LCD的RD脚。


FSMC NWE:写使能,连接LCD的RW脚。


FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。


正如我们操作12864的命令/数据选择端口RS一样,对于FSMC驱动TFT :RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。


4、GPIO端口配置


由于是使用FSMC来驱动TFT的,所以除了背光用的PD13和复位用的PC1要设置为通用推挽输出之外,其他引脚都必须设置为复用推挽输出。然而,很奇怪的是。当我配置好PD13时,我发现程序下载进去后是一片漆黑的,后来再三检查是背光的PD13的问题。必须把PD13置高才可以亮,否则默认低电平,就是一片黑了。


5、 具体程序


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


* Function Name : Lcd_Configuration


* Description : Configures LCD Control lines


* Input : None


* Output : None


* Return : None


* Attention : None


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


static void LCD_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;




/* Enable GPIOD and GPIOE clocks */


RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);


/* PE.00(D0), PE.01(D1), PE.02(D2), PE.03(D3), PE.04(D4), PE.05(D5), PE.06(D6), PE.07(D7), PE.08(D8)


PE.09(D9), PE.10(D10), PE.11(D11), PE.12(D12), PE.13(D13), PE.14(D14), PE.15(D15) */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOE, &GPIO_InitStructure);


/* PD.13(RS), PD.14(WR), PD.15(RD) */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOD, &GPIO_InitStructure);


/* PD.12(CS)*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOD, &GPIO_InitStructure);


}


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


* Function Name : LCD_WriteReg


* Description : LCD控制器寄存器地址


* Input : - index: 寄存器地址


* Output : None


* Return : None


* Attention : None


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


__inline void LCD_WriteIndex(uint16_t index)


{


Clr_Rs;


Set_nRd;


GPIOE->ODR = index; /* GPIO_Write(GPIOE,index); */


Clr_nWr;


Set_nWr;


}


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


* Function Name : LCD_WriteReg


* Description : LCD寄存器数据


* Input : - index: 寄存器数据


* Output : None


* Return : None


* Attention : None


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


__inline void LCD_WriteData(uint16_t data)


{


Set_Rs;


GPIOE->ODR = data; /* GPIO_Write(GPIOE,data); */


Clr_nWr;


Set_nWr;


}


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


* Function Name : LCD_ReadData


* Description : 读取控制器数据


* Input : None


* Output : None


* Return : 返回读取到的数据


* Attention : None


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


__inline uint16_t LCD_ReadData(void)


{


uint16_t value;


Set_Rs;


Set_nWr;


Clr_nRd;






GPIOE->CRH = 0x44444444;


GPIOE->CRL = 0x44444444;




value = GPIOE->IDR;


value = GPIOE->IDR;


GPIOE->CRH = 0x33333333;


GPIOE->CRL = 0x33333333;




Set_nRd;




return value;


}






__inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)


{


/* Write 16-bit Index, then Write Reg */


Clr_Cs;


LCD_WriteIndex(LCD_Reg);


/* Write 16-bit Reg */


LCD_WriteData(LCD_RegValue);


Set_Cs;


}






__inline uint16_t LCD_ReadReg(uint16_t LCD_Reg)


{


uint16_t LCD_RAM;




/* Write 16-bit Index (then Read Reg) */


Clr_Cs;


LCD_WriteIndex(LCD_Reg);


/* Read 16-bit Reg */


LCD_RAM = LCD_ReadData();


Set_Cs;


return LCD_RAM;


}






static void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos )


{


#if ( DISP_ORIENTATION == 90 ) || ( DISP_ORIENTATION == 270 )




uint16_t temp = Xpos;




Xpos = Ypos;


Ypos = ( MAX_X - 1 ) - temp;




#elif ( DISP_ORIENTATION == 0 ) || ( DISP_ORIENTATION == 180 )




#endif


LCD_WriteReg(0x004e, Xpos );


LCD_WriteReg(0x004f, Ypos );






}




static void delay_ms(uint16_t ms)


{


uint16_t i,j;


for( i = 0; i < ms; i++ )


{


for( j = 0; j < 1141; j++ );


}


}






void LCD_Initializtion(void)


{






LCD_Configuration();


// DeviceCode = LCD_ReadReg(0x0000);


/* 读取屏ID */






LCD_WriteReg(0x0000,0x0001); delay_ms(50); /* 打开晶振 ,内部晶振500k*/


LCD_WriteReg(0x0003,0xA8A4); delay_ms(50);


LCD_WriteReg(0x000C,0x0000); delay_ms(50);


LCD_WriteReg(0x000D,0x080C); delay_ms(50);


LCD_WriteReg(0x000E,0x2B00); delay_ms(50);


LCD_WriteReg(0x001E,0x00B0); delay_ms(50);


LCD_WriteReg(0x0001,0x2B3F); delay_ms(50); /* 驱动输出控制320*240 0x2B3F */


LCD_WriteReg(0x0002,0x0600); delay_ms(50);


LCD_WriteReg(0x0010,0x0000); delay_ms(50);


LCD_WriteReg(0x0011,0x6070); delay_ms(50); /* 定义数据格式 16位色 横屏 0x6070 */


LCD_WriteReg(0x0005,0x0000); delay_ms(50);


LCD_WriteReg(0x0006,0x0000); delay_ms(50);


LCD_WriteReg(0x0016,0xEF1C); delay_ms(50);


LCD_WriteReg(0x0017,0x0003); delay_ms(50);


LCD_WriteReg(0x0007,0x0133); delay_ms(50);


LCD_WriteReg(0x000B,0x0000); delay_ms(50);


LCD_WriteReg(0x000F,0x0000); delay_ms(50); /* 扫描开始地址 */


LCD_WriteReg(0x0041,0x0000); delay_ms(50);


LCD_WriteReg(0x0042,0x0000); delay_ms(50);


LCD_WriteReg(0x0048,0x0000); delay_ms(50);


LCD_WriteReg(0x0049,0x013F); delay_ms(50);


LCD_WriteReg(0x004A,0x0000); delay_ms(50);


LCD_WriteReg(0x004B,0x0000); delay_ms(50);


LCD_WriteReg(0x0044,0xEF00); delay_ms(50);


LCD_WriteReg(0x0045,0x0000); delay_ms(50);


LCD_WriteReg(0x0046,0x013F); delay_ms(50);


LCD_WriteReg(0x0030,0x0707); delay_ms(50);


LCD_WriteReg(0x0031,0x0204); delay_ms(50);


LCD_WriteReg(0x0032,0x0204); delay_ms(50);


LCD_WriteReg(0x0033,0x0502); delay_ms(50);


LCD_WriteReg(0x0034,0x0507); delay_ms(50);


LCD_WriteReg(0x0035,0x0204); delay_ms(50);


LCD_WriteReg(0x0036,0x0204); delay_ms(50);


LCD_WriteReg(0x0037,0x0502); delay_ms(50);


LCD_WriteReg(0x003A,0x0302); delay_ms(50);


LCD_WriteReg(0x003B,0x0302); delay_ms(50);


LCD_WriteReg(0x0023,0x0000); delay_ms(50);


LCD_WriteReg(0x0024,0x0000); delay_ms(50);


LCD_WriteReg(0x0025,0x8000); delay_ms(50);


LCD_WriteReg(0x004f,0); /* 行首址0 */

推荐阅读

史海拾趣

FINISAR公司的发展小趣事

FINISAR公司(前身为Finisar Corporation)成立于1987年(另有资料称成立于1988年),总部位于美国加利福尼亚州的硅谷地区。公司自创立之初便专注于光通信技术的研发与应用,致力于设计、制造和销售高性能的光模块和光网络设备。在成立初期,FINISAR凭借其创新的技术和高质量的产品,在光通信市场上逐渐崭露头角,为后续的快速发展奠定了坚实基础。

Corning Cable Systems公司的发展小趣事

在技术创新方面,Corning Cable Systems公司积极与全球范围内的科研机构和企业开展合作。通过与这些合作伙伴的紧密合作,公司不断引进新技术、新工艺和新材料,推动光纤通信技术的不断进步。这些合作不仅增强了公司的技术实力,也为整个行业的发展注入了新的活力。

Golledge Electronics公司的发展小趣事

在深海光缆领域,Corning Cable Systems公司也展现出了强大的实力。公司成功研发出适用于深海环境的光缆产品,并在多个国际项目中得到了广泛应用。这些深海光缆不仅具有优异的传输性能,还能够在极端恶劣的海底环境下保持长期稳定运行,为跨洋通信提供了可靠的保障。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

Amphenol(安费诺)公司的发展小趣事

BELDEN公司的故事始于1902年,当Joseph C. Belden在美国芝加哥创立这家公司时,他怀揣着对电线电缆制造的深厚热情与独特见解。初创时期,公司致力于研发和生产高品质的电线电缆产品,很快便在市场中赢得了良好的声誉。经过多次试验,公司成功发明了“Beldenamel”绝缘材料,这种柔韧的珐琅绝缘材料为公司的成功奠定了坚实的基础。随着产品的不断优化和市场的逐步拓展,BELDEN逐渐在电子行业中崭露头角。

GigPeak公司的发展小趣事

随着业务的不断扩展,GigPeak意识到国际化战略的重要性。在2015年,公司开始积极布局海外市场,先后在北美、欧洲和亚洲等地设立了研发中心和销售分支机构。通过深入了解当地市场需求和文化背景,GigPeak成功推出了一系列符合当地市场需求的定制化产品。这些举措不仅提升了GigPeak在全球市场的知名度和影响力,还为其带来了稳定的海外收入来源。

问答坊 | AI 解惑

大学时代影响我的人生的10件大事

在大学里我对人生有了新的认识,也想清楚了很多问题.大一时候曾经迷茫,大二也曾经郁闷,\"郁闷\"似乎是现在大学生的口头禅.今天,这些感觉正随着时间慢慢褪去.我觉得这是很正常的.   关于排名第一的那件事情,现在的想法还不系统,而思考也随 ...…

查看全部问答>

一个dsp程序员应该具备的素质

在定点DSP中,能够熟练使用Q格式。能够编写出大量符合TI公司的规范的代码程序,虽然不可把规范看的太死。能够熟练使用C语言,从C51到DSP.到ARM.等。这是个嵌入式编程泛C语言的时代,程序员最好还能够知道一些面向对象的语言,如C++,JAVA,C#.能够吸 ...…

查看全部问答>

双激式变压器开关电源(part1) 开关电源原理与设计(连载26)

1-8.双激式变压器开关电源 所谓双激式变压器开关电源,就是指在一个工作周期之内,变压器的初级线圈分别被直流电压正、反激励两次。与单激式变压器开关电源不同,双激式变压器开关电源一般在整个工作周期之内,都向负载提供功率输出。双激式变压 ...…

查看全部问答>

单片机视频教程【10】LCD1602液晶

$(\'swf_r2D\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30391850/v.swf\'), ...…

查看全部问答>

TCPMP Wince6.0 VS2005 编过了, interface.plg死活加载不上

相关的只做过一个改动 player下main.c下只改了一个宏定义 // don\'t want to use common.dll, but don\'t want to collide with DLL import function either #define tcscpy_s _tcscpy_s 改成了 #define tcscpy_s _mtcscpy_s 原因是_tcscpy_s ...…

查看全部问答>

tc下使用borland图形接口出现 BGI Error:Graphics not initialized(use 'initgraph')

用borland C++做一个工控机上的dos程序, 代码里有:initgraph(&drv,&mode,\"\"); 这句话, 并且我的源文件目录下有EGAVGA.BGI这个文件, 编译通过, 当Run的时候就出现BGI Error:Graphics not initialized(use \'initgraph\') 请问这是怎么回事? ...…

查看全部问答>

请教哪些处理器支持WINCE?

功能:主要用于数据采集和回放。 1.打算做成一块带CPCI或者PCI接口的板卡,插入工控机中。板上有处理器、SATA-PCI或者SATA-localbus转接芯片、A/D、D/A等,采集工作时由处理器控制A/D采集,采集数据经处理器简单处理通过SATA转接芯片写入SATA硬 ...…

查看全部问答>

急求:关于WINCE 5.0的数据库函数问题

大家好:     我做的WINCE 5.0的pocket pc 程序里对数据库建立CeCreateDatabaseEx2(SDK里有EDB版的这个函数),但数据库总建立失败,查看错误是:参数不对。我不知道自己的参数错在哪,请求大家给我指教:       &nb ...…

查看全部问答>

串口通信:为什么总是得不到句柄?

我想用vb.net写的程序来取得串口的句柄,但是getlasterror总是得到12的值,查MSDN,注明为The access code is invalid。请各位高手给予指点程序哪儿有问题还是我createfile的参数值有问题:         Dim hDiskName ...…

查看全部问答>

本土芯片设计企业做电力计量方案,机会在哪?

最近在一个展会上看到深圳一家叫芯海的公司展出了数字电表方案,感觉有点新鲜。电力计量这个市场是蛮大的,不过好像早都被AXX等几家大公司瓜分的差不多了,本土企业还有机会吗?不晓得了解这个行业的人士如何看?…

查看全部问答>