历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2020年09月30日 | STM32单片机用FSMC接口控制SRAM

2020-09-30 来源:eefocus

环境:


主机:WIN7


开发环境:MDK4.72


MCU:STM32F103ZE




说明:


sram型号:IS62WV51216BLL

连接方式:FSMC

大小:1M字节.512K * 16




源代码:


inf_sram.h


/*********************************************************************

*   sram接口层头文件

* (c)copyright 2013,jdh

*   All Right Reserved

*文件名:inf_sram.h

*程序员:jdh

*修改日期:2013/10/10

*   2013/10/11

**********************************************************************/

 

/*********************************************************************

*   说明

*sram型号:IS62WV51216BLL

*连接方式:FSMC

*大小:1M字节.512K * 16

**********************************************************************/

 

#ifndef _INF_SRAM_H_

#define _INF_SRAM_H_

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "stm32f10x.h"

#include "stm32f10x_fsmc.h"

 

/*********************************************************************

* 宏定义

**********************************************************************/

 

/*********************************************************************

* SRAM2的BANK1起始地址

**********************************************************************/

 

#define Bank1_SRAM2_ADDR    ((uint32_t)0x64000000)

 

/*********************************************************************

* 函数

**********************************************************************/

 

/*********************************************************************

* 初始化sram

**********************************************************************/

 

void inf_init_sram(void);

 

/*********************************************************************

* 写入数据包

*输入:pBuffer:数据指针

*     WriteAddr:写入数据地址

*     NumHalfwordToWrite:数据长度

*返回:无

**********************************************************************/

 

void FSMC_SRAM_WriteBuffer(uint16_t* pBuffer,uint32_t WriteAddr,uint32_t NumHalfwordToWrite);

 

/*********************************************************************

* 读取数据包

*输入:pBuffer:存放数据的指针

*     ReadAddr:读取数据地址

*     NumHalfwordToRead:读取数据长度,单位半字,即2字节

*返回:无

**********************************************************************/

 

void FSMC_SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead);

 

/*********************************************************************

* 写入半字数据

*输入:WriteAddr:写入数据地址

*     data:数据

*返回:无

**********************************************************************/

 

void FSMC_SRAM_WriteHalfWord(uint32_t WriteAddr, uint16_t data);

 

/*********************************************************************

* 读取半字数据

*输入:ReadAddr:读取数据地址

*返回:读取的数据

**********************************************************************/

 

uint16_t FSMC_SRAM_ReadHalfWord(uint32_t ReadAddr);

 

#endif

 


inf_sram.c

/*********************************************************************

*   sram接口层头文件

* (c)copyright 2013,jdh

*   All Right Reserved

*文件名:inf_sram.c

*程序员:jdh

*修改日期:2013/10/10

*   2013/10/11

**********************************************************************/

 

/*********************************************************************

*   说明

*sram型号:IS62WV51216BLL

*连接方式:FSMC

*大小:1M字节.512K * 16

**********************************************************************/

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "inf_sram.h"

 

/*********************************************************************

* 函数

**********************************************************************/

 

/*********************************************************************

* 初始化sram

**********************************************************************/

 

void inf_init_sram(void)

{

GPIO_InitTypeDef GPIO_InitStructure; 

FSMC_NORSRAMTimingInitTypeDef p;

FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;

//开启FSMC时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC | RCC_AHBPeriph_SRAM,ENABLE);

//开启FSMC相关的IO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |

   RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |

   RCC_APB2Periph_AFIO, ENABLE);

//FSMC相关的IO配置

//数据线

//PD口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 |

  GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |

  GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure); 

//PE口

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_Init(GPIOE, &GPIO_InitStructure);

//地址线

//PF口

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_Pin_15;

GPIO_Init(GPIOF, &GPIO_InitStructure);

//PG口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |

  GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;

GPIO_Init(GPIOG, &GPIO_InitStructure);

//PD口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; 

GPIO_Init(GPIOD, &GPIO_InitStructure);

//NOE和NWE配置 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_Init(GPIOD, &GPIO_InitStructure);

 

//NE2配置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 

GPIO_Init(GPIOG, &GPIO_InitStructure);

 

//NBL0, NBL1配置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; 

GPIO_Init(GPIOE, &GPIO_InitStructure); 

 

