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:使用具有 flash021 API 的 EEPROM 来写入持久性数据

Guru**** 2611705 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/769467/tms570ls1224-using-eeprom-with-flash021-api-to-write-persistent-data

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

您好!

我希望获得以下方面的帮助:我需要在非易失性存储器中写入一些配置参数(在 μ µC 断电后不应丢失参数)。 它不是大量的数据、比如25倍或30倍、约为240字节。

我当时想使用闪存 EEPROM 来实现这一点、因为它是根据我的理解为其制作的。

因此我尝试了 HalCogen 中显示的 exemple、但它不起作用:代码停留在第一个循环中、因为状态始终为 UNINIT。

以下是以下示例代码:

void write_to _flash (void)
{
uint16 u16JobResult,状态;
STD_ReturnType oResult=E_OK;
unsigned char read_data[100]={0};

uint8 SpecialRamBlock[100];

unsigned char 模式;
uint16 u16writecounter;

unsigned int FeeVirtualSectorNumber;
unsigned char VsState、u8EEPIndex;
unsigned char u8VirtualSector;
uint8 Test_Recovery;
uint8 Test_Cancel;

unsigned int BlockNumber;
unsigned int BlockOffset、Length;
unsigned char * read_ptr=read_data;

unsigned int loop;

/*初始化 RAM 阵列。*/
for (loop=0;loop<100;loop++) SpecialRamBlock[loop]= loop;

/*初始化费用。 这将创建虚拟扇区、初始化全局变量等。*/
TI_FEE ();
操作
{
TI_fee_MainFunction();
delay();
STATUS=TI_FEE _GetStatus (0);
}
while (Status!= IDLE);

/*将块异步写入 EEP。 块大小在 ti_fee_cfg.c 文件中配置。 默认块大小为
8字节*/
BlockNumber=0x1;
TI_fee_WriteAsync (BlockNumber、&SpecialRamBlock[0]);
操作
{
TI_fee_MainFunction();
delay();
STATUS=TI_FEE _GetStatus (0);
}
while (状态!=空闲);

/*同步将块写入 EEP。 写入将不会发生、因为数据是相同的。 *
TI_fee_WriteSync (BlockNumber、&SpecialRamBlock[0]);

/*读取长度未知的块*/
BlockOffset = 0;
长度= 0xFFFF;
oResult=TI_fee_read (BlockNumber、BlockOffset、READ_PTR、Length);
操作
{
TI_fee_MainFunction();
delay();
STATUS=TI_FEE _GetStatus (0);
}
while (状态!=空闲);

/*使写入的块无效*/
TI_FEE 验证块(BlockNumber);
操作
{
TI_fee_MainFunction();
delay();
STATUS=TI_FEE _GetStatus (0);
}
while (状态!=空闲);

/*设置组7的格式*/
TI_FEE 格式(0xA5A5A5A5U);
} 

我猜我已经正确安装了闪存 API、并将代码链接到"C:\ti\Hercules \f021闪存 API\02.01.01\F021_API_CortexR4_BE_L2FMC_V3D16.lib"
我在 HalCogen 没有做过任何事情,除了启用收费司机。 我正在使用 FreeRTOS。
任何线索都很有帮助。
我确实阅读了很多主题、但未找到如何使其正常工作的答案。 有关这方面的文件不是很清楚,即使我的需求是非常基本的,我也无法弄清楚。

谢谢

