// 参数: adr 为地址 , 规模 0x1000~0xFFFF
void FlashRead(long adr,uint8 *bBuf,uint8 bLen)
{
while (bLen–)
*bBuf++=*(uint8 *)adr++;
return;
}
// 写入地址 adr 写入数据:*pc_byte
void FlashWrite(long adr,uchar *Datain,uint len)
{
//FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK 16*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
1 5E64 – D123 72C0 rel 1
INTVEC FF80 – FFF9 7A com 1
RESET FFFE – FFFF 2 rel 1
DATA20_C 00010000 – 00019486 9487 rel 1
DATA20_ID 00019488 – 000196AE 227 rel 1
****************************************
* *
* END OF CROSS REFERENCE *
* *
****************************************
30 112 bytes of CODE memory
5 303 bytes of DATA memory (+ 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存储器分红多个段。可对其进行单个字节、字的写入,也能够进行接连多个字、字节的写入操作,可是最小的擦除单位是段。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/259069.html