//FSMC配置

//地址建立时间

p.FSMC_AddressSetupTime = 0;

//地址保持时间

p.FSMC_AddressHoldTime = 0;

//数据建立时间

p.FSMC_DataSetupTime = 5;

//总线恢复时间

p.FSMC_BusTurnAroundDuration = 0;

//时钟分频因子

p.FSMC_CLKDivision = 0;

//数据产生时间

p.FSMC_DataLatency = 0;

//控制器时序

p.FSMC_AccessMode = FSMC_AccessMode_A;

//总线参数配置

//使用FSMC的Bank1的字块2

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;

//禁止地址数据线复用

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

//存储类型为sram

FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

//存储器位宽16位

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

//关闭突发模式访问

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;

//使能突发访问模式后才有效,等待信号极性

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

//使能突发访问模式后才有效,非对齐成组模式

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 = &p;

//写操作时序参数

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

//初始化FSMC总线

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

//使能FSMC Bank1_SRAM Bank

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE);  

}

 

/*********************************************************************

* 写入数据包

*输入:pBuffer:数据指针

*     WriteAddr:写入数据地址

*     NumHalfwordToWrite:数据长度,单位半字,即2字节

*返回:无

**********************************************************************/

 

void FSMC_SRAM_WriteBuffer(uint16_t* pBuffer,uint32_t WriteAddr,uint32_t NumHalfwordToWrite)

{

for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--)

{

*(u16 *) (Bank1_SRAM2_ADDR + WriteAddr) = *pBuffer++;

WriteAddr += 2;

}   

}

 

/*********************************************************************

* 读取数据包

*输入:pBuffer:存放数据的指针

*     ReadAddr:读取数据地址

*     NumHalfwordToRead:读取数据长度,单位半字,即2字节

*返回:无

**********************************************************************/

 

void FSMC_SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead)

{

for(; NumHalfwordToRead != 0; NumHalfwordToRead--)

{

*pBuffer++ = *(vu16*) (Bank1_SRAM2_ADDR + ReadAddr); 

ReadAddr += 2;

}  

}

 

/*********************************************************************

* 写入半字数据

*输入:WriteAddr:写入数据地址

*     data:数据

*返回:无

**********************************************************************/

 

void FSMC_SRAM_WriteHalfWord(uint32_t WriteAddr, uint16_t data)

{

*(u16 *)(Bank1_SRAM2_ADDR + WriteAddr) = data;

}

 

/*********************************************************************

* 读取半字数据

*输入:ReadAddr:读取数据地址

*返回:读取的数据

**********************************************************************/

 

uint16_t FSMC_SRAM_ReadHalfWord(uint32_t ReadAddr)

{

  return (*(vu16 *)((Bank1_SRAM2_ADDR + ReadAddr)));

}

 

 

 

 


测试代码:

main.c



/*********************************************************************

*      无线定位基站程序

*   主文件

* (c)copyright 2013,jdh

*   All Right Reserved

*文件名:main.c

*程序员:jdh

**********************************************************************/

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "public.h"

 

uint8_t test_sram[100] __attribute__((at(Bank1_SRAM2_ADDR)));

 

/*********************************************************************

* 函数

**********************************************************************/

 

int main(void)

