This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069:关于闪存分区

Guru**** 2595800 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/667487/tms320f28069-regarding-flash-partition

器件型号:TMS320F28069

您好!

我一直在尝试将闪存 B 扇区划分为 FLASHB_1和 FLASHB_2、以便我可以通过应用在 FLASHB_2中写入校准值。 我能够对 FLASHB 扇区进行分区、并能够通过应用程序写入 FLASHB_2扇区。 但是,在这之后,当我进一步执行应用程序时,在 while (1)循环中 会生成_中断 void ADCINT1_ISR (void),而这在我的应用程序中不使用。 我对 FLASHB 扇区进行分区是否正确? 以下是.cmd 文件中的应用程序和更改。 FlashInit 和 FlashEraseVerify 编程在 while (1)循环一次仅用于写入之前调用。 因为当我通过调试器刷写代码时、所有扇区都会被擦除、所以我没有在应用中调用 FlashErase API。

.cmd 文件

FLASHB_1:origin = 0x3F0000,length = 0x003500 //片上 FLASHB,校准数据位于其中。

FLASHB_2:origin = 0x3F3500,length = 0x500 //校准数据所在的片上 FLASHB。

//以后删除下一部分->减少链接器警告
FLASHA:origin = 0x3F4000,length = 0x003F80 //片上 FLASHA 用户

应用代码:

uint16 FlashEraseProgramVerify (void);
void FlashInit (void);

extern uint16 * RamfuncsLoadStart、* RamfuncsLoadEnd、* RamfuncsRunStart、* RamfuncsLoadSize;//TMB fix build error
空 FlashInit (空)

memcpy (((uint16 *)&RamfuncsRunStart、(uint16 *)&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);

EALLOW;

Flash_CPUScaleFactor = scale_factor;

EDIS;

EALLOW;

Flash_CallbackPtr =空;

EDIS;

EALLOW;

FlashRegs.FBANKWAIT.bit.PAGEWAIT = 1;
FlashRegs.FBANKWAIT.bit.RANDWAIT = 1;

EDIS;

ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");
ASM (" NOP ");

UINT16状态= 0;
UINT16 FlashEraseProgramVerify (空)

Flash_ST FlashStatus;
uint16 * Flash_ptr;//指向闪存中某个位置的指针
uint16 uscnt;

uint16 buff [10]={0、1、2、3、4、5、6、7、8、9};

Flash_ptr =(UINT16 *) 0x3F3500;
状态= Flash_Program (Flash_ptr、buff、sizeof (buff)、FlashStatus);
if (状态!= 0)

返回0;

其他

for (usCnt = 0;usCnt < sizeof (buff);usCnt++)

buff [usCnt]= 10 + usCnt;

Flash_ptr =(uint16 *) 0x3F3500 + sizeof (buff);

状态= Flash_Program (Flash_ptr、buff、sizeof (buff)、FlashStatus);
if (状态!= 0)

返回0;

其他

返回1;


此致、

Chandrakant Pal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Chandrakant、

    首先、我想说您可以根据需要对存储器进行分区。 但您可以擦除的最小内存段是扇区。 这意味着、如果您需要擦除 FLASHB_2、则 FLASHB_1也将被擦除。

    在对器件进行编程(使用闪存编程器)时、您可以将编程器配置为擦除、编程和验证。 如果您想在不擦除扇区 B 的情况下对其进行编程、则可以执行此操作。 请注意、如果您正在编程的位已经被编程、则可能会失败、例如、您无法将0x0000编程为0x0001、因为编程只能使位= 0。(擦除会将它们设置回1的 Ex。 0xFFFF)  

    此外、如果您希望对 sectora 进行编程并保持 sectorb 不变、则可以使用闪存编程器中的选项来完成该操作。

    当使用闪存 API 时、您可以随意进行存储、但是如果您需要擦除整个扇区、则会被擦除。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Cody、

    感谢你的答复。 这帮助我解决了我的问题。

    此致、
    Chandrakant Pal