• stm32 FSMC-外扩SRAM IS62WV51216


    引脚定义
    12

    FSMC配置步骤

    1.使能对应引脚GPIO时钟
    2.配置GPIO引脚模式
    3.使能FSMC时钟
    4.FSMC初始化
    5.存储器块使能

    举例
    1

    
    #define Bank1_SRAM3_ADDR    ((u32)(0x68000000))  //首地址0x60000000,每块0x40000000
    
    void SRAM_gpio_init()
    {
        GPIO_InitTypeDef gpiof = 
        {
            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_Pin_15, //FSMC_A0 - FSMC_A9
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
        GPIO_InitTypeDef gpiog0_5 = 
        {
            GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5, //FSMC_A10 - FSMC_A15
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
        GPIO_InitTypeDef gpiod = 
        {
            GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | //FSMC_A15 - FSMC_A18
            GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1 | //FSMC_D0 - FSMC_D3
                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10, //FSMC_D13 - FSMC_D15
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
        GPIO_InitTypeDef gpioe = 
        {
            //FSMC_D4 - FSMC_D12
            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_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
    
        GPIO_InitTypeDef gpioe0_1 = 
        {
            GPIO_Pin_0 | GPIO_Pin_1, //FSMC_NBL0-FSMC_NBL1
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
        GPIO_InitTypeDef gpiod4_5 = 
        {
            GPIO_Pin_4 | GPIO_Pin_5, //FSMC_NOE - FSMC_NWE
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
        GPIO_InitTypeDef gpiog10 = 
        {
            GPIO_Pin_10, //片选
            GPIO_Speed_50MHz,
            GPIO_Mode_AF_PP
        };
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
    
        GPIO_Init(GPIOF, &gpiof);
        GPIO_Init(GPIOG, &gpiog0_5);
        GPIO_Init(GPIOD, &gpiod);
        GPIO_Init(GPIOE, &gpioe);
        GPIO_Init(GPIOE, &gpioe0_1);
        GPIO_Init(GPIOD, &gpiod4_5);
        GPIO_Init(GPIOG, &gpiog10);
    }
    
    void FSMC_sram_init()
    {
        FSMC_NORSRAMInitTypeDef fsmc = {0};
        FSMC_NORSRAMTimingInitTypeDef FSMC_ReadWriteTimingStruct = {0};
    
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
    
        FSMC_ReadWriteTimingStruct.FSMC_AddressSetupTime = 0x00;
        FSMC_ReadWriteTimingStruct.FSMC_AddressHoldTime = 0x00;
        FSMC_ReadWriteTimingStruct.FSMC_DataSetupTime = 0x08;
        FSMC_ReadWriteTimingStruct.FSMC_BusTurnAroundDuration = 0x00;
        FSMC_ReadWriteTimingStruct.FSMC_CLKDivision = 0x00;
        FSMC_ReadWriteTimingStruct.FSMC_DataLatency = 0x00;
        FSMC_ReadWriteTimingStruct.FSMC_AccessMode = FSMC_AccessMode_A;
    
        fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM3;
        fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        fsmc.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        fsmc.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
        fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable;
        fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
        fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
        fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
        fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; //扩展模式使能
        fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        fsmc.FSMC_ReadWriteTimingStruct = &FSMC_ReadWriteTimingStruct;
        fsmc.FSMC_WriteTimingStruct = &FSMC_ReadWriteTimingStruct;
        FSMC_NORSRAMInit(&fsmc);
    
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
    }
    
    void SRAM_read(u8 *buf, u32 addr, u32 num)
    {
        u32 i = 0;
    
        for(i = 0; i < num; i++)
        {
            buf[i] = *(u8*)(Bank1_SRAM3_ADDR + addr + i);
        }
    }
    
    void SRAM_write(u8 *buf, u32 addr, u32 num)
    {
        u32 i = 0;
        u8 *p = (u8*)(Bank1_SRAM3_ADDR + addr);
    
        for(i = 0; i < num; i++)
        {
            *(p + i) = buf[i];
        }
    }
  • 相关阅读:
    IIS配置跨域请求
    ABP框架页面权限验证
    WPF-DataGrid增删改查不绑定数据源
    WPF-DataGrid增删改查绑定数据源
    .NET开发框架集合(长期更新)
    C# Webbrowser 常用方法及多线程调用
    Devexpress-GridLookUpEdit
    Devexpress提示框的使用
    Asp.Net MVC中Action跳转小结
    ASP.NET MVC备忘
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709764.html
Copyright © 2020-2023  润新知