{

uint8_t i = 0;

uint16_t buf1[3] = {1,2,3};

uint16_t buf2[10] = {0};

推荐阅读

史海拾趣

Electro-Films Inc Semi-Films Div公司的发展小趣事

在20世纪80年代初,Electro-Films Inc. 的创始人意识到了电子行业中对高性能薄膜材料的需求日益增加。因此,公司决定成立一个专门负责薄膜材料研发的部门,即Semi-Films Division。这个部门在成立之初就面临着巨大的挑战,但团队凭借对技术的执着追求和不懈努力,成功开发出了具有优良电气性能和机械性能的薄膜产品,为公司赢得了首批客户。

Gauthier Connectique公司的发展小趣事
该电路适用于多种设备,包括电视机、录像机、音响设备、空调器和玩具等,展现了广泛的设备兼容性。
Hi-G Relays公司的发展小趣事
可能是电源波动、电磁干扰等原因导致的。解决方法包括检查电源稳定性、加强电磁屏蔽等。
Altitude Technology公司的发展小趣事

在电子行业中,合作与共赢是企业发展的重要途径。Altitude Technology深知这一点,因此积极寻求与其他企业的合作机会。通过与一家知名芯片制造商建立战略合作关系,Altitude Technology获得了更先进的芯片供应和技术支持,进一步提升了产品的竞争力。同时,公司还与其他企业开展了一系列合作项目,共同推动电子行业的发展。

ABCO公司的发展小趣事

随着国内市场的饱和,ABCO公司开始将目光投向海外市场。公司制定了国际化战略,通过在海外设立分支机构、建立销售网络等方式,逐步拓展国际市场。同时,ABCO公司还积极与国际知名企业进行合作与交流,学习先进的管理经验和技术,为公司的国际化发展提供了有力支持。

这五个故事展示了ABCO公司在电子行业发展中不断挑战自我、追求卓越的过程。通过技术创新、市场拓展、质量管理以及国际化战略的实施,ABCO公司逐渐发展成为一家具有竞争力的电子企业。

上海晶丰明源(BPS)公司的发展小趣事

随着公司的快速发展,晶丰明源于XXXX年成功通过科创板上市审核,正式登陆资本市场。这一重大事件不仅为公司带来了充裕的资金支持,也进一步提升了公司的品牌影响力和市场竞争力。借助资本市场的力量,晶丰明源得以加速研发进程、扩大生产规模,为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

对一个送水工的钦佩

今年公司换了一家桶装水的“供应商”。一段时间后,觉得有些奇怪,听不到同事打电话要水,而饮水机旁总是有一两桶满满的水。           一天,闲聊时才知道,原来这家公司送水的小伙子总是会不时主动上门,说“我给 ...…

查看全部问答>

WINCE写注册表乱码

int MAX_SIZE = 256;         HKEY  hKey1;         wchar_t *key1Value = L\"abc\";//这里写成中文结果也相同         char *key1buf = new char[MAX_SIZE];   &nb ...…

查看全部问答>

求助USB数据传输问题

请教前辈,小弟刚开始研究USB驱动,有些简单的问题请前辈给予指点1:对于同一USB设备接口的驱动与设备软件之间传输的数据格式是怎样的;2:是驱动对数据格式进行封装,还是利用设备软件进行数据封装。…

查看全部问答>

求解释

#include <reg52.h>#include \"74hc595.h\" uchar ledLenth; //流水灯当前长度char ledAdd_x,ledAdd_y; //流水灯偏移量uchar led_x[64]; //流水灯坐标数组uchar led_y[64];uchar i;/*--------------------------------------  流水 ...…

查看全部问答>

基于FSSDC-9B506-EK Easy Kit的作品(1)

  去年暑假期间,富士通公司举办了“2010-2011富士通半导体杯创意未来电子竞赛”,我有两个学生参加这个比赛。做了点东西,应该说还行吧。现在富士通在论坛征集建议,刚好他们使用的开发板就是Cortex-M3 Easy Kit,作为响应吧,我就把他们 ...…

查看全部问答>

收到传感器套件,上图

差点让圆通给搞飞了,送到另外一个地方去了,打了两个电话要回来的,快递信封也是破的,套件盒子也被压扁了,坑爹的快递…

查看全部问答>

収5438开发板,,

如题   求5438开发板  仿真器 ,,最好带资料  小白学习用,,有的MMM…

查看全部问答>

基于SoC的图像处理系统

没办法下载,有兴趣的同学可以看看 链接地址:https://prezi.com/orrvcr5uqjr0/copy-of-embedded-image-processing-using-arm-based-fpga/ …

查看全部问答>

MSP430串口学习中的疑惑

.......... void main(void) { unsigned char value=0; .......... while(1)     {              while (!(IFG1 & UTXIFG0));         TXBU ...…

查看全部问答>

单片机测电池电压IO口电压受影响如何解决

如题所述,采用一片STC12C2052AD单片机AD采集口测量一节锂电池电压,发现电池电压会对其他IO口的电压产生一定影响,比如说单片机未上电时,就已经可以测出其他IO口产生3V多的电压,这种情况有没有什么办法进行处理,或者隔离!比如说既让单片机可以 ...…

查看全部问答>