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

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5292)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在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&功能
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)外部设备接口
LCD有如下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线.
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这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。
调试FSMC总线复用模式时主要遇到以下几点:
1、寄存器的配置,首先注意使能地址数据复用,其次要存储器类型选择FSMC_MemoryType_NOR,否则出现不了NADV信号。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux =
FSMC_DataAddressMux_E
FSMC_NORSRAMInitStructure.FSMC_MemoryType =
FSMC_MemoryType_NOR;
2、注意个GPIO复用功能的使能,以及时钟确定使能。
3、地址总线。在16位模式访问时,访问地址的[25..0]位必须先左移一位.。才能正确输出地址信号,原因是,STM32会将地址右移一位后在输出。如果输出前不左移,会导致输出地址错误。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。测试STM32F101VC中,fsmc地址/数据复用问题 - 【stm32/stm8】 - 电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 6169|回复: 19
测试STM32F101VC中,fsmc地址/数据复用问题
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
请教各位同学:uart5初始化代码如下:&&&&//&Enable&USART2,&USART3,&USART4,&USART5&clocks&&&&RCC_APB1PeriphClockCmd&(RCC_APB1Periph_USART2&|&&&&&&&&&&&&&&&&&&&&RCC_APB1Periph_USART3&|&&&&&&&&&&&&RCC_APB1Periph_UART4&|&&&&&&&&&&&&&&&&&&&&&&&&&RCC_APB1Periph_UART5,&&&&&&&&&&&&ENABLE);//&Configure&UART5&Tx&(PC.12)&as&alternate&function&push-pull&&&&&&&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_12;&&&&&&&&GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;&&&&&&&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_AF_PP;&&&&&&&&GPIO_Init&(GPIOC,&&GPIO_InitStructure);&&&&&&&&//&Configure&UART5&Rx&(PD.02)&as&input&floating&&&&&&&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_2;&&&&&&&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_IN_FLOATING;&&&&&&&&GPIO_Init&(GPIOD,&&GPIO_InitStructure);&&&&&&&&//&Configure&UART5&mode&&&&&&&&USART_Init&(UART5,&&USART_InitStructure);&&&&&&&&USART_ClockInit&(UART5,&&USART_ClockInitStruct);&&&&&&&&//&Enable&the&UART5&&&&&&&&USART_Cmd&(UART5,&ENABLE);目前在uart5串口上输出数据不正确,即输出后测量pin80没有波形。usart1~usart3和uart4测试正常,初始化代码是类似的。另,STM32f101VC的低16位地址是和数据线复用的,目前读写控制线波形正常,高8位地址输出正常,但NADV信号一直维持高电平不变,是否下面的代码有错:&//&Enable&DMA&and&FSMC&clocks&RCC_AHBPeriphClockCmd&(RCC_AHBPeriph_DMA1&|&&&&&&&&&&&&&&&&&&&&&&&&&RCC_AHBPeriph_DMA2&|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RCC_AHBPeriph_FSMC,&&&&&&&&&&&&&&&&&&&&&&&&&ENABLE);&&&&//&NADV&configuration&&&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_AF_PP;&&&&GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;&&&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_7;&&&&&&&&//&NADV&&&&GPIO_Init&(GPIOB,&&GPIO_InitStructure);&&&&//--&FSMC&时序配置&------------------------------------------------------&&&&FSMC_ReadWriteTimingStruct.FSMC_AddressSetupTime&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_AddressHoldTime&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_DataSetupTime&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_BusTurnAroundDuration&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_CLKDivision&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_DataLatency&=&15;&&&&FSMC_ReadWriteTimingStruct.FSMC_AccessMode&=&FSMC_AccessMode_B;&&&&FSMC_NORSRAMInitStructure.FSMC_Bank&=&FSMC_Bank1_NORSRAM1;&&&&FSMC_NORSRAMInitStructure.FSMC_DataAddressMux&=&FSMC_DataAddressMux_E&&&&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_AsyncWait&=&FSMC_AsyncWait_D&&&&FSMC_NORSRAMInitStructure.FSMC_WriteBurst&=&FSMC_WriteBurst_D&&&&FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct&=&&FSMC_ReadWriteTimingS&&&&FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct&=&&FSMC_ReadWriteTimingS&&&&FSMC_NORSRAMInit&(&FSMC_NORSRAMInitStructure);&&&&&//&Enable&FSMC&Bank1_SRAM&Bank&&&&FSMC_NORSRAMCmd&(FSMC_Bank1_NORSRAM1,&ENABLE);&&
&&&&&&&&&&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & && &
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
谢谢 ST_ARM ,uart5我稍后测试。
FSMC问题答复:我把MemoryType改为NOR,如下:FSMC_NORSRAMInitStructure.FSMC_MemoryType&=&FSMC_MemoryType_NOR;此时NADV信号正常,低16位地址输出正常。为什么FSMC_MemoryType_SRAM不行呢?我的外设是SRAM。另外发现问题:100pin的STM32F101VC的FSMC接口实际输出的地址线A23-A0是理论值的右移1位。例如我要求写端口0x60ff0010,实际驱动输出的地址线是0x607f8008。是否是FSMC端口16bit宽度的原因?请问各位同学有无出现这个现象?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
uart5正常,程序没有问题,tx输出外挂的MAX202坏了,把输出信号挂死了,一直是‘1’电平,tx只能在‘1’上面驱动出一些小毛刺,所以一开始没注意,惭愧
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
FSMC端口宽度可以设置的
& & & & & & & & & & & & & & & && &
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
&FSMC端口宽度是可以设置的,我想了解的是FSMC的地址线为何与程序中设定相差1bit
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
因为你把FSMC端口宽度设置为16
& & & & & & & & & & & & & & & && &
在线时间0 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 120, 距离下一级还需 80 积分
一粒金砂(中级), 积分 120, 距离下一级还需 80 积分
多谢两位版主
& & & & & & & & & & & & & & & &&&FSMC&memory_type设置为SRAM时无法驱动出NADV问题,还请两位版主确认一下,是ST设计就是如此,还是其它问题。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
如果选择SRAM表示你使用的是非总线复用模式,片选应该是NEx
非总线复用模式没有NADV信号,请参考STM32技术参考手册(第5版)的364页中的表70。请仔细描述你使用的是什么存储器,是否使用STM32的地址/数据总线复用模式。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
我使用的是16bit宽的SRAM,FSMC已经设置为地址/数据总线复用模式。目前的现象是memorytype设置为SRAM时复用模式不正常,memorytype设置为NOR后复用模式正常。此时读写外部SRAM全部正常。从字面上看memorytype为NOR应该是针对NORFLASH,memorytype为SRAM是针对SRAM。我的理解是复用模式应该是在NOR和SRAM类型下都可以的,但实际不是。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
请把FSMC初始化部分的程序贴出来,还有你的线路图
& & & & & & & & & & & & & & & &&&否则很难搞清楚你的配置,也就无法讨论。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
1楼有FSMC的初始化代码
& & & & & & & & & & & & & & & && &
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
我来回答你地址移位的问题
配置成16位宽度后,FSMC内部的地址作了处理,使得逻辑上的A1输出到外部引脚A0;逻辑上的A2输出到外部引脚的A1,以此类推。而逻辑上的A0根本就不出现了。因为既然配置成16位宽度,所以A0都是0,不变咯。ST的stm32,str9都是这样的。另外建议楼主修改你帖子的题目,现在已经严重偏题了。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
to lut1lut
修改题目了thanks
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
回11楼:FSMC设置为地址/数据总线复用模式时应使用NOR类型
& & & & & & & & & & & & & & & &&&请看STM32技术参考手册(第5版)的384页表88,这是复用模式下寄存器的设置,它要求存储器类型MTYP只能是NOR。
在线时间0 小时
TA的帖子TA的资源
宇宙尘埃, 积分 -1, 距离下一级还需 1 积分
宇宙尘埃, 积分 -1, 距离下一级还需 1 积分
100pin的还是可以接sram,
& & & & & & & & & & & & & & & &&&但是类型要配置成NOR了?
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&目前我的测试是这样的
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
FSMC 地址和数据复用
请看STM32技术参考手册(第5版)的392页最下面Bit&1&MUXEN:&Address/data&multiplexing&enable&bit.&&&When&this&bit&is&set,&the&address&and&data&values&are&multiplexed&on&the&databus,&valid&only&with&NOR&Flash&memory:&&&0:&Address/Data&nonmultiplexed&&&1:&Address/Data&multiplexed&on&databus&(default&after&reset)
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
这FSMC还没接触,但感觉就与ARM9接&NOR&FLASH,SDRAM,外设等差不多的。争取玩玩。这个FSMC再加SDRAM信号就VERY&GOOD了!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
FSMC只有16bit的数据总线..比如RAM不够用..我要外扩SRAM的话..那么我有一部分变量的访问不是很慢了吗..32位的数据话应该要寻址2次才能ok吧..&9261就有d0-d31..可以接2片..组成32bit..最近在评估STM32.主要在FSMc这块..
EEWORLD 官方微信
EE福利 唾手可得
Powered by查看: 2657|回复: 14
求教 STM32 FPGA 通过FSMC异步通信
STM32 与FPGA 连接16位的数据线,OE ,WE, NE和NADV,
STM32通过异步NOR FLASH的数据和地址复用方式读写FPGA。 但是STM32和FPGA是相互独立的时钟系统。 这里应该如何设计。
如果对NADV进行两级同步, 可以保证地址锁存的正确性。但是如果再处理数据。需要对NOE两级同步么? 在FPGA的书里,同步器主要是用在单个信号的。 像这种方式不知道如何设计。
希望大家能够提供思路。谢谢。
我觉得这个系统不好,两者耦合应当尽量弱
异步通信还是在FPGA内部做个FIFO比较好,可靠性好点。。。仅供参考。。
随风_98 发表于
异步通信还是在FPGA内部做个FIFO比较好,可靠性好点。。。仅供参考。。
FIFO是需要STM32也采用同步的方式。我这里电路连接已经没有办法变了。没有时钟线。所以必须异步的方式读写。
NJ8888 发表于
我觉得这个系统不好,两者耦合应当尽量弱
问题是硬件没办法变了。就连了那么几根线。
fpga里面做一个双口ram就好了
如果需要获取fpga状态,里面专门做一个状态寄存器
liwei_jlu 发表于
fpga里面做一个双口ram就好了
如果需要获取fpga状态,里面专门做一个状态寄存器 ...
双口ram的端口可以直接连接STM32么? 我只是用过两边都是带同步时钟的双口ram。 可是STM32端没有时钟。
有异步的双口ram IPcore
RAM是有异步接口的,可你STM32端连时钟也没有,这类方法没法用。。。。。。持续关注,不知道大家有啥别的思路没有。。。
随风_98 发表于
RAM是有异步接口的,可你STM32端连时钟也没有,这类方法没法用。。。。。。持续关注,不知道大家有啥别的思 ...
关键是发现FSMC的时钟确实不太好输出哦
之前做local bus slave的时候,也没有做两级同步
银杏公司-XiaomaGee 的博客
【iBoard 电子学堂教程】【STM32通过 FSMC 读写 FPGA示例】
本帖子中包含更多资源
才可以下载或查看,没有帐号?
不错,谢谢分享,有没有更详细的资料呢?
发表于 前天&21:43
银杏公司-XiaomaGee 的博客
【iBoard 电子学堂教程】【STM32通过 FSMC 读写 FPGA示例】
这样直接用沿驱动不怕亚稳态?
发表于 昨天&09:49
你们没用过异步的SRAM 么?
阿莫电子论坛, 原"中国电子开发网"查看: 4592|回复: 0
STM32通过FSMC进行数据读写信号时序
因为工作项目需求,需要使用STM32与FPGA通信进行联合开发,两者通信,自然首选STM32自带的FSMC通信接口。为了搞清楚FSMC的时序与寻址细节,特使用逻辑分析仪对FSMC的8位、16位、32位数据写操作进行了抓取分析,从而得到了FSMC的时序与寻址细节。时间匆忙,少了很多废话的部分,具体的后面再完善吧,具体意图见本文标题。腰好痛啊,最近身体和大脑一直超负荷运转,是该出去转转,出去运动运动了。8位操作方式:对地址65534写8位的数i代码& && &*(vu8*)(Bank1_SRAM3_ADDR+65534)=i;
& && &i++;
对地址65534写8位的数i时序波形 对地址65535写8位的数i代码& && &*(vu8*)(Bank1_SRAM3_ADDR+65534)=i;
& && &i++;
对地址65535写8位的数i时序波形 STM32通过FSMC写8位数据:C代码中地址为实际要写入的地址字节,若将FSMC 的数据位宽配置为16位,则每次寻址实际都寻址了两个字节,例如,FSMC的地址总线值为0,则实际位于地址0有16位,两个字节,因此需要通过高低字节控制信号来区分,即LB和UB信号(注意:所有控制信号都是低电平有效)。例如当希望对地址0上的高字节进行寻址时,则FSMC总线地址值任然为0,同时LB无效(高电平)UB有效(低电平),即可实现对地址0上的高字节单独寻址。假设C代码中的要写入的地址为C_Addr,则实际FSMC总线上地址线的值与LB、UB值的状态为:FSMC_ADDR = C_Addr/2FSMC_LB = C_Addr%2FSMC_UB =~ (C_Addr%2)
16位操作方式:对地址65534写16位的数6555代码& && &*(vu16*)(Bank1_SRAM3_ADDR+6;
对地址65534写16位的数6555时序波形
对地址65535写16位的数6555代码& && &*(vu16*)(Bank1_SRAM3_ADDR+6;
对地址65535写16位的数6555时序波形STM32通过FSMC写16位数据:C代码中地址为实际要写入的地址字节,若将FSMC 的数据位宽配置为16位,则每次寻址实际都寻址了两个字节,例如,FSMC的地址总线值为0,则实际位于地址0有16位,两个字节,因此需要通过高低字节控制信号来区分,即LB和UB信号(注意:所有控制信号都是低电平有效)。例如当希望对地址0上的高字节进行寻址时,则FSMC总线地址值任然为0,同时LB无效(高电平)UB有效(低电平),即可实现对地址0上的高字节单独寻址。假设C代码中的要写入的地址为C_Addr,则实际FSMC总线上地址线的值与LB、UB值的状态为:如果C_Addr为偶数,则FSMC_ADDR = C_Addr/2FSMC_LB = FSMC_UB = 0;FSMC一次性即可完成16位数据的写入。 如果C_Addr为奇数,则实际FSMC会将数据分成两个8位的数据来进行操作,因此效率会低很多。先写C_Addr,写入数据字节为待写入数据的高字节FSMC_ADDR = C_Addr/2FSMC_LB =1;FSMC_UB =0;然后写C_Addr + 1地址,写入数据字节为待写入数据的低字节FSMC_ADDR = (C_Addr + 1) /2FSMC_LB =0;FSMC_UB =1;
32位操作方式:对地址65534写32位的数x134F80)代码& && &*(vu32*)(Bank1_SRAM3_ADDR+65534)= 1265536;
对地址65534写32位的数0x134F80时序波形 对地址65535写32位的数x134F80)代码& && &*(vu32*)(Bank1_SRAM3_ADDR+65535)= 1265536;
对地址65535写32位的数0x134F80时序波形 对地址65536写32位的数x134F80)代码& && &*(vu32*)(Bank1_SRAM3_ADDR+65536)= 1265536;
对地址65536写32位的数0x134F80时序波形
对地址65537写32位的数x134F80)代码& && &*(vu32*)(Bank1_SRAM3_ADDR+65537)= 1265536;
对地址65537写32位的数0x134F80时序波形
STM32通过FSMC写32位数据:C代码中地址为实际要写入的地址字节,若将FSMC 的数据位宽配置为16位,则每次寻址实际都寻址了两个字节,例如,FSMC的地址总线值为0,则实际位于地址0有16位,两个字节,因此需要通过高低字节控制信号来区分,即LB和UB信号(注意:所有控制信号都是低电平有效)。例如当希望对地址0上的高字节进行寻址时,则FSMC总线地址值任然为0,同时LB无效(高电平)UB有效(低电平),即可实现对地址0上的高字节单独寻址。假设C代码中的要写入的起始地址为C_Addr,则实际FSMC总线上地址线的值与LB、UB值的状态为:如果C_Addr为4的倍数,则FSMC首先在起始地址处写入待写入数据的低字节和次低字节:FSMC_ADDR = C_Addr/2FSMC_LB = FSMC_UB = 0;然后FSMC再在起始地址+2处写入待写入数据的低字节和次低字节:FSMC_ADDR = (C_Addr+2)/2FSMC_LB = FSMC_UB = 0;只需要两次16位数据写入操作即可完成一个32位数据的写入,因此效率较高。 如果C_Addr为奇数,则实际FSMC会将数据分成两个8位的数据和一个16位的数据来进行操作,需要3次写入操作才能完成32位数据的写入(效率较低)。FSMC首先在起始地址(C_Addr)位置以8位写入方式写入待写入数据的低字节:FSMC_ADDR = C_Addr/2FSMC_LB = 1;FSMC_UB = 0;然后FSMC再在起始地址+2处(C_Addr + 2)以16位数据方式写入带写入数据的次低字节和次高字节:FSMC_ADDR = (C_Addr+2)/2FSMC_LB = FSMC_UB = 0;最后FSMC再在起始地址+4处(C_Addr + 2)以8位写入方式写入待写入数据的高字节:FSMC_ADDR = (C_Addr+4)/2FSMC_LB = 0;FSMC_UB = 1; 小梅哥FPGA设计思想与验证方法教程系列文档
号于Snow Dream电子工作室
Powered by}

我要回帖

更多关于 stm32f407 fsmc 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信