基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx

上传人:b****1 文档编号:5608146 上传时间:2023-05-05 格式:DOCX 页数:19 大小:21.89KB
下载 相关 举报
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第1页
第1页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第2页
第2页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第3页
第3页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第4页
第4页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第5页
第5页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第6页
第6页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第7页
第7页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第8页
第8页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第9页
第9页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第10页
第10页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第11页
第11页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第12页
第12页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第13页
第13页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第14页
第14页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第15页
第15页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第16页
第16页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第17页
第17页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第18页
第18页 / 共19页
基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx

《基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx》由会员分享,可在线阅读,更多相关《基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx(19页珍藏版)》请在冰点文库上搜索。

基于stm32f103zet6之使用FSMC驱动TFT的学习文档格式.docx

所以这里和我们8080时序相比,少了复位信号线和数据/命令控制线,怎么办?

继续看!

3、了解了FSMC会有这三总线的概念,那么接下来就是如何转化为我们需要的时序了。

对比一下FSMC访问外norflash和8080访问时序如下

 

差别似乎很小是吧,简单说就是在数据/指令选择和复位信号上的区别。

4、在这里我们使用的软件方法来完善FSMC转化为8080的读写时序

在参考手册上的存储系统能找到,芯片留给我们外扩的存储器(NORFLASH、PSRAM这类可直接寻址的器

件)地址是从0x60000000开始的,意思就是当我们访问0x60000000的时候,那就是相当于访问外部norflash了(我们只讨论这种情况),那么他就会自动产生FSMC的时序

在这里,我们所需要添加的就是D/C选择信号,如何实现呢?

我们是通过,一根地址线来实现的,当我们把A0多对应的GPIOF0(引脚默认复用)接到TFT的RS端,

然后执行访问0x60000000的指令,那么RS是否就是低电平选择为数据呢?

又加入我们访问的地址是0x60000001的时候,那么RS是否就是高电平,从而选择的就是指令传送呢?

答案当然是肯定的!

所以我们就解决了这个问题,复位信号就更好解决了,直接和开发板的复位引脚接在一起就好了,就这么简单!

三、说了这么久的理论,来个实例分析更加形象了,首先硬件连线要明白

在原理图或者开发手册上面能够确定引脚复用问题

地址引脚:

(A0-A5:

PF0-PF5)(A6-A9:

F12-F15)(A10-A15:

PG0-PG5)

(A16-A18:

PD11-PD13)(A19-A22:

PE3-PE6)(A23-PE2)

片选信号(NEx:

PG12)因为我选择的是block4

写使能(NWR:

PD5)

读使能(NOE:

PD4)

至此控制引脚基本完成

下面就是数据引脚:

PD14-FSMC-D0----LCD-DB0

PD15-FSMC-D1----LCD-DB1

PD0-FSMC-D2----LCD-DB2

PD1-FSMC-D3----LCD-DB3

PE7-FSMC-D4----LCD-DB4

PE8-FSMC-D5----LCD-DB5

PE9-FSMC-D6----LCD-DB6

PE10-FSMC-D7----LCD-DB7

PE11-FSMC-D8----LCD-DB8

PE12-FSMC-D9----LCD-DB9

PE13-FSMC-D10----LCD-DB10

PE14-FSMC-D11----LCD-DB11

PE15-FSMC-D12----LCD-DB12

PD8-FSMC-D13----LCD-DB13

PD9-FSMC-D14----LCD-DB14

PD10-FSMC-D15----LCD-DB15

有了这些硬件连线是没有任何问题的

四、正式分析程序

1、硬件引脚配置函数

voidLCD_CtrlLinesConfig(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

/*EnableFSMC,GPIOD,GPIOE,GPIOF,GPIOGandAFIOclocks*/

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

//使能FSMC

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|

RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|

RCC_APB2Periph_AFIO,ENABLE);

//IO口复用功能时钟

