一、FSMC简介
外部存储器接口(FSMC)是STM32系列芯片中的一部分,提供了对外部存储器的控制。这些存储器可以是 SRAM、 NOR Flash 或NAND Flash 等设备。FSMC 具有16位总线宽度,支持异步访问和同步访问。
二、FSMC的重要性
由于内部闪存空间有限,无法满足大型应用程序或数据存储的需求,因此外部存储器是必不可少的。FSMC 可以直接访问外部存储器,而不需要使用微控制器来管理存储器。这大大提高了访问速度和效率。FSMC具有一些额外的特征,可以使我们的设计实现高速读取操作。
三、FSMC的使用方法
FSMC 能够接口各种类型的存储器,包括常用的 SRAM、 NOR Flash、 NAND Flash 和 PSEUDO SRAM。下面都会使用常用的 NOR Flash 来举例说明。
FSMC_NOR_InitTypeDef NOR_InitStructure; /* NOR device configuration */ NOR_InitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; NOR_InitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; NOR_InitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; NOR_InitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; NOR_InitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; NOR_InitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; NOR_InitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; NOR_InitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; NOR_InitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; NOR_InitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; NOR_InitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; NOR_InitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; NOR_InitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; NOR_InitStructure.FSMC_ReadWriteTimingStruct = &Timing; NOR_InitStructure.FSMC_WriteTimingStruct = &Timing; FSMC_NOR_Init(&NOR_InitStructure);
上述代码中,FSMC_NOR_InitTypeDef 是一个结构体,其中包含了许多与 NOR Flash 相关的参数。相应参数的作用注释在代码中已经给出,我们可以根据实际情况设置这些参数。
四、FSMC的读写操作
我们可以使用 FSMC 的数据读写命令对 NOR Flash 进行数据读写操作,以下是 NOR Flash 读操作的代码实现。
#define NOR_FLASH_START_ADDR ((uint32_t)0x64000000) #define NOR_FLASH_END_ADDR ((uint32_t)0x640FFFFF) #define NOR_FLASH_SIZE ((uint32_t)0x00100000) #define BUFFER_SIZE ((uint32_t)0x400) uint16_t *pNOR_Address = (uint16_t *)NOR_FLASH_START_ADDR; /* Read a half-word from the NOR memory */ uint16_t NOR_ReadHalfWord(uint32_t uwStartAddress) { return (*(__IO uint16_t *)uwStartAddress); }
以上代码中,我们首先定义了 NOR Flash 存储器的地址范围,并用它们来声明一个指针。然后,我们定义了一个 NOR_ReadHalfWord 函数来执行实际的读取操作。该函数接收一个地址参数,该参数指定要读取的数据的存储器地址。函数返回 NOR 存储器中指定地址处的半字。
五、FSMC时序要求
在使用 FSMC 时,需要留意 FSMC 对时序的要求。下面是官方文档中给出的时序描述:
- 数据脉冲的前沿必须在WP下降沿到来前后5ns内;
- 数据脉冲的后沿必须在下降沿到来14ns后前后5ns内结束;
- 数据可以在WAIT信号有效时被保持,WAIT 下降沿前后5ns内必须保持数据不变;
- 存储器访问时间是相对于A相位的;
- 随机读取最快速度是60ns
六、FSMC的常见问题
1、FSMC的接口配置错误
这种问题通常是由于没有正确配置 FSMC 导致的。当发生这种问题时,可以使用示波器或逻辑分析器来查看 FSMC 的数据总线、地址总线和控制总线上的信号。如果有某些信号出现问题,则是接口配置错误的明显信号。
2、Flash编程错误
在编写 Flash 编程结束后,一些程序员可能会发现他们的代码无法正常工作。如果在同一个位置反复写同一个值,数据值不变,那么问题很可能是编程错误。发生这种情况时,检查代码中的变量类型以及对存储器地址的处理方式。
3、FSMC初始化错误
在初始化 FSMC 时,如果没有正确匹配 NOR Flash 的大小和类型,那么很可能会发生初始化错误,并导致存储器无法正常读写。在初始化 FSMC 时,一定要确保所有参数正确匹配。
4、时序错误
如果时序设置不正确,数据读写操作就会失败。因此,在进行这些操作之前,请仔细阅读数据表以了解 FSMC 的相关参数。
原创文章,作者:ZDGRN,如若转载,请注明出处:https://www.506064.com/n/334168.html