TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430G2553从RAM里擦除FLASH是什么意思啊,怎么操作的???

今天看了一天的FLASH,觉得有点奇怪,为什么直接从Flash中擦除不用检测忙标志,而从RAM中要判断,写好像也不要,但块写要判断,这之间有什么差别呢?

shuai lee:

回复 Lina Lian:

 Lina Lian

其实这些我都有看到过,不过英文不太好,看英文文档比较费劲,很多都没看太明白就跳过去了。谢谢你帮我的归纳

可是我还是分不开什么时候是FLASH 写或擦除,什么时候是从RAM开始写或擦除。。看它的例程,好像从RAM和从FLASH是一样的

下面是我 昨天写的一个例程,是参照别人的写的,工作是可以工作,不过我还是分不清细节方面的东西,可以再麻烦你给我讲下

他们的差别吗,或者发个例程给我参考下 谢谢

#include "flash.h"

//=====================================================================//flash initialization//=====================================================================void FlashInit(void){ //set SMCLK as 1Mhz if(0xff == CALDCO_1MHZ || 0xff == CALBC1_1MHZ) { while(1);//if flash is repeated erased, don't run, trap CPU } DCOCTL = CALDCO_1MHZ; BCSCTL1 = CALBC1_1MHZ; FCTL2 = FWKEY + FSSEL_2 + FN1;//clock = SMCLK / 3}

//=====================================================================//check wether flash is busy//=====================================================================uchar FlashCheckBusy(){ if (FCTL3 & BUSY) return 1; else return 0;}

//=====================================================================//flash segment erasement//=====================================================================void FlashErase(int SegX){ _DINT();//disable global interrupt while ( FlashCheckBusy() ); FCTL3 = FWKEY;//clear LOCK bit FCTL1 = FWKEY + ERASE; *((int *)SegX) = 0x00; while ( FlashCheckBusy() ); FCTL3 = FWKEY | LOCK; return;}

//=====================================================================//flash write byte//=====================================================================void FlashWriteChar(uint addr, char wdata){ _DINT();//disable global interrupt while( FlashCheckBusy() ); FCTL3 = FWKEY;// clear LOCK bit FCTL1 = FWKEY + WRT; *((uchar *)addr) = wdata;//put write data 2 flsh memory FCTL1 = FWKEY;//clear WRT bit FCTL3 = FWKEY + LOCK;//LOCK flash return;}

//====================================================================//flash read byte//====================================================================char FlashReadChar(uint addr){ char rdata; rdata = *((char *)addr);//go to the refered address read return rdata;}

//====================================================================//Flash write word//====================================================================void FlashWriteWord(uint addr, uint wdata){ _DINT(); while ( FlashCheckBusy() ); FCTL3 = FWKEY;// clear lock FCTL1 = FWKEY + WRT;//Enable write *((uint *)addr) = wdata; FCTL1 = FWKEY ;//Clear write FCTL3 = FWKEY + LOCK;//LOCK FALSH module return;}

//====================================================================//Flash Read Word//====================================================================uint FlashReadWord(uint addr){ uint rdata; rdata = *((uint*)addr);//get value from refered address return rdata;}

//===================================================================//Flash modify byte//===================================================================void FlashModifyChar(uint SegX, char AddrNum, char wdata){ char i, TempArray[SegSize]; for(i = 0; i < SegSize; i++) { TempArray[i] = FlashReadChar(SegX + i); } TempArray[AddrNum] = wdata; FlashErase(SegX); FCTL3 = FWKEY; FCTL1 = FWKEY + WRT; for(i = 0; i < 64; i ++) { *((char *)(SegX + i)) = TempArray[i]; } FCTL1 = FWKEY;// Clear WRITE bit FCTL3 = FWKEY + LOCK;//lock flash return;}

//===================================================================//flash block write//===================================================================void FlashBlockWrite(int SegX, char *pStr){ int i; FlashErase(SegX);//block erasement FCTL3 = FWKEY;// Clear LOCK bit FCTL1 = FWKEY + WRT; for(i = 0; i < 2 * sizeof(pStr); i++) { *(uchar *)(SegX + i) = *(pStr + i); } FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK;}

shuai lee:

嗯,谢谢了!就是这个搞不明白,现在有点明白了,我想我们应该一般用的都是从FLASH开始的吧,

那个把代码复制放到RAM应该一般都不会这样去做 。

xiaonan zhang:

回复 Lina Lian:

你好,我也有类似的问题,我想知道单片机内部硬件是如何区分擦除是从Flash还是Ram发起的,是通过判断假写指令所在地址或程序指针之类的方法么?  知道这些有助于我编写一个尽可能小的,在Flash擦除期间响应中断的功能函数。具体点说是不是可以这样:

FCTL3 = FWKEY;                 // 清LOCK位    代码在Flsah FCTL1 = FWKEY | ERASE;  // 设置擦除位   代码在Flsah

*EraseAddr = 0xff;                 // 擦除              代码在Ram

 while( FCTL3 | BUSY )         //等待               代码在Ram

{ 检查中断标志,并响应 };       //响应中断       代码在Ram

FCTL3 = FWKEY | LOCK;    //                       代码在Flsah

请问以上的代码示意,是否可以算是从Ram发起的?

赞(0)
未经允许不得转载:TI中文支持网 » MSP430G2553从RAM里擦除FLASH是什么意思啊,怎么操作的???
分享到: 更多 (0)