STM32系列FSMC控制器分析和代码_第1页
STM32系列FSMC控制器分析和代码_第2页
STM32系列FSMC控制器分析和代码_第3页
STM32系列FSMC控制器分析和代码_第4页
STM32系列FSMC控制器分析和代码_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、FSMC初初了解:FSMC包括4个模块:(1)AHB接口(包括FSMC配置寄存器)(2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATARAM一个是CMDRAM)(3)NAND闪存和PC卡控制器(4)外部设备接口我们驱动TFT很明显用的是第二个模块:NOR闪存。

2、FSMC的外设地址选择FSMC_Bank

用来选择外接存储器的地址,FSMC所控制的外存储器所映射的地址是0x60000000~0x9fffffff其中属于NORFLASH

的是0x60000000~0x6fffffff,然后这部分的地址空间又被分为四份,每份64MB,

编号是BANK1~BANK4,每个BANK

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

->Bank1

NE2->Bank2

NE3->Bank3

NE4->Bank4

第一块:60000000h--63ffffffh

第二块:64000000h--67ffffffh

第三块:68000000h--6bffffffh

第四块:6c000000h--6fffffffh

3、FSMC

驱动LCD

FSMC提供了所有的LCD控制器的信号:FSMC_D[16:0]:16bit的数据总线FSMCNEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4FSMCNOE:输出使能,连接LCD的RD脚。FSMCNWE:写使能,连接LCD的RW脚。FSMCAx:用在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、具体程序/********************************************************************************FunctionName

:Lcd_Configuration*Description

:ConfiguresLCDControllines*Input

:None*Output

:None*Return

:None*Attention

:None*******************************************************************************/staticvoidLCD_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;

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

/********************************************************************************FunctionName

:LCD_WriteReg*Description

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

:-index:寄存器地址*Output

:None*Return

:None*Attention

:None*******************************************************************************/__inlinevoidLCD_WriteIndex(uint16_tindex){Clr_Rs;Set_nRd;

GPIOE->ODR=index;

/*GPIO_Write(GPIOE,index);*/

Clr_nWr;Set_nWr;}

/********************************************************************************FunctionName

:LCD_WriteReg*Description

:LCD寄存器数据*Input

:-index:寄存器数据*Output

:None*Return

:None*Attention

:None*******************************************************************************/__inlinevoidLCD_WriteData(uint16_tdata){Set_Rs;

GPIOE->ODR=data;

/*GPIO_Write(GPIOE,data);*/

Clr_nWr;Set_nWr;}

/********************************************************************************FunctionName

:LCD_ReadData*Description

:读取控制器数据*Input

:None*Output

:None*Return

:返回读取到的数据*Attention

:None*******************************************************************************/__inlineuint16_tLCD_ReadData(void){

uint16_tvalue;

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;

returnvalue;}

__inlinevoidLCD_WriteReg(uint16_tLCD_Reg,uint16_tLCD_RegValue){

/*Write16-bitIndex,thenWriteReg*/

Clr_Cs;LCD_WriteIndex(LCD_Reg);

/*Write16-bitReg*/LCD_WriteData(LCD_RegValue);

Set_Cs;

}

__inlineuint16_tLCD_ReadReg(uint16_tLCD_Reg){uint16_tLCD_RAM;

/*Write16-bitIndex(thenReadReg)*/Clr_Cs;LCD_WriteIndex(LCD_Reg);/*Read16-bitReg*/LCD_RAM=LCD_ReadData();

Set_Cs;returnLCD_RAM;}

staticvoidLCD_SetCursor(uint16_tXpos,uint16_tYpos){

#if

(DISP_ORIENTATION==90)||(DISP_ORIENTATION==270)

uint16_ttemp=Xpos;

Xpos=Ypos;Ypos=(MAX_X-1)-temp;

#elif

(DISP_ORIENTATION==0)||(DISP_ORIENTATION==180)

#endif

LCD_WriteReg(0x004e,Xpos);

LCD_WriteReg(0x004f,Ypos);

}

staticvoiddelay_ms(uint16_tms)

{

uint16_ti,j;

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

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

voidLCD_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*2400x2B3F*/

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*/

LCD_WriteReg(0x004e,0);

/*列首址0*/

}

/********************************************************************************FunctionName

:LCD_Clear*Description

:将屏幕填充成指定的颜色,如清屏,则填充0xffff*Input

:-Color:ScreenColor*Output

:None*Return

:None*Attention

:None*******************************************************************************/voidLCD_Clear(uint16_tColor){uint32_tindex=0;

Clr_Cs;

LCD_WriteIndex(0x0022);for(index=0;index<MAX_X*MAX_Y;index++){LCD_WriteData(Color);}Set_Cs;}

/*******************************************************************************FunctionName

:LCD_GetPoint*Description

:获取指定座标的颜色值*Input

:-Xpos:RowCoordinate*

-Xpos:LineCoordinate

*Output

:None*Return

:ScreenColor*Attention

:None*******************************************************************************/uint16_tLCD_GetPoint(uint16_tXpos,uint16_tYpos){uint16_tdummy;

LCD_SetCursor(Xpos,Ypos);Clr_Cs;LCD_WriteIndex(0x0022);

dummy=LCD_ReadData();

/*空读一次*/

dummy=LCD_ReadData();

Set_Cs;

return

dummy;

}FSMC全称“静态存储器控制器”。使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。(1)当存储数据设为8位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_8b)

地址各位对应FSMC_A[25:0],数据位对应FSMC_D[7:0](2)当存储数据设为16位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_16b)

地址各位对应FSMC_A[24:0],数据位对应FSMC_D[15:0]FSMC包括4个模块:(1)AHB接口(包括FSMC配置寄存器)(2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATARAM一个是CMDRAM)(3)NAND闪存和PC卡控制器(4)外部设备接口注:FSMC可以请求AHB进行数据宽度的操作。如果AHB操作的数据宽度大于外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的数据宽度,以适应外部设备的数据宽度

FSMC对外部设备的地址映像从0x60000000开始,到0x9FFFFFFF结束,共分4个地址块,每个地址块256M字节。可以看出,每个地址块又分为4个分地址块,大小64M。对NOR的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下页表格。而这四个分存储块的片选,则使用NE[4:1]来选择。数据线/地址线/控制线是共享的。NE1->Bank1

NE2->Bank2

NE3->Bank3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论