stm32f103 fsmc fsmc必须通过mtyp位调出nadv信号吗

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5293)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'STM32
FSMC 配置说明',
blogAbstract:'
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}STM32 FSMC说明_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32 FSMC说明
&&关于FSMC通讯协议的说明
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢STM32 FSMC学习笔记
> STM32 FSMC学习笔记
STM32 FSMC学习笔记
当要读数据时,地址由0x改为了0x,这个时候A16就为0了。--------------------------------------------------------------------------------------------------下来就是关于 FSCM时序问题,大家都有讨论:一.当FSMC选择NOR和PSRAM模块时:分为两种:1.异步事务2.同步突发事务异步事务分为普通模式(mode 1,mode 2)和模式1与模式2的4种扩展模式(mode A,B,C,D);二.General timing rules(通用时序规则):1.All controller output signals change on the rising edge of the internal clock (HCLK)(所有输出控制信号在内部时钟(HCLK)的上升沿改变)2.In synchronous read and write mode, the output data changes on the falling edge of thememory clock (FSMC_CLK).(在同步读和写模式下,输出信号在存储器CLK的下降沿改变)三.采样规则The FSMC always samples the data before de-asserting the chip select signal NE. Thisguarantees that the memory data-hold timing constraint is met (chip enable high todata transition, usually 0 ns min.)(FSMC总是在撤销片选信号NE前采样数据,这保证了了储存器数据保持时间的约束能够满足。)四:时序计算设定值都是以Hclk为基本单位的公式:现在没有完全弄明白的是,因为是异步模式,数据通过延迟一个HCLK通知给了对端,地址线上的信号怎么通知对端有效呢?--------------------------------------------------------------------------------------------------下面是一些资料上的数据,可以估算时间是否大概满足应用的要求:--------------------------------------------------------------------------------------------------一些常见问题的FAQ:1.STM32F103 FSMC是不是所有型号都有?本文引用地址:ANS:VC,VD,VE,ZC,ZD,ZE只有这几个型号有。---------------------------------------------------------------------------------------------------------------------------------2.复用和非复用?STM32的FSMC支持数据与地址线复用或非复用两种模式非复用模式:16位数据线及26位地址线分开始用。推荐在144脚及以上的STM32产品上使用该模式。复用模式:低16位数据/地址线复用。在该模式下,推荐使用地址锁存器以区分数据与地址。若不使用锁存器:当NADV为低时,ADx(x=0&15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。若使用锁存器:可同时在ADx上得到Ax和Dx。FSMC中未使用的数据线或地址线可配置为GPIO对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。因此,实际的访问地址为右移一位之后的地址。---------------------------------------------------------------------------------------------------------------------------------3.时序图(扩展模式)普通模式和扩展模式的不同主要用途我觉得,就是把读、写设置成不尽相同的时序。所谓的模式A、B、C、D,其实没多大区别。引用手册原文:The differences with mode1 are the toggling of NADV and the independent read and write timings when extended mode is set。---------------------------------------------------------------------------------------------------------------------------------4.FSMC_NWAIT和FSMC_NE1/FSMC_NCE2.不明白这两个怎么用?ANS:NBL0,NBL1,在STM32F103的数据手册里面有规定IO的,不能随便换.(PSRAM时使用)NWAIT应该是FLASH操作才用的.NE1,NCE2就是一些片选信号.STM32的FSMC支持同时挂多个器件,每个器件都必须有一个CS(也就是NEx,NCEx).NADV(NL)在复用时时所存信号。在非复用模式控制PSRAM输出有效。看了1天的英文资料和论坛,这是我总结出来的一些杂乱的信息,由于刚到嵌入式开发行列,底子太弱,所以先把这些保存下来,供以后使用。下周一实验板就来了,估计花些时间调一下FSMC,再加上DMA的功能,希望能改善产品。PS:纠结了 快一个礼拜。。终于搞定了,现在只需测一下性能,再加上DMA。最后测下DMA对CPU有多少开销就OK了!
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
使用大容量STM32F10xxx的FSMC驱动外部的存储器-应用笔记
下载积分:2500
内容提示:使用大容量STM32F10xxx的FSMC驱动外部的存储器-应用笔记
文档格式:PDF|
浏览次数:78|
上传日期: 09:55:25|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2500 积分
下载此文档
该用户还上传了这些文档
使用大容量STM32F10xxx的FSMC驱动外部的存储器-应用笔记
官方公共微信STM32之FSMC
LCD有如下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线
假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):
如果情况如下:
DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。
WR为0,RD为1(表示是写动作),反过来就是读动作。
RESET一直为高,如果RESET为低,会导致芯片重启。
这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。
如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。
如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。
读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。
好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:
*(volatile unsigned short int *)(0x)=
那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x,如下:
*(volatile unsigned short int *)(0x)=
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0xx里面的Bit17=1,就会导致A16为1。
当要读数据时,地址由0x改为了0x,这个时候A16就为0了。
那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?
先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0xx6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。
第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。
那么上面就完全解决了LCD驱动如何接FSMC的问题,如果读者没懂,建议将上述文字抄上一遍,FSMC手册对应NOR/PRAM的章节抄一遍。还没懂,就继续抄一遍,抄到懂为止。
虽然上述只是针对LCD讲解了FSMC,但是其实对NOR和外部RAM的操作也是类似的,只不过多了些地址线来寻址而已。
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位的存储空间,一个是DATA RAM
一个是CMD RAM)
(3)NAND闪存和PC卡控制器
(4)外部设备接口
注:FSMC可以请求AHB进行数据宽度的操作。如果AHB操作的数据宽度大于外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的数据宽度,以适应外部设备的数据宽度。
FSMC对外部设备的地址映像从0x开始,到0x9FFF
FFFF结束,共分4个地址块,每个地址块256M字节。可以看出,每个地址块又分为4个分地址块,大小64M。对NOR的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下页表格。而这四个分存储块的片选,则使用NE[4:1]来选择。数据线/地址线/控制线是共享的。
NE2-&Bank2&
NE3-&Bank3&
NE4-&Bank4
若 NE1 连接, 则
每小块NOR/PSRAM 64M
&第一块:6000
0000h--63ff ffffh
(DATA长度为8位情况下,由地址线FSMC_A[25:0]决定;DATA长度为16位情况下,由地址线FSMC_A[24:0]决定)
&第二块:6400
0000h--67ff ffffh
&第二块:6800
0000h--6bff ffffh
&第三块:6c00
0000h--6fff ffffh
注:这里的HADDR是需要转换到外部设备的内部AHB地址线,每个地址对应一个字节单元。因此,若外部设备的地址宽度是8位的,则HADDR[25:0]与STM32的CPU引脚FSMC_A[25:0]一一对应,最大可以访问64M字节的空间。若外部设备的地址宽度是16位的,则是HADDR[25:1]与STM32的CPU引脚FSMC_A[24:0]一一对应。在应用的时候,可以将FSMC_A总线连接到存储器或其他外设的地址总线引脚上。
例:STM32F10XX FCMS控制LCD的驱动
&FSMC提供了所有的LCD控制器的信号:
FSMC_D[16:0] ?? 16bit的数据总线
NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4
FSMC NOE:输出使能,连接LCD的RD脚。
FSMC NWE:写使能,连接LCD的RW脚。
Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。
注:RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。
举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们访问LCD显示RAM的基址为0x6002
0000,访问LCD寄存器的地址为:0x。因为数据长度为16bit
,所以FSMC_A[24:0]对应HADDR[25:1]&
所以显示RAM的基址=0x^16*2=0xx2
举例2:选择NOR的第四个存储区,使用FSMC_A0控制LCD的RS脚,则访问LCD显示RAM的基址为0x6c00
0002,访问LCD寄存器的地址为:0x6c00 0000。
FSMC_D[15:0],连16bit数据线;FSMC_NE1,连片选:只有bank1可用
FSMC NOE:输出使能
FSMC NEW:FSMC写使能
FSMC Ax:连接RS,可用范围FSMC_A[24:0]
一般使用模式B来做LCD的接口控制,不适用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用三个参数:ADDSET,DATAST,ADDHOLD。这三个参数在位域FSMC_TCRx中设置。
当HCLK的频率是72MHZ,使用模式B,则有如下时序:
地址建立时间:0x1
地址保持时间:0x0
数据建立时间:0x2
注:这里地址建立 地址保持
数据建立三个时间不知道怎么设出来的。。。。。我是根据别人的经验来设定的。高手知道这个设置不同有什么区别的话,请指教,谢谢:)
static void
LCD_CtrlLinesConfig(void){& GPIO_InitTypeDef
GPIO_InitS& &
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD
| RCC_APB2Periph_GPIOE
|&&&&&&&&&&&&&&&&&&&&&&&&
RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
|&&&&&&&&&&&&&&&&&&&&&&&&
RCC_APB2Periph_AFIO, ENABLE);& &
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_Pin_7;&
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&
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_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6;& GPIO_Init(GPIOE,
&GPIO_InitStructure);&
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_0;& GPIO_Init(GPIOF,
&GPIO_InitStructure);&
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_12;& GPIO_Init(GPIOG,
&GPIO_InitStructure);&
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;&
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&
GPIO_Init(GPIOB,
&GPIO_InitStructure);&
GPIO_SetBits(GPIOB, GPIO_Pin_1);}static void
LCD_FSMCConfig(void){&
FSMC_NORSRAMInitTypeDef&
FSMC_NORSRAMInitS&
FSMC_NORSRAMTimingInitTypeDef&
FSMC_NORSRAMTimingInitStructu&
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime =
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime =
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime =
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration =
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision =
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency =
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode =
FSMC_AccessMode_B;& &
FSMC_NORSRAMInitStructure.FSMC_Bank =
FSMC_Bank1_NORSRAM4;&
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux =
FSMC_DataAddressMux_D&
FSMC_NORSRAMInitStructure.FSMC_MemoryType =
FSMC_MemoryType_SRAM;&
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =
FSMC_MemoryDataWidth_16b;&
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =
FSMC_BurstAccessMode_D&
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity =
FSMC_WaitSignalPolarity_L&
FSMC_NORSRAMInitStructure.FSMC_WrapMode =
FSMC_WrapMode_D&
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive =
FSMC_WaitSignalActive_BeforeWaitS&
FSMC_NORSRAMInitStructure.FSMC_WriteOperation =
FSMC_WriteOperation_E&
FSMC_NORSRAMInitStructure.FSMC_WaitSignal =
FSMC_WaitSignal_D&
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode =
FSMC_ExtendedMode_D&
FSMC_NORSRAMInitStructure.FSMC_WriteBurst =
FSMC_WriteBurst_D&
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =
&FSMC_NORSRAMTimingInitStructu&
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct =
&FSMC_NORSRAMTimingInitStructu&
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);&
& FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4,
ENABLE);}小结:这里使用的地址映射属于BANK1 NOR/PSRAM1&
所以DATA数据基址为0x6c000000 又因为LCD的RS连接在FSMC_A0上
所以CMD地址为0x6c000002。配置好FSMC后,要写DATA或CMD时只要对这两个地址操作就可以了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 stm32f103 fsmc 的文章

 

随机推荐