STM32F103VET6可以笔记本外接显示器SRAM吗

字节控制功能。支持高/低字节控制。
看看实现&IS62WV51216&的访问,需要对&FSMC进行哪些配置。&这里就做一个概括性的讲解。步骤如下:&
&1)使能&FSMC&时钟,并配置&FSMC&相关的&IO&及其时钟使能。
&要使用&FSMC,当然首先得开启其时钟。然后需要把&FSMC_D0~15,FSMCA0~18&等相关IO&口,全部配置为复用输出,并使能各&IO&组的时钟。&
&使能&FSMC&时钟的方法:
&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);&
&对于其他&IO&口设置的方法前面讲解很详细,这里不做过多的讲解。
2)设置&FSMC&BANK1&区域&3。
此部分包括设置区域&3&的存储器的工作模式、位宽和读写时序等。我们使用模式&A、16&位宽,读写共用一个时序寄存器。使用的函数是:
void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct)
&3)使能&BANK1&区域&3。
使能&BANK&的方法跟前面&LCD&实验一样,函数是:
void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
通过以上几个步骤,完成了&FSMC&的配置,可以访问&IS62WV51216&了,这里还需要注意,因为我们使用的是&BANK1&的区域&3,所以&HADDR[27:26]=10,故外部内存的首地址为&0X。&
#include "fsmc_sram.h"
#define Bank1_SRAM3_ADDR ((u32)(0x))
void GPIO_SRAM_Init(void)
GPIO_InitTypeDef GPIO_InitS
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_14|
GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd
= GPIO_PuPd_NOPULL;
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_Pin_10;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4 |GPIO_Pin_5 |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_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15|
GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0,
GPIO_AF_FSMC);//D2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1,
GPIO_AF_FSMC);//D3
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4,
GPIO_AF_FSMC);//NOE
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5,
GPIO_AF_FSMC);//NWE
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8,
GPIO_AF_FSMC);//D13
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9,
GPIO_AF_FSMC);//D14
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);//D15
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);//A16
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);//A17
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);//A18
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);//D0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);//D1
GPIO_PinAFConfig(GPIOE, GPIO_PinSource0,
GPIO_AF_FSMC);//NBL0
GPIO_PinAFConfig(GPIOE, GPIO_PinSource1,
GPIO_AF_FSMC);//NBL1
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7,
GPIO_AF_FSMC);//D4
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8,
GPIO_AF_FSMC);//D5
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9,
GPIO_AF_FSMC);//D6
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);//D7
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);//D8
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);//D9
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);//D10
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);//D11
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);//D12
GPIO_PinAFConfig(GPIOG, GPIO_PinSource0,
GPIO_AF_FSMC);//A10
GPIO_PinAFConfig(GPIOG, GPIO_PinSource1,
GPIO_AF_FSMC);//A11
GPIO_PinAFConfig(GPIOG, GPIO_PinSource2,
GPIO_AF_FSMC);//A12
GPIO_PinAFConfig(GPIOG, GPIO_PinSource3,
GPIO_AF_FSMC);//A13
GPIO_PinAFConfig(GPIOG, GPIO_PinSource4,
GPIO_AF_FSMC);//A14
GPIO_PinAFConfig(GPIOG, GPIO_PinSource5,
GPIO_AF_FSMC);//A15
GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_FSMC);//NE3
GPIO_PinAFConfig(GPIOF, GPIO_PinSource0,
GPIO_AF_FSMC);//A0
GPIO_PinAFConfig(GPIOF, GPIO_PinSource1,
GPIO_AF_FSMC);//A1
GPIO_PinAFConfig(GPIOF, GPIO_PinSource2,
GPIO_AF_FSMC);//A2
GPIO_PinAFConfig(GPIOF, GPIO_PinSource3,
GPIO_AF_FSMC);//A3
GPIO_PinAFConfig(GPIOF, GPIO_PinSource4,
GPIO_AF_FSMC);//A4
GPIO_PinAFConfig(GPIOF, GPIO_PinSource5,
GPIO_AF_FSMC);//A5
GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FSMC);//A6
GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FSMC);//A7
GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FSMC);//A8
GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FSMC);//A9
void FSMC_SRAM_Init(void)
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitS
FSMC_NORSRAMTimingInitTypeD
p.FSMC_AddressSetupTime = 0x00;
//地址建立时间(ADDSET)为1个HCLK 1/36M=27ns
p.FSMC_AddressHoldTime = 0x00;
//地址保持时间(ADDHLD)模式A未用到
p.FSMC_DataSetupTime = 0x03;
//数据保持时间(DATAST)为3个HCLK 4/72M=55ns(对EM的SRAM芯片)
p.FSMC_BusTurnAroundDuration = 0x00;
p.FSMC_CLKDivision = 0x00;
p.FSMC_DataLatency = 0x00;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;// 这里我们使用NE3 ,也就对应BTCR[4],[5]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_D
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_D// FSMC_BurstAccessMode_D
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_L
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_D
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_D
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitS
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_E
//存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_D
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_D // 读写使用相同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_D
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; //读写同样时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK3
void SRAM_Init(void)
GPIO_SRAM_Init();
FSMC_SRAM_Init();
/* -------------------------------
在指定地址开始,连续写入n个字节.
pBuffer:字节指针
WriteAddr:要写入的地址
n:要写入的字节数
--------------------------------*/
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
for(;n!=0;n--)
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pB
WriteAddr+=2;
pBuffer++;
/*-------------------------------
在指定地址开始,连续读出n个字节.
pBuffer:字节指针
ReadAddr:要读出的起始地址
n:要写入的字节数
--------------------------------*/
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
for(;n!=0;n--)
*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);
ReadAddr+=2;
/*-------------------------------
在指定地址写入1个字节
data:要写入的数据
-------------------------------*/
void fsmc_sram_test_write(u8 data,u32 addr)
FSMC_SRAM_WriteBuffer(&data,addr,1); //写入1个字节
/*------------------------------
读取1个字节
addr:要读取的地址
返回值:读取到的数据
------------------------------*/
u8 fsmc_sram_test_read(u32 addr)
FSMC_SRAM_ReadBuffer(&data,addr,1);
文档参考:http://blog.chinaunix.net/uid--id-4106380.html&&
阅读(...) 评论()这两天调试STM32F103外扩SRAM,将调试过程中遇到的问题记录下,SRAM的规格是256K*16的异步SRAM,地址总线为18,数据线宽度为16.
在调试过程中遇到一些小问题,希望读者能少走些弯路。
先看一下FSMC内存映射图:
由图可知,stm32的FSMC模块分为四个bank,每个bank的大小事64M。
&下面这张图是FSMC各个块的信号分配图。
由上图可知,bank1 NOR/PSRAM可以分为4个子块,由FSMC_NE[4:1]来选择使能哪个子块。
例如:每小块NOR/PSRAM的64M地址范围如下:
&第一块:h--63ff ffffh
&第二块:h--67ff ffffh
&第二块:h--6bff ffffh
&第三块:6c00 0000h--6fff ffffh
我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下图所示:
这里我使用的是100脚的stm32,只有NE1引脚可用,也就是说只能用Bank1的存储块1,即FSMC_Bank1_NORSRAM1。
我用的STM32是100脚的,地址和数据总线是复用的,那么需要用到锁存器来区分地址和数据,而锁存信号是NADV输出的,注意看图173和图174的NADV信号在输出地址时是低电平,输出数据时是高电平,所以锁存器要选择一个高电平锁存或者加个反向器。
在配置STM32的FSMC的寄存器时要注意下面两句话:
//使能复用模式
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_E
//注意这里不是FSMC_MemoryType_SRAM而是FSMC_MemoryType_NOR,手册上说要想输出NADV信号只能设置成FSMC_MemoryType_NOR。
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR
SRAM参考原理图如下图:
stm32的FSMC功能用到的复用IO口比较多,配置时需要细点心:
*PD14(DA0) PD15(DA1) PD0(DA2) PD1(DA3) PE7~PE15(DA4~DA12) PD8~PD10(DA13~DA15) PD11(A16) PD12(A17)
*PD5(WE) PD7(NE1) PD4(OE)
*PE0(BL0) PE1(BL1) NADV(PB7)
void sram_gpio_configration(void)
GPIO_InitTypeDef GPIO_InitS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | 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_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
下面是具体的FSMC寄存器配置:
void fsmc_for_sram_configration(void)
FSMC_NORSRAMInitTypeDef
FSMC_NORSRAMInitS
FSMC_NORSRAMTimingInitTypeDef
FSMC_NORSRAMTimingInitS
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 15;
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 15;
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 255;
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 15;//以上这四个参数在调试的时候可以先设置为最大值,程序调通后在根据器件手册和STM32手册计算出合适的值
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;//synchronize memory下面这两个参数是为同步器件准备的
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_B;//复用总线模式下,访问模式设置为ModeB
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_E
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;//注意这里要设置成NOR,因为只有设置为NOR,才能输出NADV信号 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_D
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_D
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_L
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_D
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitS
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_E
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_D
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_D
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_D
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitS
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitS
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* - BANK 1 (of NOR/SRAM Bank 0~3) is enabled */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
&外部SRAM的访问:&
在访问SRAM时纠结了许久,最后终于弄明白了。网上看了很多资料,有说在访问时要先将地址偏移,有说直接访问就行。最后经过测试发现访问片外SRAM时跟访问内部RAM一样,直接访问就可以了,FSMC都帮我们做好了。
当访问字节数据时:*((u8*)(BANK1_SRAM_BASE+offset))。1.读取SRAM数据时,将offset设为0x00,用示波器测试SRAM的A0地址信号是低,当offset为0x01时,用示波器测试SRAM的A0地址信号也是低,当offset为0x02和0x03时SRAM的A0地址信号是高,这说明当字节访问时地址确实是偏移了1位,原因是SRAM是16位器件(SRAM的1个地址存储16位数据),一次可以访问2个字节的数据,这个时候FSMC将根据offset值判断,访问的是高8位还是低8位,即如果offset的最低位是0则访问的是16位数据的低8位,如果offset的最低位是1则访问的是16位数据的高8位。2.&向SRAM写数据时,道理也是一样的,只是写的时候通过BL[1:0]两个管脚控制写高字节还是低字节。
当访问半字数据时:*((u16*)(BANK1_SRAM_BASE+offset))。1.读取SRAM数据时,这个时候要注意了,FSMC在访问的时候要看offset的值是不是半字对齐的。如果offset是0x00,则直接访问的是SRAM的0x00地址处的16位数据,当offset是0x01时,FSMC是分两次访问的,第一次是访问SRAM的0x00地址的高字节,第二次是访问SRAM的0x01地址处的低字节(SRAM的1个地址存储16位数据),通过用示波器测量SRAM的A0地址信号得到,信号是先低在高的一个脉冲,验证了前面的说法。2.&向SRAM写数据时,道理也是一样的,只是写的时候通过BL[1:0]两个管脚控制写高字节还是低字节。
&当访问字数据时:访问字时,FSMC分为2个半字访问。
总结:外部SRAM就跟片内SRAM一样用就行了。
阅读(...) 评论()博客访问: 5558269
博文数量: 994
博客积分: 15795
博客等级: 上将
技术积分: 16568
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
STM32&外部&SRAM
STM32F103ZET6&自带了&64K&字节的&SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,STM32&自带的这些内存就不够用了。比如跑算法或者跑&GUI&等,就可能不太够用
IS62WV51216&简介
IS62WV51216&是&ISSI(Integrated&&Silicon&&Solution,&&Inc)公司生产的一颗&16&位宽&512K(512*16,即&1M&字节)容量的&CMOS&静态内存芯片。该芯片具有如下几个特点:
l&高速。具有&45ns/55ns&访问速度。
l&低功耗。
l&TTL&电平兼容。
l&全静态操作。不需要刷新和时钟电路。
l&三态输出。
l&字节控制功能。支持高/低字节控制。
看看实现&IS62WV51216&的访问,需要对&FSMC进行哪些配置。&这里就做一个概括性的讲解。步骤如下:&
1)使能&FSMC&时钟,并配置&FSMC&相关的&IO&及其时钟使能。
要使用&FSMC,当然首先得开启其时钟。然后需要把&FSMC_D0~15,FSMCA0~18&等相关IO&口,全部配置为复用输出,并使能各&IO&组的时钟。&
使能&FSMC&时钟的方法:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);&
对于其他&IO&口设置的方法前面讲解很详细,这里不做过多的讲解。
2)设置&FSMC&BANK1&区域&3。
此部分包括设置区域&3&的存储器的工作模式、位宽和读写时序等。我们使用模式&A、16&位宽,读写共用一个时序寄存器。使用的函数是:
void&FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef*&FSMC_NORSRAMInitStruct)
3)使能&BANK1&区域&3。
使能&BANK&的方法跟前面&LCD&实验也是一样的,这里也不做详细讲解,函数是:
void&FSMC_NORSRAMCmd(uint32_t&FSMC_Bank,&FunctionalState&NewState);
通过以上几个步骤,我们就完成了&FSMC&的配置,可以访问&IS62WV51216&了,这里还需要注意,因为我们使用的是&BANK1&的区域&3,所以&HADDR[27:26]=10,故外部内存的首地址为&0X。&
//使用NOR/SRAM的 Bank1.sector3,地址位HADDR[27,26]=10
//对IS61LV25616/IS62WV25616,地址线范围为A0~A17
//对IS61LV51216/IS62WV51216,地址线范围为A0~A18
#define Bank1_SRAM3_ADDR ((u32)(0x))&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
//初始化外部SRAM
void FSMC_SRAM_Init(void)
&&&&FSMC_NORSRAMInitTypeDef
FSMC_NORSRAMInitStructure;
&&&&FSMC_NORSRAMTimingInitTypeDef
readWriteTiming;
&&&&GPIO_InitTypeDef
GPIO_InitStructure;
&&&&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);
&&&&&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
&&&&GPIO_InitStructure.GPIO_Pin = 0xFF33; &&&&&&&&&&&& &&&&//PORTD复用推挽输出
&&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; &&&&&&&& //复用推挽输出
&&&&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&&&&GPIO_Init(GPIOD, &GPIO_InitStructure);
&&&&GPIO_InitStructure.GPIO_Pin = 0xFF83; &&&&&&&&&&&& &&&&//PORTE复用推挽输出
&&&&&GPIO_Init(GPIOE, &GPIO_InitStructure);
&&&&&GPIO_InitStructure.GPIO_Pin = 0xF03F; &&&&&&&&&&&& &&&&//PORTD复用推挽输出
&&&&&GPIO_Init(GPIOF, &GPIO_InitStructure);
&&&&GPIO_InitStructure.GPIO_Pin = 0x043F; &&&&&&&&&&&& &&&&//PORTD复用推挽输出
&&&&&GPIO_Init(GPIOG, &GPIO_InitStructure);
&&&& &&&&&&&&&&&&
&&&&&readWriteTiming.FSMC_AddressSetupTime = 0x00;&&&& //地址建立时间(ADDSET)为1个HCLK 1/36M=27ns
&&&&readWriteTiming.FSMC_AddressHoldTime = 0x00;&&&& //地址保持时间(ADDHLD)模式A未用到&&&&
&&&&readWriteTiming.FSMC_DataSetupTime = 0x03;&&&&&&&& //数据保持时间(DATAST)为3个HCLK 4/72M=55ns(对EM的SRAM芯片)&&&&
&&&&readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
&&&&readWriteTiming.FSMC_CLKDivision = 0x00;
&&&&readWriteTiming.FSMC_DataLatency = 0x00;
&&&&readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;&&&& //模式A
&&&&FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;//
这里我们使用NE3 ,也就对应BTCR[4],[5]。
&&&&FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
&&&&FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;
&&&&FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
&&&&FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_D
&&&&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配置
&&&&&&&FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK3&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//在指定地址开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
&&&&for(;n!=0;n--)
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;&&&&
&&&&&&&&WriteAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
&&&&&&&&pBuffer++;
}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//在指定地址开始,连续读出n个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
&&&&for(;n!=0;n--)
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);
&&&&&&&&ReadAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
////////////////////////////////////////////////////////////////////////////////////////
//测试函数
//在指定地址写入1个字节
//addr:地址
//data:要写入的数据
void fsmc_sram_test_write(u8 data,u32 addr)
{&&&&&&&&&&&&
&&&&FSMC_SRAM_WriteBuffer(&data,addr,1);//写入1个字节
//读取1个字节
//addr:要读取的地址
//返回值:读取到的数据
u8 fsmc_sram_test_read(u32 addr)
&&&&u8 data;
&&&&FSMC_SRAM_ReadBuffer(&data,addr,1);
&&&&return data;
阅读(8328) | 评论(0) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 笔记本外接显卡 的文章

 

随机推荐