新闻中心

EEPW首页>嵌入式系统>设计应用> 写MSP430片内flash

写MSP430片内flash

作者: 时间:2016-11-25 来源:网络 收藏
//******************************************************************************

// 参数: adr 为地址 , 范围 0x1000~0xFFFF
voidFlashRead(long adr,uint8 *bBuf,uint8 bLen)
{
while (bLen--)
*bBuf++=*(uint8 *)adr++;
return;
}

本文引用地址: //m.amcfsurvey.com/article/201611/321246.htm


// 写入地址 adr写入数据:*pc_byte

void FlashWrite(long adr,uchar *Datain,uint len)
{

//FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK16*FN4 + 8*FN3
FCTL3 = FWKEY;
FCTL1 = FWKEY + WRT;

while(FCTL3 & BUSY);//如果处于忙状态,则等待
while(count--)
{

while(FCTL3 & BUSY);
*(uchar*)adr++ = *Datain++;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
}

EraseSectorFlash过程



void EraseSectorFlash(unsigned int adr)
{

_DINT();
uchar *p0;
//FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//选择时钟源,分频
FCTL3 = FWKEY;//清除LOCK
while(FCTL3 & BUSY);//如果出于忙,则等待
FCTL1 = FWKEY + ERASE;//使能段操作每段512字节
p0 = (unsigned char *)adr;//数值强制转换成指针
*p0 = 0;//向段内任意地址写0,即空写入,启动擦除操作
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
while(FCTL3 & BUSY);
_EINT();//开总中断
}

查看空闲的FLASH 地址,避免擦除代码所在的地址。每次擦除均是一段一段的擦除,每段512字节。

找不到datasheet,不知道段的起止地址的,可以打开memory ,在内存窗口,用代码尝试随便写入一个任意地址,看哪些地方被改写成0xFF 就知道段的起止,如:

我们在0x15000写入(EraseSectorFlash(0x15000);),那里原本有非0xFF数据,好辨认(是FF的可以先写再擦)。看到段的起止是15000-151ff 刚好是512 。

0x15000+0x200->0x15200 所以下一段的起始地址是 0x15200 以此类推。

验证代码:

EraseSectorFlash(0x2A000);
EraseSectorFlash(0x2A200);
EraseSectorFlash(0x2A400);
EraseSectorFlash(0x2A600);

FlashWrite(0x2A000,origin_protect_data,512);
memset(origin_protect_data,0xCB,900);
FlashWrite(0x2A200,origin_protect_data,512);
memset(origin_protect_data,0xCA,900);
FlashWrite(0x2A400,origin_protect_data,512);
memset(origin_protect_data,0xC9,900);
FlashWrite(0x2A600,origin_protect_data,512);


编译地址分配:
在IAR窗口中,点击view》memory ,在内存窗口,点下拉框选择 SER 可知,SFR地址为 0x0000-0fff
RAM地址为:0x1c00-5bff
FLASH地址:0x5c00-45bff
结合看下面的地址分配图,即可知道各部分代码和数据被分配到什么地方。
****************************************
* *
* SEGMENTS IN ADDRESS ORDER *
* *
****************************************

SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
DATA16_AN 0102 - 0103 2 rel 0
0120 - 0121 2
0140 - 0141 2
0144 - 0145 2
015C - 015D 2
0168 - 016F 8
020A - 020B 2
0222 - 0225 4
0228 - 0229 2
0242 - 0245 4
024A - 024B 2
026A - 026B 2
0282 - 0285 4
028A - 028B 2
02A2 - 02A5 4
02A8 - 02A9 2
0340 - 0341 2
0350 - 0351 2
0380 - 0387 8
0392 - 0397 6
03AE - 03AF 2
03C0 - 03C3 4
03D2 - 03D3 2
0640 - 0641 2
0646 - 0648 3
064C - 064C 1
064E - 064E 1
065C - 065D 2
DATA20_I 1C00 - 1E26 227 rel 1
DATA20_Z 1E28 - 28B7 A90 rel 1
CSTACK 5400 - 5BFF 800 rel 1
//-------------------------------------以下为编译到FLASH的代码---------------------------
CSTART 5C00 - 5C2F 30 rel 1
ISR_CODE 5C30 - 5E63 234 rel 1
15E64 - D12372C0rel1
INTVECFF80 - FFF97Acom1
RESETFFFE - FFFF2rel1
DATA20_C00010000 - 000194869487rel1
DATA20_ID00019488 - 000196AE227rel1
****************************************
**
*END OF CROSS REFERENCE*
**
****************************************
30 112 bytes of CODEmemory
5 303 bytes of DATAmemory (+ 81 absolute )
38 574 bytes of CONST memory
Errors: none
Warnings: none
官方资料:http://pan.baidu.com/share/link?shareid=249328&uk=3523275049

1 Msp430Flash型单片机内部Flash存储器介绍


MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。


Msp430的Flash存储器的特点有:


1)产生内部编程电压


2)可位、字节、字编程,可以单个操作,也可以连续多个操作


3)超低功耗操作


4)支持段擦除和多段模块擦除


2 Flash存储器的分割


Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。


上一页 1 2 3 4 下一页

关键词:MSP430片内flas

评论


技术专区

关闭