FSMC静态存储器控制器
- 格式:doc
- 大小:99.50 KB
- 文档页数:7
一、基本概念(详细内容见st网站stm32应用笔记AN2784)1. FSMC配置控制一个NOR闪存存储器,需要FSMC提供下述功能:●选择合适的存储块映射NOR闪存存储器:共有4个独立的存储块可以用于与NOR闪存、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。
●使用或禁止地址/数据总线的复用功能。
●选择所用的存储器类型:NOR闪存、SRAM或PSRAM。
●定义外部存储器的数据总线宽度:8或16位。
●使用或关闭同步NOR闪存存储器的突发访问模式。
●配置等待信号的使用:开启或关闭,极性设置,时序配置。
●使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。
因为NOR闪存/SRAM控制器可以支持异步和同步存储器,用户只须根据存储器的参数配置使用到的参数。
FSMC提供了一些可编程的参数,可以正确地与外部存储器接口。
依存储器类型的不同,有些参数是不需要的。
当使用一个外部异步存储器时,用户必须按照存储器的数据手册给出的时序数据,计算和设置下列参数:●ADDSET:地址建立时间●ADDHOLD:地址保持时间●DATAST:数据建立时间●ACCMOD:访问模式这个参数允许FSMC可以灵活地访问多种异步的静态存储器。
共有4种扩展模式允许以不同的时序分别读写存储器。
在扩展模式下,FSMC_BTR用于配置读操作,FSMC_BWR用于配置写操作。
(译注:如果读时序与写时序相同,只须使用FSMC_BTR即可。
)如果使用了同步的存储器,用户必须计算和设置下述参数:●CLKDIV:时钟分频系数●DATLAT:数据延时如果存储器支持的话,NOR闪存的读操作可以是同步的,而写操作仍然是异步的。
当对一个同步的NOR闪存编程时,存储器会自动地在同步与异步之间切换;因此,必须正确地设置所有的参数。
2. 时序计算如上所述,对于异步NOR闪存存储器或类似的存储,有不同的访问协议。
首先要确定对特定存储器所需要使用的操作协议,选择的依据是不同的控制信号和存储器在读或写操作中的动作。
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对外部设备的地址映像从0x6000 0000开始,到0x9FFF FFFF 结束,共分4个地址块,每个地址块256M字节。
可以看出,每个地址块又分为4个分地址块,大小64M。
对NOR的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下页表格。
而这四个分存储块的片选,则使用NE[4:1]来选择。
数据线/地址线/控制线是共享的。
NE1 ->Bank1 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地址线,每个地址对应一个字节单元。
基于FSMC接口的CF卡数据存储系统设计作者:刘振海骆冬根王改董浩洪津来源:《现代电子技术》2019年第10期摘 ;要:针对现有的嵌入式存储系统中存在的存储速度慢、接口复杂等问题,提出并实现一种基于Compact FLASH(CF)卡和STM32微处理器的数据存储系统,并进行了FatFs文件系统移植。
该系统通过STM32微处理器带有的灵活的静态存储器控制器(FSMC)接口实现Memory模式下CF卡存储器的扩展,同时,测试并分析实现最大写入速度的条件。
测试结果表明,在CF卡Memory模式下,每次申请扇区数为128时,可以达到最大10 MB/s的平均连续写入速度;该方案存储速度快、实现简单,适用于对存储速度和容量均有要求的场合。
关键词:数据存储系统; STM32微处理器; FSMC接口; Compact FLASH卡; Memory模式; FatFs中图分类号: TN919⁃34; TP274; TP216 ; ; ; ; ;文献标识码: A ; ; ; ; ; ; ; ; 文章编号:1004⁃373X(2019)10⁃0015⁃04Design of CF card data storage system based on FSMC interfaceLIU Zhenhai1,2, LUO Donggen1, WANG Gai1, DONG Hao1, HONG Jin1(1. Key Laboratory of Optical Calibration and Characterization, Anhui Institute of Optics and Fine Mechanics, Chinese Academy of Sciences, Hefei 230031, China; 2. University of Chinese Academy of Sciences, Beijing 100039, China)Abstract: In allusion to the slow storage speed and complex interface problems existing in the current embedded storage system, a data storage system based on the Compact FLASH (CF) card and STM32 microprocessor is proposed and implemented, and the FatFs file system is transplanted. In the system, the CF card memory expansion in the Memory mode is realized by using the flexible static memory controller (FSMC) interface provided by the STM32 microprocessor. The conditions for achieving the maximum write⁃in speed are tested and analyzed. The test results show that the average continuous write⁃in speed of the system can reach up to 10 MB/s as the sector number applied for each time is 128 in the Memory mode of the CF card, and the scheme has a fast storage speed, is easy to be implemented, and applicable in occasions where both the storage speed and capacity requirements are needed.Keywords: data storage system; STM32 microprocessor; FSMC interface; Compact FLASH card; Memory mode; FatFsSD卡和Micro SD卡工作模式类似,支持SD和SPI两种操作模式,硬件电路接口简单,但软件协议复杂,且支持SD模式的控制器较少,一般应用中采用SPI模式[1⁃5]。
0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!4、液晶触摸画板4.1实验简介本实验向大家介绍如何使用STM32的FSMC接口驱动LCD屏,及使用触摸屏控制器检测触点坐标。
4.2 LCD控制器简介LCD,即液晶显示器,因为其功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互,目前仍是各种电子显示设备的主流。
因为STM32内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有这些驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32芯片通过驱动芯片来控制液晶屏和触摸屏。
以野火3.2寸液晶屏(240*320)为例,它使用ILI9341芯片控制液晶屏,通过TSC2046芯片控制触摸屏。
4.2.1 ILI9341控制器结构液晶屏的控制芯片内部结构非常复杂,见错误!未找到引用源。
最主要的是位于中间GRAM(Graphics RAM),可以理解为显存。
GRAM中每个存储单元都对应着液晶面板的一个像素点。
它右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。
框图的左上角为ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是6、16还是18位;使用SPI接口还是8080接口与MCU进行通讯;使用8080接口的哪种模式。
FSMC TFTLCD接口配置学习笔记一、FSMC概要:灵活的静态存储器控制器。
使用FSMC的优点:1、支持多种静态存储器类型。
2、支持代码从FSMC扩展的外部存储器中直接运行。
3、代码书写简单。
FSMC有两种控制器1、NOR memory control2、NAND/PC CARD memory control100脚和144脚100脚FSMC 只能使用BANK1或BANK2 只有PD7144脚FSMC 则有BANK1-4都可以。
BANKx由NEx来配置。
FSMC包含四个主要模块:1)、AHB接口(包含FSMC配置寄存器)2)、NOR闪存和PSRAM控制器3)、NAND闪存和PC卡控制器4)、外部设备接口二、LCD接口LCD目前大多是接到SRAM/NOR控制器上的非地址锁存,所以不能接到NAND 直接用。
LCD8080和6800接口比较8080模式:RSCSRDWRD0-D156800模式:RSCSER/WD0-D15比较明显8080和6800接口上,仅仅是读写线的差别。
参考AN2790E脚接与非门或者用普通IO口连接使用!还没有应用过6800的液晶,字符型液晶用的口没有CS脚,只有V o 、E 、RS 、RW和A、K。
三、下面根据程序做讲解:当RS接FSMC_A16 , CS接FSMC_NE1那么(*((volatile unsigned short *) 0x60000000)) /* RS = 0 */(*((volatile unsigned short *) 0x60020000)) /* RS = 1 */因为CS接FSMC_NE1 所以HADDR[27:26]为00因为RS接FSMC_A16,第17位置1,所以RS=0为0x60000000, RS=1 0x60020000。
对应的程序也是需要修改:FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;。
基于STM32的电能质量检测技术研究近些年来,随着现代化工业设备和民用电器设备的普及,电力用户对供电质量的要求越来越高。
特别是大量非线性电力负荷用到日常生活和工业生产中,使得公用电网中的电能质量问题愈显凸出,已经严重影响了电能供应质量。
因此,根据国家电能质量检测标准,有必要对电网供电的各项参数进行测试,分析电网的电能质量。
国内外已有不少方法对电能质量进行检测。
但是传统的基于8、16位的单片机的电能检测设备存在处理速度慢,硬件结构不够完善等缺点。
而当下比较流行的运用DSP处理器的电能检测设备,虽然其处理速度快、精度高,但是成本较高、功耗大,不利于大规模的推广[1]。
本文提出一种基于STM32芯片以内嵌入式智能仪器模式设计的方案。
STM32具有杰出的功耗控制及众多外设。
设计时可充分利用其丰富的片上资源,大大节省了硬件的投资。
利用STM2内置的A/D可对信号进行高速采集和处理,其自带的USB接口可对数据进行快速传输,以及通过电阻式彩色触摸屏TFT对相关数据进行实时显示等。
系统具有设计结构简单、携带方便、低成本、低功耗、可靠性高等优点,适合实时现场操作,具有较高的应用价值。
1电能质量检测设备总体设计方案本电能质量检测系统的主要设计思路是:根据国家制定的电能质量相关标准对系统进行设计、开发,系统框图如图1所示。
通过高精度的模拟信号采集电路对公用电网的电压、电流进行采集;通过FFT算法对谐波进行检测分析,以及运用电能检测芯片对电压幅值、电流值、功率因素等一系列参数进行检测;最后将测试结果显示在液晶屏幕上,同时将数据存储在SD 卡上,检测设备之间可以通过2.4 G无线通信模块进行数据交换,还可运用USB通信接口传输实时的数据到上位机,以便上位机对数据进行存储和分析[2-5]。
2硬件设计2.1STM32处理器介绍本系统采用的是由意法半导体公司推出的基于ARMCortex-M3内核的STM32F103RBT6增强型32位处理器。
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位的存储空间,一个是DA TA 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的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下页表格。
而这四个分存储块的片选,则使用NE[4:1]来选择。
数据线/地址线/控制线是共享的。
NE1 ->Bank1 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]一一对应。
在应用的时候,可以将F SMC_A总线连接到存储器或其他外设的地址总线引脚上。
例:STM32F10XX FCMS控制LCD的驱动FSMC提供了所有的LCD控制器的信号:FSMC_D[16:0] 16bit的数据总线FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4FSMC NOE:输出使能,连接LCD的RD脚。
FSMC NWE:写使能,连接LCD的RW脚。
FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。
注:RS =0时,表示读写寄存器;RS =1表示读写数据RAM。
举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们访问LCD显示RAM的基址为0 x6002 0000,访问LCD寄存器的地址为:0x6000 0000。
因为数据长度为16bit ,所以FSMC_A[24:0]对应HADDR[2 5:1] 所以显示RAM的基址=0x60000000+2^16*2=0x60000000+0x2 0000=0x60020000举例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的接口控制,不适用外扩模式。
并且读写操作的时序一样。
此种情况下,我们需要使用三个参数:A DDSET,DATAST,ADDHOLD。
这三个参数在位域FSMC_TCRx中设置。
当HCLK的频率是72MHZ,使用模式B,则有如下时序:地址建立时间:0x1地址保持时间:0x0数据建立时间:0x2注:这里地址建立地址保持数据建立三个时间不知道怎么设出来的。
我是根据别人的经验来设定的。
高手知道这个设置不同有什么区别的话,请指教,谢谢:)/******************************************************************************** 函数名: LCD_CtrlLinesConfig* 参数: 无* 返回: 无* 功能: 配置LCD控制口线,FSMC管脚设置为复用功能*/static void LCD_CtrlLinesConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 使能 FSMC, GPIOD, GPIOE, GPIOF, GPIOG 和 AFIO 时钟 */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |RCC_APB2Periph_AFIO, ENABLE);/* 设置 PD.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) 为复用推挽输出 */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);/* 设置 PE.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) 为复用推挽输出 *//* PE3,PE4 用于A19, A20, STM32F103ZE-EK(REV 2.0)必须使能 *//* PE5,PE6 用于A19, A20, STM32F103ZE-EK(REV 2.0)必须使能 */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);/* 设置 PF.00(A0 (RS)) 为复用推挽输出 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOF, &GPIO_InitStructure);/* 设置 PG.12(NE4 (LCD/CS)) 为复用推挽输出 - CE3(LCD /CS) */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_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;/*-- FSMC Configuration ------------------------------------------------------*/ /*----------------------- SRAM Bank 4 ----------------------------------------*/ /* FSMC_Bank1_NORSRAM4 configuration */FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 1;FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0;FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 2;FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_B;/* Color LCD configuration ------------------------------------LCD configured as follow:- Data/Address MUX = Disable- Memory Type = SRAM- Data Width = 16bit- Write Operation = Enable- Extended Mode = Enable- Asynchronous Wait = 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_WriteBurst = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);/* - BANK 3 (of NOR/SRAM Bank 0~3) is enabled */FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);}。