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.

[参考译文] TMS570LS1224:复位后读取闪存

Guru**** 2320200 points
Other Parts Discussed in Thread: TMS570LS1224, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/584919/tms570ls1224-reading-flash-after-reset

器件型号:TMS570LS1224
主题中讨论的其他器件: HALCOGEN

我有一个 TMS570LS1224 (PGE)并且在复位后读取值时出现问题。 我们的想法是将一个4位整数值(在我的例子中为0~9999之间、大约为1200)存储到闪存中。 FEE 函数每次在组7中的其他位置写入该值。 当我想读取该值时、它可以正常工作、但在复位后、它会忘记读取的位置并为我提供错误的值(但每次都是相同的数字)。 然后、在第一次写入完成后、它再次读取正确的值。
因此、我需要一些帮助、以帮助如何在复位后使 MCU 在正确的位置读取数据?
或者其他方法:我可以通过某种方式将(使用 F021闪存 API 函数)写入同一位置并从同一位置读取数据。 例如、我想使用组7地址0xF0200000 (到0xF0200003 - 4位数字)、复位后、应该从该位置读取。

感谢你的帮助

功能:

此致、Mihael

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

    您好!

    您为付费阅读/写入编写的函数对我来说看起来不错。 您是否使用了来自 CCS 的 CPU 复位或系统复位、或使用了电路板上的 nRST? 我尝试从 CCS 进行 CPU 复位和系统复位、然后检查了内存、一切看起来都很好。  

    从随附的图片中、您将看到虚拟扇区标头(4个32位字)、4个保留的32位字和6个32位字块标头。 是否可以在内存浏览器中检查块状态? 如果状态为0xFFF_0000_0000_0000、则块无效。

    此致、

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

    我看到一些有趣的行为。 前两张图片代表旧存储器、是我在格式(TI_FEE)之后拍摄的后两张图片(0xA5A5A5A5U);)。 如果我进行格式化、我希望写入函数写入第一个空位置0xF0200000。 如果您看一下最后一张图片、它会继续在0xF020555上写入? 地址、尽管它已设置格式。

    因此、我认为我最好编写一个函数、每次都将其写入同一位置并从中读取。 我在021和035闪存 API 文献中找到了一些非常有趣的函数、但我无法使用它、因为我没有足够的经验-我需要您的帮助。

    例如:  

    fapi_issueProgrammingCommand()

    fapi_doMarginiad()

    TI_FEE 格式(0xA5A5A5A5U)之后;

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

    我发现了什么问题。 我忘记在读取函数中定义 BlockNumber。 如果我在 oResult=TI_fee_read (...)之前写入"BlockNumber=0x1;" 工作原理。 如果我在声明区域中定义它、它也会起作用。

    因此、我编写了一个用于保存和读取整数的示例代码(必须在 Halcogen 中启用 FEE 驱动器、还需要021闪存 API 文件(请参阅 HCG 中的 HELP - FEE 示例):

    /* USER CODE BEGIN (2) */
       uint16 u16JobResult,Status;
       Std_ReturnType oResult=E_OK;
       unsigned char read_data[4]={0};     //default is 100 but in my case I only need 4
       uint8 SpecialRamBlock[4];     //default is 100 but in my case I only need 4
       unsigned char pattern;
       uint16 u16writecounter;
       unsigned int  FeeVirtualSectorNumber;
       unsigned char VsState, u8EEPIndex;
       unsigned char u8VirtualSector;
       uint8 Test_Recovery;
       uint8 Test_Cancel;
       unsigned int BlockNumber=0x1;
       unsigned int BlockOffset;
       unsigned int Length;
       unsigned char *Read_Ptr=read_data;
       unsigned int loop;
       
       void save(int16_t p);
       int  read(void);
       void delay(void);
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
       /* Initialize RAM array.*/
       for(loop=0;loop<4;loop++) SpecialRamBlock[loop] = loop;    //default is 100 but in my case I only need 4
       /* Initialize FEE. This will create Virtual sectors, initialize global variables etc.*/
       TI_Fee_Init();
       do    {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
       }    while(Status!= IDLE);
           //use read() function to read from flash
    while(1) {
           //your code...(with save() function)
       }
    /* USER CODE END */
       return 0;
    }
    
    /* USER CODE BEGIN (4) */
    void save(int16_t p){  //save function
       uint16_t j=0; //counter
       char p1[4];
       sprintf(p1, "%4.d", p);  //4 digit number into char
       for(j=0;j<4;j++){           // rest of chars which arent number writes ascii 0
           if ((p1[j]<48)||(p1[j]>57)) {
               p1[j]=48;
           }
       }
       SpecialRamBlock[0]=p1[0]; //1000
       SpecialRamBlock[1]=p1[1]; //100
       SpecialRamBlock[2]=p1[2]; //10
       SpecialRamBlock[3]=p1[3]; //1
       TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]);
       do    {
           TI_Fee_MainFunction();
           delay();
           Status=TI_Fee_GetStatus(0);
       }    while(Status!=IDLE);
    }
    
    int read(void){ //read function
       int16_t p;  //position
       uint16_t t; //1000
       uint16_t s; //100
       uint16_t d; //10
       uint16_t e; //1
       /* Read the block with unknown length */
       BlockOffset = 0;
       Length = 0xFFFF;
       oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length);
       do     {
           TI_Fee_MainFunction();
           delay();
           Status=TI_Fee_GetStatus(0);
       }    while(Status!=IDLE);
       /*read from flash*/
       t=(uint16_t)read_data[0]-48; //ascii into integer
       s=(uint16_t)read_data[1]-48;
       d=(uint16_t)read_data[2]-48;
       e=(uint16_t)read_data[3]-48;
       /*calculates digits into number */
       t=t*1000;
       s=s*100;
       d=d*10;
       p=t+s;
       p=p+d;
       p=p+e;
       return p; //returns value
    }
    
    void delay(void) {
       unsigned int dummycnt=0x0000FFU;
       do    {        dummycnt--;    }
       while(dummycnt>0);
    }
    /* USER CODE END */