您好,登录后才能下订单哦!
STM32的FSMC外设是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Flexible static memory controller(FSMC)灵活的静态存储控制器。FSMC可以连接异步或同步存储器或16位PC存储卡,主要用途有:
将 AHB 数据通信事务转换为适当的外部器件协议
满足外部器件的访问时序要求
所有外部存储器共享地址、数据和控制信号,但有各自的片选信号。FSMC 一次只能访问一个外部器件。
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存储器。
△FSMC框图示意
AHB设备接口可以使内部CPU和其他主总线外设去访问外部存储器。AHB事务可以传输外部设备协议。特别是当外部存储器被选择位8位或16位,32位的AHB传输传输事务会被划分为多个连续的8位或16的传输事务。片选会在每次访问时切换。
通用事务规则要求AHB传输数据宽度必须是8位、16位或32位。但是访问外部数据必须有个固定的数据宽度。这可能导致不一样的传输。
因此必须遵循一些简单的事务规则:
AHB事务数据宽度必须和存储器数据宽度相同。在这种情况下不会出问题;
AHB事务数据宽度大于存储器数据宽度,在这种情况下,FSMC会将AHB事务分为多个连续的存储器访问,这样符合外部存储器访问数据宽度;
AHB事务数据小存储器宽度,在这种情况下,异步传输可能一致,也可能不一致,这取决于外部设备的类型。
对设备的异步访问要具有字节选择功能(SRAM,ROM,PSRAM),①FSMC 允许写入事务通过其字节选择通道 NBL[1:0] 访问恰当的数据,②允许读取事务。会读取所有存储器字节,并将丢弃无用的存储器字节。 NBL[1:0]在读取事务期间保持为低电平。
对不具有字节选择功能的器件( 16 位 NOR 和 NAND Flash)进行异步访问,当请求对 16 位宽的 Flash 存储器进行字节访问时会发生此情形。
显然,不能在字节模式下访问此器件(只能针对 Flash 存储器读取或写入 16 位字),因此①不允许写入事务,②允许读取事务。会读取所有存储器字节,并将丢弃无用的存储器字节。 NBL[1:0]在读取事务期间保持低电平。
FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块:
块1被用于4个NORflash或者PSRAM内存设备。块1被划分为4块NORflash/PSRAM带有独立的片选信号。
块2和块3用于连接NANDflash(一个块驱动一个设备)
块4用于连接PC块设备
对于每个存储区域,所要使用的存储器类型由用户在配置寄存器中定义
HADDR[25:0] 包含外部存储器地址。由于HADDR为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下表所示:
非复用 I/OPSRAM/SRAM
注意:前缀“N”表示相关的信号为低电平有效
▽模式1写访问
▽模式A写访问
与模式1的不同之处在于NOE 的切换与独立的读取和写入时序
对于模式A,
ADDSET就是NWE的高电平时间,也就是地址建立时间
DATAST就是NWE的低电平时间,也就是数据保持时间
readWriteTiming.FSMC_AddressSetupTime = 0x02; //地址建立时间(ADDSET)为2个HCLK 2*1/120M=16ns readWriteTiming.FSMC_AddressHoldTime = 0x02; //地址保持时间(ADDHLD),16ns readWriteTiming.FSMC_DataSetupTime = 0x06; //数据建立时间,50ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//总线恢复时间 readWriteTiming.FSMC_CLKDivision = 0x00;// 时钟分频因子 readWriteTiming.FSMC_DataLatency = 0x00;//数据产生时间 readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_AddressSetupTime:这些位定义地址的建立时间,适用于SRAM、ROM和异步总线复用模式的NOR闪存操作。
FSMC_AddressHoldTime :这些位定义地址的保持时间,适用于SRAM、ROM和异步总线复用模式的NOR闪存操作。
FSMC_DataSetupTime:这些位定义数据的保持时间,适用于SRAM、ROM和异步总线复用模式的NOR闪存操作。
FSMC_BusTurnAroundDuration:这些位用于定义一次读操作之后在总线上的延迟(仅适用于总线复用模式的NOR闪存操作),一次读操作之后控制器需要在数据总线上为下次操作送出地址,这个延迟就是为了防止总线冲突。如果扩展的存储器系统不包含总线复用模式的存储器,或最慢的存储器可以在6个HCLK时钟周期内将数据总线恢复到高阻状态,可以设置这个参数为其最小值。
FSMC_CLKDivision :定义CLK时钟输出信号的周期,以HCLK周期数表示。
FSMC_DataLatency:处于同步成组模式的NOR闪存,需要定义在读取第一个数据之前等待的存储器周期数目。这个时间参数不是以HCLK表示,而是以闪存时钟(CLK)表示。在访问异步NOR闪存、SRAM或ROM时,这个参数不起作用。操作CRAM时,这个参数必须为0
FSMC_AccessMode :访问模式
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;// 这里我们使用NE1 ,也就对应BTCR[6],[7]。 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不复用数据地址 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存储器数据宽度为8bit FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//读写时序 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//写时序
FSMC_Bank:nor被分为四块,其中这个参数是说明对那个块编程
FSMC_DataAddressMux:地址\数据是否复用
FSMC_MemoryType:存储器类型
FSMC_MemoryDataWidth:数据总线宽度8位/16位
FSMC_BurstAccessMode:是否进行成组模式访问
FSMC_WaitSignalPolarity:等待信号有效级性
FSMC_WrapMode:该位决定控制器是否支持把非对齐的AHB成组操作分割成2次线性操作;该位仅在存储器的成组模式下有效。
FSMC_WaitSignalActive:当闪存存储器处于成组传输模式时,NWAIT信号指示从闪存存储器出来的数据是否有效或是否需要插入等待周期。该位决定存储器是在等待状态之前的一个时钟周期产生NWAIT信号,还是在等待状态期间产生NWAIT信号。
FSMC_WriteOperation:该位指示FSMC是否允许/禁止对存储器的写操作。
FSMC_WaitSignal:当闪存存储器处于成组传输模式时,这一位允许/禁止通过NWAIT信号插入等待状态。
FSMC_ExtendedMode:该位允许FSMC使用FSMC_BWTR寄存器,即允许读和写使用不同的时序。
FSMC_WriteBurst:对于处于成组传输模式的闪存存储器,这一位允许/禁止通过NWAIT信号插入等待状态。读操作的同步成组传输协议使能位是FSMC_BCRx寄存器的BURSTEN位。
FSMC_ReadWriteTimingStruct:读时序配置指针
FSMC_WriteTimingStruct:写时序配置指针
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。