STM32片外内存的使用

1、STM32分为片上内存和片外内存。
(1)片上内存
用于任务栈,变量等。
(2)片外内存
一般编程人员会自己写内存管理方便的函数。例如通过总线挂载一个16M的内存,地址0x68000000。用户可以管理一个指针,通过移动指针来管理这块内存。
包括分配和释放。
typedef struct 
{
	WORD wFlag;
	WORD wLen;
}TReserveSramInfo;
//静态RAM操作
typedef struct 
{
	int totalLen;
	int startPos;
	int curLen;
}STATICRAMINFO;
STATICRAMINFO gSRAMInfo;
void InitSRAM(void)
{
	TReserveSramInfo * pReserve;


	gSRAMInfo.totalLen = SRAM_SIZE-10*1024;/*最后面留了10k字节做特殊用途*/
	gSRAMInfo.startPos = SRAM_START_ADDR;
	gSRAMInfo.curLen = 0;


	pReserve = (TReserveSramInfo *)(gSRAMInfo.startPos+gSRAMInfo.totalLen+1024*10);
	pReserve->wFlag = RESERVESRAMFLAG10;
	pReserve->wLen = 1020;
}
void * SRAMMalloc(int len)
{
			if( gSRAMInfo.totalLen == 0 )
			{
				void * p;
				p = malloc(len);
				if( p )
					memset(p, 0, len);
				else
					p = 0;
				return p;
			}
			else
			{
				DWORD pos;
			
				if( (len+gSRAMInfo.curLen) > gSRAMInfo.totalLen )
					return 0;
			
				pos = gSRAMInfo.startPos + gSRAMInfo.curLen;
				gSRAMInfo.curLen += len;
				if( gSRAMInfo.curLen & 0x03 )
				{
					gSRAMInfo.curLen >>= 2;
					gSRAMInfo.curLen <<= 2;
					gSRAMInfo.curLen += 4;
				}


				return (void *)pos;
			}


}


2、Flash
这一部分通常用于存储设备的一些启动参数和历史信息。因为其运行速度远没有SDRam那么快,所以只用于保存使用。而后者常用语程序运行起来的缓存。
因为这个原因,Flash的价格就比SDRam低很多。
下面是一个简单的Flash的操作,包括对这段地址的读写操作。其实和SDRAM操作原理上相同,唯一不同的是两者的速度问题。
这是本人的理解。
/* Includes ------------------------------------------------------------------*/
#include "includes.h"


/* Private define ------------------------------------------------------------*/
#define NOR_FLASH_START_ADDR       ((uint32_t)0x64000000)
/*16M*/
#define NOR_FLASH_END_ADDR         ((uint32_t)0x64FFFFFF)


/* Delay definition */   
#define BlockErase_Timeout         ((uint32_t)0x00A00000)
#define ChipErase_Timeout          ((uint32_t)0x30000000) 
#define Program_Timeout            ((uint32_t)0x00001400)


#define ADDR_SHIFT(A)              (NOR_FLASH_START_ADDR + (2 * (A)))
#define NOR_WRITE(Address, Data)   (*(vu16 *)(Address) = (Data))


#define BUFFER_SIZE                0x400
#define WRITE_READ_ADDR            0x8000
/*128k*/
#define FLASH_SECTOR_SIZE	0x20000   


//参数区1M分配如下:
//参数0 系统通讯报警参数等
//参数1传感器参数等
//参数2设备校准参数
//参数3原始波谱参数
//参数4插值参数暂时用4个扇区
//128k*10
#define PARA0_ADDRESS		0
#define PARA1_ADDRESS		(PARA0_ADDRESS+FLASH_SECTOR_SIZE)
#define PARA2_ADDRESS		(PARA1_ADDRESS+FLASH_SECTOR_SIZE)
#define PARA3_ADDRESS		(PARA2_ADDRESS+FLASH_SECTOR_SIZE)
#define PARA4_ADDRESS		(PARA3_ADDRESS+FLASH_SECTOR_SIZE)




//剩余全用于存历史数据
#define HIS_DATA_ADDRESS	0x100000
#define SOE_SIZE	0x20000
#define SOE_ADDRESS	HIS_DATA_ADDRESS
#define SOE_ADDRESS2	SOE_ADDRESS+SOE_SIZE
#define TIMEYC_ADDRESS	SOE_ADDRESS2+SOE_SIZE
//#define TIMEYC_SIZE	FLASH_SECTOR_SIZE*TYC_POINT_MAX_NUM


