基于FPGA和STM32的FSMC通信

时间:2025-11-01  作者:Diven  阅读:0

1、FSMC简介:FSMC即灵活的静态存储控制器,FSMC管理1GB空间,拥有4个Bank连接外部存储器,每个Bank有独立的片选信号和独立的时序配置;支持的存储器类型有SRAM、PSRAM、NOR/ONENAND、ROM、LCD接口(支持8080和6800模式)、NANDFlash和16位的PCCard。

基于FPGA和STM32的FSMC通信

2、在设计中将FPGA当做SRAM来驱动,使用库函数来实现FSMC的初始化配置代码如下:

//初始化外部SRAM
void FSMC_SRAM_Init(void)
{    
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure; //定义FSMC初始化的结构体变量
    FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;           //用来设置FSMC读时序和写时序的指针变量
    GPIO_InitTypeDef  GPIO_InitStructure;                                      //初始化FSMC总线的IO口
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);    //开启FSMC的时钟
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14

|GPIO_Pin_15|GPIO_Pin_0|GPIO_Pin_1
    |GPIO_Pin_7|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //IO口配置为复用推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
    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_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    readWriteTiming.FSMC_AddressSetupTime = 14;    
    readWriteTiming.FSMC_AddressHoldTime = 0x00;     
    readWriteTiming.FSMC_DataSetupTime = 16;        
    readWriteTiming.FSMC_BusTurnAroundDuration = 0;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AcceSSMode = FSMC_AcceSSMode_A;  
    

 
    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; 
    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);         
    delay_ms(50);                                     
}

FPGA代码:

//fsmc read / write ep4ce6 demo

Module fsmc(
    ab,     //address
    db,      //data
    wrn,      //wr
    rdn,      //rd
    resetn, //resetn
    csn,      //cs
    clk
    );
    
    input[2:0]    ab;
    inout[15:0] db;
    input wrn;
    input rdn;
    input resetn;
    input csn;
    input clk;
    
    reg [15:0] ina = 16'd0;  //存储数据供ARM读
    reg [15:0] inb = 16'd1;
    reg [15:0] inc = 16'd2;
    reg [15:0] ind = 16'd3;
    reg [15:0] ine = 16'd4;
    reg [15:0] inf = 16'd5;
    reg [15:0] ing = 16'd6;
    reg [15:0] inh = 16'd7;
    
    
   reg [15:0] outa;
   reg [15:0] outb;
   reg [15:0] outc;
   reg [15:0] outd;
   reg [15:0] oute;
   reg [15:0] outf;
   reg [15:0] outg;
   reg [15:0] outh;
    
    wire rd;
    wire wr;
    
    reg [15:0] indata;
    
    assign rd = !(csn & rdn); //get rd pulse  ____|~~~~|______
    assign wr = !(csn & wrn) ; //get wr pulse  ____|~~~~|______
    
    
    assign db = rd? indata:16'hzzzz;
    
    
    //write data, 根据地址线选择八个空间写入,每个空间16位
    always @(negedge wr or negedge resetn)
    begin
        if(!resetn)begin
            outa <= 16'h0000;
            outb <= 16'h0000;
            outc <= 16'h0000;
            outd <= 16'h0000;
            oute <= 16'h0000;
            outf <= 16'h0000;
            outg <= 16'h0000;
            outh <= 16'h0000;
        end    else  begin
        case (ab)            
            3'b000:outa <= db;
            3'b001:outb <= db;
            3'b010:outc <= db;
            3'b011:outd <= db;
            3'b100:oute <= db;
            3'b101:outf <= db;
            3'b110:outg <= db;
            3'b111:outh <= db;
            default:;
        endcase
        end
    end
    
            
    //red data 根据地址线选择8个空间读取,每个空间 16位
    always @(rd or !resetn)
    begin
        if(!resetn)indata <= 16'h0000;
        else  begin
        case (ab)
            3'b000:indata <= ina;
            3'b001:indata <= inb;
            3'b010:indata <= inc;
            3'b011:indata <= ind;
            3'b100:indata <= ine;
            3'b101:indata <= inf;
            3'b110:indata <= ing;
            3'b111:indata <= inh;
            default:;
        endcase
        end
    end    
endModule

猜您喜欢

汽车保险丝作为保护汽车电路安全的重要元件,其作用日益凸显。ZOYI LIGHTING作为知名的汽车照明及电气配件品牌,其汽车保险丝产品因质量可靠、性能优越而受到...
2024-06-20 03:52:30

角钢切断器是专门用于切割角钢的工具,应用于多个领域。在建筑行业中,角钢切断器被用于制作钢结构,帮助快速、准确地切割角钢,以满足不同工程的需求。在制造业,特别是金...
2012-07-25 00:00:00

变容二极管,又称可变电容二极管,是具有电容随施加电压变化而变化特性的半导体器件。应用于各种电子电路中,尤其是在调谐和频率选择领域。本文将探讨变容二极管的主要应用...
2025-04-10 05:30:36

本标准规定了贴片电阻来料检验的项目、方法和判定标准,旨在确保来料质量符合生产需求。 检验项目包括外观、尺寸、电阻值、精度、功率、耐压、焊接性能和包装等。外观检验...
2024-11-26 11:29:51

路由器作为网络连接的核心设备,其应用领域十分。在家庭中,路由器为智能家居设备提供了稳定的网络支持,使得用户能够方便地控制智能灯光、安防摄像头和温控系统等。在企业...
2008-03-07 00:00:00

泛光灯和投光灯因其强大的照明效果和的适用性,已成为各行业不可少的照明工具。在建筑领域,泛光灯常用于夜间照明,突出建筑的美学和结构,提升城市夜景的魅力。在广告行业...
2011-09-07 00:00:00

电路中,电容是个重要的元件。3000法拉电容,很多人都想了解能存多少电。本文将为你解答这个问题。电容的基本概念电容是储存电能的装置。的单位是法拉。法拉越大,储存...
2025-03-25 00:30:02

硬度计附件在测量过程中是非常重要的配件。附件可以提高测量的准确性和可靠性。不同材质和形状的样品需要相应的测量工具,专用附件能够确保测量结果的精准性。硬度计附件能...
2013-08-10 00:00:00

贴片电阻,作为电子电路中不可或缺的元器件,其封装形式对其性能和应用有着重要的影响。贴片电阻的封装通常指的是其外形尺寸和引脚排列方式,它决定了电阻在电路板上的安装...
2024-11-26 11:29:51

内六角圆柱头平弹垫三组合是机械工程中常用的紧固件组合,主要用于连接和固定各种机械部件。由内六角圆柱头螺栓、平垫圈和弹性垫圈三部分组成。内六角圆柱头螺栓采用内六角...
2025-07-20 00:00:00