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.

[参考译文] CCS/TMS320F28069:TMS320F28069的闪存库:不返回 FLASH_Erase()

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/774351/ccs-tms320f28069-flash-library-for-tms320f28069-flash_erase-does-not-return

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

您好,再次

对于我的项目、我将使用(编译的)闪存库
-使用标题" Flash2806X_API_Library.h"、
和 lib 文件:Flash2806X_API_wFPU_Library.lib

该库与复制到 RAM 的 SW API 一起使用。
只要写入,一切都可以正常工作--即成功写入已擦除的闪存。

调用 Flash_Eras()时出现问题:函数不返回,此外,
我发现目标经过了复位(看门狗肯定关闭)。

有没有人知道会发生什么错误?  由于库是预编译的、因此我无法检查任何内容...

此致、

Goetz

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

    在执行擦除之前、您的程序中是否还有其他内容? 执行 Flash_Erase 函数时是否启用了任何中断? 如果是、请尝试先禁用它们。

    您的任何代码/函数是否从闪存运行? 您不能从闪存和擦除运行代码、在执行闪存擦除之前、您应该确保从 RAM 复制和运行代码。

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

    尊敬的 Kevin:

    从汇编显示中可以看到、所有库代码都从 RAM 运行。

    对库函数(Flash_Program()、Flash_Eras())的所有调用都在"EDIS"之前,后跟"EINT"。 总之、只有这样

    程序中的一个有效中断:CPU 定时器2中断。

    我发现,即使中断处于活动 状态,Flash_Program()也能正常运行;Flash_Eras()在任何情况下都不运行,即不返回。

    稍后停止调试器会发现程序执行刚刚开始...

    因为我必须修改链接器命令文件(否则、没有足够的内存用于 RAM 函数) 、所以我发送它

    通过这篇文章——也许有些问题(我还不熟悉 TI 的 IDE……)。

    谨致问候、

    Goetz

    注意:2月22日星期五、我不会在这里、我将在星期一回来...

    ========================================================================================================================================================

    由于"插入文件"不起作用、我将其粘贴在此处:

    ========================================================================================================================================================



    存储器

    第0页:   /*程序内存*/
              /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/

      PRAML1     :origin = 0x008800,length = 0x000400    //片上 RAM 块 L1 */
      OTP        :origin = 0x3D7800,length = 0x000400    //片上 OTP */
      FLASHD     :origin = 0x3E8000、length = 0x004000    //片上闪存*/
      FLASHC     :origin = 0x3EC000,length = 0x004000    //片上闪存*/
      FLASHA     :origin = 0x3F4000,length = 0x003F80    //片上闪存*/
      csm_RSVD   :origin = 0x3F7F80,length = 0x000076    // FLASHA 的一部分。  当 CSM 正在使用时、使用所有0x0000进行编程。 *
      begin      :origin = 0x3F7FF6,length = 0x000002/*    FLASHA 的一部分。  用于"引导至闪存"引导加载程序模式。 *
      CSM_PWL_PROG:origin = 0x3F7FF8、length = 0x000008    // FLASHA 的一部分。  FLASHA 中的 CSM 密码位置*/
      RAML4      :origin = 0x00A000、length = 0x002000    //片上 RAM 块 L4 */
      
      FPUTABLES  :origin = 0x3FD860,length = 0x0006A0    //引导 ROM 中的 FPU 表*/
      IQTABLES   :origin = 0x3FDF00,length = 0x000B50    //引导 ROM 中的 IQMath 表*
      IQTABLES2  :origin = 0x3FEA50,length = 0x00008C    //引导 ROM 中的 IQMath 表*
      IQTABLES3  :origin = 0x3FEADC,length = 0x0000AA    /*引导 ROM 中的 IQMath 表*/

      ROM        :origin = 0x3FF3B0,length = 0x000C10    //引导 ROM */
      复位      :origin = 0x3FFFC0,length = 0x000002    //引导 ROM 的部分 */
      向量    :origin = 0x3FFFC2,length = 0x00003E    //引导 ROM 的部分 */

    第1页:/*  数据存储器*/
              /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
              /*寄存器保留在第1页                                                 中*/

      BOOT_RSVD  :origin = 0x000000,length = 0x000050    // M0的一部分,引导 ROM 将此用于栈*/  
      RAMM0      :origin = 0x000050、length = 0x0003B0    //片上 RAM 块 M0 *
      RAMM1      :origin = 0x000400、length = 0x000400    //片上 RAM 块 M1 *

      DRAML0     :origin = 0x008000、length = 0x000800    //片上 RAM 块 L0 */

      RAML2      :origin = 0x008C00,length = 0x000400    //片上 RAM 块 L2 */
      RAML3      :origin = 0x009000,length = 0x001000    //片上 RAM 块 L3 */
    //  RAML4      :origin = 0x00A000,length = 0x002000    //片上 RAM 块 L4 */
      RAML5      :origin = 0x00C000、length = 0x002000    //片上 RAM 块 L5 */
      RAML6      :origin = 0x00E000、length = 0x002000    //片上 RAM 块 L6 */
      RAML7      :origin = 0x010000、length = 0x002000    //片上 RAM 块 L7 */
      RAML8      :origin = 0x012000,length = 0x002000    //片上 RAM 块 L8 */   


      FLASHB     :origin = 0x3F0000,length = 0x004000    //片上闪存*/     


    /*将段分配给内存块。
      注:
            DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
                      闪存时执行
            ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
    *
     
    部分

     
      /*分配计划领域:*/
      /*闪存 API 函数可以按如下所示组合在一起。
         定义的符号_Flash28_API_LoadStart、_Flash28_API_LoadEnd
         和_Flash28_API_RunStart 用于将 API 函数复制出
         闪存存储器的内存空间、并加至 SARAM */

    / /
    //对于 Piccolo,我们不需要从闪存复制 API,因为它是*/
    引导 ROM 中存在/*                                   *
    / /
      Flash28_API://仅适用于 API 不在 BootROM 中的情况
      {
          -lFlash2806x_API_wFPU_Library.lib (.econst)
           -lFlash2806x_API_wFPU_Library.lib (.text)
      }                  负载= FLASHD
    //                      运行= PRAML1,
                          运行= RAML4、
                          Load_start (_Flash28_API_LoadStart)、
                          Load_End (_Flash28_API_LoadEnd)、
                          RUN_START (_Flash28_API_RunStart)、
                          PAGE = 0
    //                      页= 1.
      .cinit             :> FLASHA      PAGE = 0
      .pinit             :> FLASHA,     page = 0
      .text              :> FLASHA      PAGE = 0
      codestart          :> begin       page = 0
      ramfuncs           :load = FLASHA,
    //                        运行= PRAML1,
                            运行= RAML4、
                            load_start (_RamfuncsLoadStart)、
                            load_end (_RamfuncsLoadEnd)、
                            run_start (_RamfuncsRunStart)、
                            PAGE = 0
    //                        页= 1.

      csmpasswds         :>csm_PWL_PROG page = 0
      csm_rsvd           :>csm_RSVD    page = 0
      
      /*分配未初始化的数据段:*/
      .stack             :>RAMM0       page = 1.
      .ebss              :> RAML3      PAGE = 1.
      .esysmem           :>DRAML0      page = 1.

      /*初始化段进入闪存*/
      /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
      econst            :> FLASHA      PAGE = 0
      .switch            :> FLASHA      PAGE = 0      

      /*分配 IQ 数学区域:*/
      IQMath             :> FLASHA      page = 0           /*数学代码*/
      IQmathTables       :>IQTABLES,   PAGE = 0,TYPE = NOLOAD
      /*分配 FPU 数学区域:*/
      FPUmathTables      :> FPUTABLES, PAGE = 0,TYPE = NOLOAD
     
      /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
         库中的函数、以便利用
         引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
         1个等待状态)。 如果此部分未注释、则为 IQmathTables2
         将被加载到其他存储器(SARAM、闪存等)中并将采用
         上行空间、但0等待状态是可能的。
      *
      /*
      IQmathTables2   :> IQTABLES2,PAGE = 0,TYPE = NOLOAD
      {
      
                 IQMath.lib (IQmathTablesRam)
      
      }
      *
      /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
         库中的函数、以便利用
         引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
         1个等待状态)。 如果此部分未注释、则为 IQmathTables2
         将被加载到其他存储器(SARAM、闪存等)中并将采用
         上行空间、但0等待状态是可能的。
      *
      /*
      IQmathTables3   :> IQTABLES3,PAGE = 0,TYPE = NOLOAD
      {
      
                 IQMath.lib (IQmathTablesRam)
      
      }   
      *

      /*.reset 是编译器使用的标准段。  它包含*/
      /* C 代码_c_int00起始地址。   /*
      /*当使用引导 ROM 时,此部分和 CPU 矢量*/
      /*不需要表。  因此、默认类型设置为 */
      /* DSECT */
      .reset             :> reset,     page = 0,type = DSECT
      VECTORS            :> VECTORS    PAGE = 0,TYPE = DSECT
      



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

    在将链接器命令文件与 FLASH_API 库示例默认的文件进行比较后、我看不到该文件有什么特别错误的地方。

    是否可以在不对文件进行任何更改的情况下尝试运行 C2000ware 示例? 尝试从闪存和引导 ROM 配置运行 API、并查看它们是否卡住。

    C:\ti\c2000Ware_1_00_06_00\libraries\flash_api\f2806x\example_Flash2806x_api_fpu

    最棒的
    Kevin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    感谢您的提示:我对"EDIS"和"DINT"指令感到困惑。 使用的是 EDIS 而不是 DINT。
    现在一切正常!!!