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

下载本文档

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

文档简介

1、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 0x6ff

2、f ffff ,然后这部分的地址空间又被分为四份,每份64MB, 编号是BANK1 BANK 4 ,每个BANK 都有一个片选引脚。而这四个分存储块的片选,则使用NE4:1来选择。数据线/地址线/控制线是共享的。NE1 ->Bank1   NE2->Bank2  NE3->Bank3  NE4->Bank4 第一块:6000 0000h-63ff ffffh  第二块:6400 0000h-67ff ffffh 第三块:6800 0000h-6bff ffffh

3、 第四块:6c00 0000h-6fff ffffh 3、FSMC 驱动LCD FSMC提供了所有的LCD控制器的信号:FSMC_D16:0:16bit的数据总线FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7NE1,PG9NE2,PG10-NE3,PG12NE4FSMC NOE:输出使能,连接LCD的RD脚。FSMC NWE:写使能,连接LCD的RW脚。FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的

4、任意一根线,范围:FSMC_A25:0。正如我们操作12864的命令/数据选择端口RS一样,对于FSMC驱动TFT :RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。 4、GPIO端口配置由于是使用FSMC来驱动TFT的,所以除了背光用的PD13和复位用的PC1要设置为通用推挽输出之外,其他引脚都必须设置为复用推挽输出。然而,很奇怪的是。当我配置好PD13时,我发现程序下载进去后是一片漆黑的,后来再三检查是背光的PD13的问题。必须把PD13置高才可以亮,否则默认低电平,就是一片黑了。 5、 具体程序/* Function Name  :

5、 Lcd_Configuration* Description    : Configures LCD Control lines* Input          : None* Output         : None* Return         : None* Attention  : None*/static void LCD_Configuration(void)GPIO_InitTypeDef GPIO_InitStru

6、cture; /* 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)

7、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(W

8、R), 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_InitStructur

9、e.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        

10、: 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寄存器数据

11、* 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_n

12、Wr; /* Function Name  : LCD_ReadData* Description    : 读取控制器数据* Input          : None* Output         : None* Return         : 返回读取到的数据* Attention  : None*/_inline uint16_t LCD_ReadData(void) uint16_t valu

13、e; 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;   &#

14、160; 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;   _inli

15、ne 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 ) 

16、   #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 );   &#

17、160;            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_Initi

18、aliztion(void)  LCD_Configuration();/ DeviceCode = LCD_ReadReg(0x0000);/* 读取屏ID */      LCD_WriteReg(0x0000,0x0001);    delay_ms(50);   /* 打开晶振 ,内部晶振500k*/   LCD_WriteReg(0x0003,0xA8A4);    delay_ms(50);      L

19、CD_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); &#

20、160;    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);   

21、60;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); 

22、60;  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_Wr

23、iteReg(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);  

24、;  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); 

25、 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,0x

26、0507);    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

27、(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_WriteR

28、eg(0x004f,0);        /* 行首址0 */   LCD_WriteReg(0x004e,0);        /* 列首址0 */  /* Function Name  : LCD_Clear* Description    : 将屏幕填充成指定的颜色,如清屏,则填充 0xffff* Input          : - Color: Screen Color* Output

29、        : None* Return         : None* Attention  : None*/void LCD_Clear(uint16_t Color)uint32_t index=0; Clr_Cs; LCD_WriteIndex(0x0022);for( index = 0; index < MAX_X * MAX_Y; index+ )LCD_WriteData(Color);Set_Cs; /* Function Name  :

30、 LCD_GetPoint* Description    : 获取指定座标的颜色值* Input          : - Xpos: Row Coordinate*                  - Xpos: Line Coordinate * Output         : None* Return         : Screen

31、Color* Attention  : None*/uint16_t LCD_GetPoint(uint16_t Xpos,uint16_t Ypos)uint16_t dummy; LCD_SetCursor(Xpos,Ypos);Clr_Cs;LCD_WriteIndex(0x0022);                 dummy = LCD_ReadData();   /* 空读一次 */         

32、   dummy = LCD_ReadData();     Set_Cs;        return  dummy;      FSMC全称“静态存储器控制器”。使用FSMC控制器后,可以把FSMC提供的FSMC_A25:0作为地址线,而把FSMC提供的FSMC_D15:0作为数据总线。(1)当存储数据设为8位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b

33、)    地址各位对应FSMC_A25:0,数据位对应FSMC_D7:0(2)当存储数据设为16位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b)    地址各位对应FSMC_A24:0,数据位对应FSMC_D15:0FSMC 包括4个模块:(1)AHB接口(包括FSMC配置寄存器)(2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATA RAM 一个是CMD RAM)(3)NAND闪存和PC卡控制器(4)外部设备接口注:FSMC可以请求AHB进行数据宽度的操作。如果AHB操作的数据宽度大于外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的数据宽度,以适应外部设备的数据宽度 FSMC对外部设备的地址映像从0x6000 0000开始,到0x9FFF FFFF结束,共分4个地址块,每个地址块256M字节。可以看出,每个地址块又分为4个分地址块,大小64M。对NOR的地址映像来说,我们可以通过选择H

温馨提示

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

评论

0/150

提交评论