STM32-FSMC理解及与FPGA通讯问题整理

STM32-FSMC理解及与FPGA通讯问题整理
⽬录
1. FSMC基本原理
1)FSMC是什么?
FSMC,灵活静态存储控制器,顾名思义就是STM32 IC去访问外部存储器的⼀种可灵活配置的控制器。通过对相关寄存器的配置,可以访问不同类型的外部存储器,并且满⾜不同存储器的时序要求,实现不同场景及应⽤的灵活通讯。
那么需要配置哪些寄存器呢?硬件如何连接呢?STM32内部的结构是怎么样的呢?
2)FSMC框架
⾸先说下称为FSMC的对应的IC内部的部分及⼤概结构。如下图可以看出以下⼏点:
1)FSMC通过AHB总线访问外部存储器,参考时钟是AHB的时钟。
2)可访问的外部存储器有NOR FLASH、 PSRAM、SRAM、NAND FLASH、 PC卡等;
3)外部存储器是被固定划分的区域,有4个bank,每个bank的控制信号不同,数据地址信号和触发信号是⼀样的。
4)外部存储器的划分如下图,从地址0X6000 0000H-0X9FFF FFFFH的地址区域被划分为4个BANK,
可通过选通信号NE来选择访问哪个BANK,第⼀个bank⽀持的存储器类型是NOR/PSRAM/SRAM, 第⼆和第三个bank⽀持访问NAND FLASH,最后⼀个bank⽀持访问PC卡。
5)上⾯的每个bank⼜划分个4个存储区域,以第⼀个bank为例,划分为等内存空间的NE1, NE2, NE3, NE4。如下图所⽰,通过HADDR[27:26]这两位来选择使⽤哪个存储区。
双重危机
6)上⾯的配置寄存器,主要是指如下的3个寄存器的配置,⽚选以及时序。
2. FSMC实现
1)硬件连接
STM32通过控制信号,以及地址和数据线连接到外设上,使⽤的是GPIO⼝的复⽤PIN。如下所⽰位PSRAM和SRAM的连接PIN定义。在STM32的⼿册中,分别对不同的外设以及是否复⽤I/O分别进⾏了PIN的接⼝定义。
这⾥的复⽤I/O指,如下所⽰,AD既可以作为地址线也可以作为数据线。
2)软件code
FSMC部分的软件配置主要是FSMC的初始化,即FSMC的时钟配置,接⼝配置,复⽤功能配置,时序配置,以及上⾯的寄存器的配
置。如下:
void FSMC_FPGA_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
//clock set
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//enable PD  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);// enable FSMC clock
// FSMC pin of GPIO D,E,F,G  set
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pi  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
//set I/O function,and assert PIN signal
// fsmc data
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
chart控件
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
路网GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12
GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
/control signal
GPIO_PinAFConfig(GPIOD,GPIO_PinSource3,GPIO_AF_FSMC);//CLK
GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);//OE
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);//WE
GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC); //CS1
GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FSMC);//LB
GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FSMC);//UB
//address
GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);//PF0,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC);//PF1,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC);//PF2,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC);//PF3,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC);//PF4,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC);//PF5,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC);//PF13,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC);//PF14,AF12
GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC);//PF15,AF12
GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC);
天津港劳务发展有限公司GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FSMC);
// fsmc regiter set, every paramter of register setting
readWriteTiming.FSMC_AddressSetupTime = 0x02;  //one HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x0F;//0x00;
readWriteTiming.FSMC_DataSetupTime = 0xFF;//0x03;
readWriteTiming.FSMC_BusTurnAroundDuration = 0x04;
readWriteTiming.FSMC_CLKDivision = 0x07; //168 / 8 = 21 mhz
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;
//the content value of fsmc register struct
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;银川市商业银行
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_AsynchronousWait=FSMC_AsynchronousWait_Disable;
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;
//register address mapping
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //init fsmc set
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // enable bank1
}
3. 问题整理

本文发布于:2024-09-20 20:25:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/651382.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   存储器   地址   信号   访问   连接   寄存器   划分
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议