/* Private typedef -----------------------------------------------------------*/
typedef struct
{
  uint16_t Manufacturer_Code;
  uint16_t Device_Code1;
  uint16_t Device_Code2;
  uint16_t Device_Code3;
}
NOR_IDTypeDef;


/* NOR Status */
typedef enum
{
  NOR_SUCCESS = 0,
  NOR_ONGOING,
  NOR_ERROR,
  NOR_TIMEOUT
}
NOR_Status;


/* Private function prototypes -----------------------------------------------*/
void FSMC_NOR_Test(void);
void FSMC_NOR_ReadID(NOR_IDTypeDef* NOR_ID);
NOR_Status FSMC_NOR_WriteHalfWord(uint32_t WriteAddr, uint16_t Data);
NOR_Status FSMC_NOR_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite);
NOR_Status FSMC_NOR_ProgramBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite);
u16 FSMC_NOR_ReadHalfWord(uint32_t ReadAddr);
void FSMC_NOR_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead);
NOR_Status FSMC_NOR_ReturnToReadMode(void);
NOR_Status FSMC_NOR_Reset(void);
NOR_Status FSMC_NOR_GetStatus(uint32_t Timeout);


#ifdef __cplusplus
extern "C"
{
#endif
void FSMC_NOR_Init(void);
NOR_Status FSMC_NOR_EraseBlock(uint32_t BlockAddr);
NOR_Status FSMC_NOR_EraseChip(void);
void ReadParaData(WORD ParaSectionNo, void *pBuf,DWORD num);
void WriteParaData(WORD ParaSectionNo, void *pBuf,DWORD num);
#ifdef __cplusplus
}
#endif
#endif /* __FSMC_NOR_H */

下面是一个项目中的相关代码,可以作为参考:

一、 Flash区域说明:
1、 起始地址(NOR_FLASH_START_ADDR):0x64000000
2、 结束地址(NOR_FLASH_END_ADDR):0x64FFFFFF


3、 参数区0(PARA0_ADDRESS):0x64000000——0x64020000
空间大小:0x20000,用于存储系统参数;


4、 参数区1(PARA1_ADDRESS):0x64020000——0x64040000
空间大小:0x20000,用于存储板卡门限信息;


5、 参数区2(PARA2_ADDRESS):0x64040000——0x64060000
空间大小:0x20000,暂时未用;


6、 参数区3(PARA3_ADDRESS):0x64060000——0x64080000
空间大小:0x20000,暂时未用;


7、 参数区4(PARA4_ADDRESS):0x64080000——0x640A0000
空间大小:0x20000,暂时未用;

二、 存储系统参数说明:
1、 TFlashPara0 * gpFlashPara0:
typedef struct
{
	TSysPara sys;
	TFBGPara fbg;


	TFBGLoca remarks[64*30];
}TFlashPara0;


typedef struct 
{
	WORD wVersion;
	WORD wRsv0[5];
	WORD wfsr;
	WORD wFlag;
	WORD wOrder[6];		// 通道顺序
DWORD dwIPAddress;
	DWORD dwGWAddress;
	TSerialInfo tSerialInfo[2];
	WORD wOnoff;
	WORD wNeedDownFBGPara;
	WORD wNeedDownDevicePara;
}TSysPara;


typedef struct 
{
	WORD wChannelNum;
	WORD fbgNum[CHANNEL_MAXNUM];
}TFBGPara;
#define	CHANNEL_MAXNUM		64


typedef struct 
{
	WORD wAddr;
	WORD wProtocol;
	WORD wBaud;		//1200 2400 4800 9600 14400 19200 38400 57600 115200 
	WORD wRsv;
}TSerialInfo;


typedef struct 
{
	WORD noteinfo[20];
}TFBGLoca;



2、 TFBG_SensorPara * gpFlashPara1:
typedef struct 
{
int type; //类型
int ctrlflag; //插值点数/时标遥测标志/插值计算标志
int warnPara[3]; //上限下限突变
int para[10];
int jznum;
}TFBG_SensorPara;


3、 TFBG_DevicePara * gpFlashPara2:
typedef struct
{
int wave;
int correction;
}TFBG_DevicePara;


4、 BYTE *gpFlashPara3:
typedef unsigned char BYTE;


5、 BYTE * gpFlashPara4=NULL:
typedef unsigned char BYTE;


6、 TFBG_TimeYCInfo * gpESRAMTimeYcInfo:
typedef struct
{
WORD wflag;
WORD wCurSectorPos[TYC_POINT_MAX_NUM];
}TFBG_TimeYCInfo;