/*SetPD.00(D2),PD.01(D3),PD.04(NOE),PD.05(NWE),PD.08(D13),PD.09(D14),

PD.10(D15),PD.14(D0),PD.15(D1)asalternate

functionpushpull*/

/*D端口初始化*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|

GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|

GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOD,&

GPIO_InitStructure);

/*E端口初始化*/

/*SetPE.07(D4),PE.08(D5),PE.09(D6),PE.10(D7),PE.11(D8),PE.12(D9),PE.13(D10),

PE.14(D11),PE.15(D12)asalternatefunctionpushpull*/

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

//将配置写入GPIOE管脚

/*A0地址线*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_Init(GPIOF,&

/*SetPG.12(NE4(LCD/CS))asalternatefunctionpushpull-CE3(LCD/CS)*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;

GPIO_Init(GPIOG,&

/*复位端口PE6*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_ResetBits(GPIOE,GPIO_Pin_6);

//复位脚

DelayMs(50);

//延时50ms

GPIO_SetBits(GPIOE,GPIO_Pin_6);

//将复位脚拉高

}

细心观察,能够发现就是上面说的那些引脚嘛!

2、接下来的就是比较重要的FSMC的配置了

先上代码,然后慢慢分析吧

voidLCD_FSMCConfig(void)

FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;

FSMC_NORSRAMTimingInitTypeDefp;

/*--FSMCConfiguration------------------------------------------------------*/

/*-----------------------SRAMBank4----------------------------------------*/

/*FSMC_Bank1_NORSRAM4configuration*/

p.FSMC_AddressSetupTime=0;

p.FSMC_AddressHoldTime=0;

p.FSMC_DataSetupTime=2;

p.FSMC_BusTurnAroundDuration=0;

p.FSMC_CLKDivision=0;

p.FSMC_DataLatency=0;

p.FSMC_AccessMode=FSMC_AccessMode_A;

/*

ColorLCDconfiguration------------------------------------

LCDconfiguredasfollow:

-Data/AddressMUX=Disable

-MemoryType=SRAM

-DataWidth=16bit

-WriteOperation=Enable

-ExtendedMode=Enable

-AsynchronousWait=Disable

*/

FSMC_NORSRAMInitStructure.FSMC_Bank=FSMC_Bank1_NORSRAM4;

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux=FSMC_DataAddressMux_Disable;

FSMC_NORSRAMInitStructure.FSMC_MemoryType=FSMC_MemoryType_SRAM;

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_AsyncWait=FSMC_AsyncWait_Disable;

FSMC_NORSRAMInitStructure.FSMC_WriteBurst=FSMC_WriteBurst_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct=&

p;

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct=&

FSMC_NORSRAMInit(&

FSMC_NORSRAMInitStructure);

/*BANK4(ofNOR/SRAMBank1~4)isenabled*/

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4,ENABLE);

a、首先是时间参数的配置,我们在初始化的时候设置的bank4,所以这里对应的也是bank4,本函数主要使用了两种类型的结构体对FSMC进行配置,第一种

为FSMC_NORSRAMInitTypeDef类型的结构体主要用于NORFLASH的模式配置,包括存储器类型、数据宽度等。

另一种的类型为FSMC_NORSRAMTimingInitTypeDef

首先是这个结构体FSMC_NORSRAMTimingInitTypeDef,找到他的定义:

成员变量有

uint32_tFSMC_AccessMode

uint32_tFSMC_AddressHoldTime

uint32_tFSMC_AddressSetupTime

uint32_tFSMC_BusTurnAroundDuration

uint32_tFSMC_CLKDivision

uint32_tFSMC_DataLatency

uint32_tFSMC_DataSetupTime

FSMC_AccessMode:

Specifiestheasynchronousaccessmode,用于同步模式,它的取值有以下几种,参考手册上面显示:

模式A——SRAM/PSRAM(CRAM)OE翻转,所以这里我们选择的是模式A

#define

FSMC_AccessMode_A((uint32_t)0x00000000)