Audry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否在不使用 RTOS 的情况下尝试了该示例?

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    是的、我还尝试在没有 FreeRTOS 的情况下创建新项目、但它仍然无法正常工作(同一问题、卡在 UNINIT 状态)
    此外、这不是一个解决方案、因为我在应用中绝对需要 FreeRTOS。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    F021_API_CortexR4_BE_L2FMC_V3D16.lib 用于 TMS570LCx 器件。 请使用 F021_API_CortexR4_BE_V3D16.lib

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

    谢谢! 该函数似乎不再阻塞。

    但是、我不确定它是否正常工作:我已将该 exemple 拆分为2个函数、一个要写入、一个要读取:

    void write_to _flash (void)
    {
    uint16 u16JobResult,状态;
    STD_ReturnType oResult=E_OK;
    unsigned char read_data[100]={0};
    
    uint8 SpecialRamBlock[100]={0x42};
    
    unsigned char 模式;
    uint16 u16writecounter;
    
    unsigned int FeeVirtualSectorNumber;
    unsigned char VsState、u8EEPIndex;
    unsigned char u8VirtualSector;
    uint8 Test_Recovery;
    uint8 Test_Cancel;
    
    unsigned int BlockNumber;
    unsigned int BlockOffset、Length;
    unsigned char * read_ptr=read_data;
    
    unsigned int loop;
    
    /*初始化 RAM 阵列。*/
    for (loop=0;loop<100;loop++) SpecialRamBlock[loop]= loop;
    
    /*初始化费用。 这将创建虚拟扇区、初始化全局变量等。*/
    TI_FEE ();
    操作
    {
    TI_fee_MainFunction();
    delay();
    STATUS=TI_FEE _GetStatus (0);
    }
    while (Status!= IDLE);
    
    /*将块异步写入 EEP。 块大小在 ti_fee_cfg.c 文件中配置。 默认块大小为
    8字节*/
    BlockNumber=0x1;
    /*同步将块写入 EEP。 写入将不会发生、因为数据是相同的。 *
    TI_fee_WriteSync (BlockNumber、&SpecialRamBlock[0]);
    }
    
    void read_fin_flash (uint8_t* value_read)
    {
    unsigned int BlockNumber = 0x01;
    unsigned int BlockOffset、Length;
    uint16 u16JobResult,状态;
    STD_ReturnType oResult=E_OK;
    /*读取长度未知的块*/
    BlockOffset = 0;
    长度= 0xFFFF;
    oResult=TI_fee_read (BlockNumber、BlockOffset、value_read、Length);
    操作
    {
    TI_fee_MainFunction();
    delay();
    STATUS=TI_FEE _GetStatus (0);
    }
    while (Status!= IDLE);
    } 

    这不会阻碍、而且似乎可以部分工作。 我的意思是:

    -如果在主程序中,我执行写操作,然后执行读操作,则读数据是可以的

    -如果我只读(假设先前已完成写操作,我想检查数据是否已永久保存在内存中),我只读0,就像数据已被删除一样?

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

    如果任何人被干预、闪存的擦除是由调试器选项引起的。 我将其配置为不擦除 FlashBank7、现在工作正常。

    但是、我的闪存还有另一个问题:在我的应用程序中、我使用的是 FreeRTOS。

    在我的主代码中、我有以下代码、它工作正常

    //闪存写入
    double Pol[6]={0.0、1.0、2.0、3.0、4.0、 5.0};
    EEPROM_writeValue ((uint8_t*) Pol、1);
    
    //闪存读数
    uint8_t buffer_o[100];
    EEPROM_readValue (buffer_o、6*sizeof (double)、1); 

    但是、FreeRTOS 任务中使用的代码完全相同、无法正常工作、这会导致任务崩溃。

    我的 EEPROM_WRITE 和 EEPROM_READ 函数如下

    void EEPROM_readValue (uint8_t* buffer_o、unsigned int 长度、uint8_t block_number){
    TI_fee_read (block_number、0、buffer_o、length);
    delay();
    TI_fee_MainFunction ();
    }
    
    void EEPROM_writeValue (uint8_t* buffer_I、uint8_t block 编号){
    TI_fee_WriteSync (block_number、buffer_i);
    delay();
    TI_fee_MainFunction();
    } 

    我实际上似乎无法从 FreeRTOS 任务中对闪存执行操作?

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

    这是因为 FEE 需要在监控器模式下执行。 请检查任务是以用户模式还是以管理员模式运行。
    另请参阅此主题: e2e.ti.com/.../2332152

    此致、
    Akshay