7、 TFBG_TIMEYCInfo2 * gpTimeYcInfo:
typedef struct
{
WORD wCurTimeYcNum;
short Secno[CHANNEL_MAXNUM*FBG_MAXNUM];
WORD w5MinFlag[TYC_POINT_MAX_NUM];
}TFBG_TIMEYCInfo2;

8、
三、 存储变量空间说明:
1、 gpFlashPara0空间说明【sizeof(TFlashPara0)】:
TSysPara空间: 0x64000000——0x64000030 – 1
TFBGPara空间: 0x64000030——0x640000B4 – 1
TFBGLoca空间:0x640000B4——0x64012CB4 – 1
//空闲空间: 0x64012CB4——0x64020000 – 1
2、 gpFlashPara1空间说明【sizeof(TFBG_SensorPara)*64*30】:
TFBG_SensorPara空间: 0x64020000——0x6403E000 – 1
空闲空间: 0x6403E000——0x64040000 – 1
3、 gpFlashPara2空间说明【sizeof(TFBG_DevicePara)*64*120】:
TFBG_DevicePara空间: 0x64040000——0x6404F000 – 1
空闲空间: 0x6404F000——0x64060000 – 1
4、 gpFlashPara3空间说明【(BYTE *)SRAMMalloc(776)】:
BYTE空间: 0x64060000——0x64060308 – 1
空闲空间: 0x64060308——0x64080000 – 1
5、 gpFlashPara4空间说明【sizeof(TFBG_InterpolationItem)*0x10000】:
BYTE空间: 0x64080000——0x640FFFFF

四、 全局变量说明
1、 typedef struct
{
DWORD dwFBGAlmState[CHANNEL_MAXNUM];
DWORD dwFBGcheckState[CHANNEL_MAXNUM];
DWORD dwFBGcheckNum[CHANNEL_MAXNUM];
DWORD dwFBGWenshenAlmState[CHANNEL_MAXNUM];
DWORD dwFBGbreak[2];
DWORD syserr;
int alarmRecordNum[3];
int alarmRecord[MAX_RECORD_ALARM_NUM];
int fiberBreakRecord[MAX_RECORD_ALARM_NUM];
int sensorLostRecord[MAX_RECORD_ALARM_NUM];
}TFBG_State;

#define CHANNEL_MAXNUM 64 //最多64个通道
#define MAX_RECORD_ALARM_NUM 10
dwFBGAlmState:传感器报警状态,置1为报警,为标志位;
#define SOE_ALARM_TEMPERATURE 1
例如通道1传感器10报警,则赋值:dwFBGAlmState[0] |= (1 << 9);
dwFBGcheckState:传感器检测状态,置1为丢失,为标志位;
例如通道2传感器6丢失,则赋值:dwFBGcheckState [1] |= (1 << 5);
dwFBGcheckNum:传感器检测个数,丢失1个计数器加1,为计数器;
#define SOE_ALARM_FIBERBREAK 3
#define SOE_ALARM_FIBERBREAK_RESTORE 4
dwFBGWenshenAlmState:传感器温升状态,置1为报警,为标志位;
#define SOE_ALARM_TEMP_JUMP 2
dwFBGbreak:传感器断纤状态,置1为断纤,为标志位;
#define SOE_ALARM_FIBERBREAK 3
#define SOE_ALARM_FIBERBREAK_RESTORE 4
通道1到通道32记录在数组dwFBGbreak[0],通道33到通道64记录在数组dwFBGbreak[1];
syserr:系统故障状态,置1为告警,为状态标志位;
alarmRecordNum:告警记录个数数组,告警1个计数器加1,为计数器;
alarmRecordNum[0]对应告警记录数组alarmRecord[10];
alarmRecordNum[1]对应告警记录数组fiberBreakRecord[10];
alarmRecordNum[2]对应告警记录数组sensorLostRecord[10];
alarmRecord:告警记录,最多10条;
fiberBreakRecord:断纤故障记录,最多10条;
sensorLostRecord:传感器丢失故障记录,最多10条;

3、keil在编译之后的提示信息
http://blog.chinaunix.net/uid-21227800-id-3316051.html
KEIL RVMDK编译后的信息
Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 
Code是代码占用的空间,RO-data是 Read Only 只读常量的大小,如const型,RW-data是(Read Write) 初始化了的可读写变量的大小,ZI-data是(Zero Initialize) 没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化。
简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code+RO Data+RW Data
程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值