请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430-FLASHER 我发现当缓冲区未满时、写入闪存位不会被移除。
如果我在使用 Set_PC 之后使用 CHECK_CRC,则我们的 MSP430闪存“有一些损坏”。 它调用两次 Flushbuffer、这将强制设置 WRT、在复位之前永远不会取消设置。
我为他人分享…
/********* ***函数:FlushBuffer ***说明:清空缓冲区中的所有剩余数据 ***返回: * Success_Operation 闪存现已锁定。 秘书长的报告 / #ifdef RAM_based_BSL char flushBuffer (void) { unsigned long i; char 异常= success_operation; unsigned char* data =&BlockBuffer[0]; if (已锁定状态==已解锁) { 如果(((BlockBufferStart & 0x7F)=0)&&(BlockBufferPtr =128))//缓冲区已满且 //对齐 { while (FCTL3 & Busy); FCTL3 = FWKEY; //清除锁定位 FCTL1 = FWKEY + BLKWRT + WRT; //设置写入/块位 对于(I = BlockBufferStart;I < BlockBufferStart + 128;I += 4) { __data20_write_long (i、*((long*) data)); 数据+= 4; while ((FCTL3 & Wait)==0); } // for FCTL1 = FwRamKey; while (FCTL3 & Busy); FCTL3 = FwRamKey + LOCK; } //如果 其他 { FCTL3 = FwRamKey; //清除锁定位 FCTL1 = FwRamKey + WRT; //设置写入位 对于(i = BlockBufferStart;i < BlockBufferStart + BlockBufferPtr;i++) { if ((BlockBufferStart & 0x01)|| i =BlockBufferStart + BlockBufferPtr - 1) { 异常= BSL430_writeByte (i、*数据); 数据+= 1; } 其他 { 异常= BSL430_writeWord (i、*(int *) data); 数据+= 2; i++; } 如果(异常!=成功操作) { 返回异常; } // if } // for // GHE:修复在设置的 PC 上意外写入闪存的位置 FCTL1 = FwRamKey; while (FCTL3 & Busy); FCTL3 = FwRamKey + LOCK; // GHE:修复结束 } //否则 BlockBufferStart = 0; BlockBufferNext = 0; BlockBufferPtr = 0; } 其他 { 例外= BSL_Locked; } 返回异常; }