stm32 FSMC-外扩SRAM IS62WV51216

来源:互联网 发布:java输出倒三角 编辑:程序博客网 时间:2024/06/06 08:57

引脚定义
12

FSMC配置步骤

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

举例
1

#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))  //首地址0x60000000,每块0x40000000void 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];    }}
原创粉丝点击