FSMC_AccessMode_B((uint32_t)0x10000000)

FSMC_AccessMode_C((uint32_t)0x20000000)

FSMC_AccessMode_D((uint32_t)0x30000000

FSMC_AddressHoldTime:

DefinesthenumberofHCLKcyclestoconfigurethedurationoftheaddressholdtime.Thisparametercanbeavaluebetween0and0xF.地址保持的时钟周期!

FSMC_AddressSetupTime:

DefinesthenumberofHCLKcyclestoconfigurethedurationoftheaddresssetuptime.Thisparametercanbeavaluebetween0and0xF.明显是地址建立飞时间周期

FSMC_BusTurnAroundDuration:

DefinesthenumberofHCLKcyclestoconfigurethedurationofthebusturnaround.Thisparametercanbeavaluebetween0and0xF.这个应该是指总线翻转周期么,不是很了解

FSMC_CLKDivision:

DefinestheperiodofCLKclockoutputsignal,expressedinnumberofHCLKcycles.Thisparametercanbeavaluebetween1and0xF

明显是指HCLK的分频系数

FSMC_DataLatency:

Definesthenumberofmemoryclockcyclestoissuetothememorybeforegettingthefirstdata.Thevalueofthisparameterdependsonthememorytypeasshownbelow:

Itmustbesetto0incaseofaCRAM

Itisdon'

tcareinasynchronousNOR,SRAMorROMaccesses

Itmayassumeavaluebetween0and0xFinNORFlashmemorieswithsynchronousburstmodeenable

数据延迟时间注意了,这个可是有限制的,在我们控制LCD的时候倒是不用管它,应该是可以设为0的

FSMC_DataSetupTime:

这个相应的就是数据的建立时间了

通过对比,发现上述配置是可行的,不过大家也可以按照要求更改。

理论上,在速度要求不是很高的场合,大一点是没有关系的,但是下限得注意,具体是多少,我也走不知道,等以后再说吧!

然后就是看这个结构体了FSMC_NORSRAMInitStructure,成员如下:

uint32_t

FSMC_AsynchronousWait

FSMC_Bank

FSMC_BurstAccessMode

FSMC_DataAddressMux

FSMC_ExtendedMode

FSMC_MemoryDataWidth

FSMC_MemoryType

FSMC_NORSRAMTimingInitTypeDef*

FSMC_ReadWriteTimingStruct

FSMC_WaitSignal

FSMC_WaitSignalActive

FSMC_WaitSignalPolarity

FSMC_WrapMode

FSMC_WriteBurst

FSMC_WriteOperation

FSMC_WriteTimingStruct

似乎有些复杂,同时也说明了它的功能强大吧!

FSMC_AsynchronousWait:

Enablesordisableswaitsignalduringasynchronoustransfers,validonlywithasynchronousFlashmemories,明显就是使能等待同步信号否?

FSMC_Bank:

这个应该是bank的选择吧,明显取值有以下几种:

FSMC_Bank1_NORSRAM1((uint32_t)0x00000000)

FSMC_Bank1_NORSRAM2((uint32_t)0x00000002)

FSMC_Bank1_NORSRAM3((uint32_t)0x00000004)

FSMC_Bank1_NORSRAM4((uint32_t)0x00000006)

FSMC_BurstAccessMode:

EnablesordisablestheburstaccessmodeforFlashmemory,validonlywithsynchronousburstFlashmemories.这个什么呢?

不懂继续看吧!

FSMC_DataAddressMux:

Specifieswhethertheaddressanddatavaluesaremultiplexedonthedatabusornot,数据地址引脚是否复用,明显这里我们不需要!

FSMC_ExtendedMode:

Enablesordisablestheextendedmode.,外扩模式否?

应该是不用的

FSMC_MemoryDataWidth:

位宽,我使用的是16位的TFT,所以应该是16,看看取值

果然:

FSMC_MemoryDataWidth_16b((uint32_t)0x00000010)

#d

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2