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.

[参考译文] TMS320F280025:闪存 API 期间的中断

Guru**** 2568585 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1022694/tms320f280025-interrupt-during-flash-api

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

您好、支持团队、

我使用闪存 API 擦除闪存 Sektor、根据 SPNU631–2019年8月、闪存 API 执行是可中断的。

但是、在耳塞过程中不会执行1ms 计时器中断。

我没有使用 DINT  __asm (" SETC INTM")禁用中断

闪存 API 是否会自动取消中断活动并在过程前后重新激活? 如果是、如何忽略此选项? 我的所有中断函数都位于 RAM 中。

示波器:

-黄色:TOGGLE 引脚在1ms 计时器中断中

绿色:擦除前设置引脚、擦除后复位

谢谢大家、此致

问题

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

    Quy、

    闪存 API 不禁用中断。  您的 ISR 映射到何处执行?  如果您希望在一个激活的闪存 API 操作进行时为它提供服务、那么应该将它映射为从 RAM 执行(可以映射为加载到闪存、但是应该映射为从 RAM 执行)。  指南中提到了这一点。   

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    例如、计时器中断函数及其子函数都在 RAM 中

    #pragma CODE_SECTION (Timer_Timer0中断、".TI.ramfunc")

    #pragma CODE_SECTION (FBL_TASK、".TI.ramfunc")

    #pragma CODE_SECTION (Ports_TogglePin、".TI.ramfunc")

    此致、

    问题

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

    Quy、

    我可以在您的快照中看到中断被处理、但不像以前和以后那样频繁处理中断。

    CPU 还在做什么?  也许当时它还在处理一些其他高优先级中断?   

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    我使用 for 循环擦除6个闪存选择器。

    您可以在我的屏幕截图中看到、我的计时器中断有6个长时间的暂停。 每次暂停大约需要15ms、在表7-5中响应闪存擦除时间。 《闪存参数》、SPRSP45B。 TEST 引脚(绿色)在擦除之前设置、并在擦除后复位。

    函数 Fapi_issueAppeliCommandAppiAddress 需要很长时间、我无法理解原因。

    除了计时器中断、我们还具有 LIN 中断(无高优先级)整个时间(不仅在闪存擦除期间)

    此致、

    问题

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

    Quy、

    您能否向我展示链接器命令文件如何映射.TI.ramfunc 段?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    上传 cmd 文件很复杂、因此我复制了 cmd 以及代码块中的映射文件:

    如需了解相关信息、我还使用优化级别4、代码/大小2。

    MEMORY
    {
       BEGIN           	: origin = 0x080000, length = 0x000002
       BOOT_RSVD		: origin = 0x00000002, length = 0x00000126
       RAMM0           	: origin = 0x00000128, length = 0x000002D8
       RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
    // RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       
    /* RAMLS4           : origin = 0x0000A000, length = 0x00000800
       RAMLS5           : origin = 0x0000A800, length = 0x00000800
       RAMLS6           : origin = 0x0000B000, length = 0x00000800
       RAMLS7           : origin = 0x0000B800, length = 0x00000800 */
    
       /* Combining all the LS RAMs */
       RAMLS4567        : origin = 0x0000A000, length = 0x00002000
       RAMGS0           : origin = 0x0000C000, length = 0x000007F8
    // RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RESET            : origin = 0x003FFFC0, length = 0x00000002
    
    
       BOOTROM          : origin = 0x003F0000, length = 0x00008000
       BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
    
       /* Flash sectors */
       /* BANK 0 */
    // FLASHBANK0       : origin = 0x00080000, length = 0x0000FFF0
       FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
       FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x000FF0	/* on-chip Flash */
    // FLASH_BANK0_SEC15_RSVD     : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN, ALIGN(8)
       .text            : >> FLASH_BANK0_SEC0| FLASH_BANK0_SEC1,   ALIGN(8)
       .cinit           : > FLASH_BANK0_SEC1,  ALIGN(8)
       .switch          : > FLASH_BANK0_SEC1,  ALIGN(8)
       .reset           : > RESET,                  TYPE = DSECT /* not used, */
    
       .stack           : > RAMM1
    
       .init_array      : > FLASH_BANK0_SEC1,  ALIGN(8)
       .bss             : > RAMLS4567
       .bss:output      : > RAMLS4567
       .bss:cio         : > RAMGS0
       .const           : > FLASH_BANK0_SEC1,  ALIGN(8)
       .data            : > RAMLS4567
       .sysmem          : > RAMLS4567
    
        ramgs0 : > RAMGS0
        ramgs1 : > RAMLS4567
    
        /*  Allocate IQ math areas: */
       //IQmath           : > RAMLS4567
       //IQmathTables     : > RAMLS4567
    
      .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                      RUN = RAMGS0,
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      ALIGN(8)
    
    }
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    此致、

    问题

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

    Quy、

    正如我预期的那样、您正在从闪存而不是 RAM 执行闪存 API。   

    您可能正在使用 ROM 闪存 API?  请确认。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    我在 C2000Ware_3_04_00_00中有2个 API 文件:

    FlashAPI_F28002x_FPU32.lib

    FlashAPI_ROM_F28002x_FPU32.lib

    我将 FlashAPI_F28002x_FPU32.lib 复制到了我的项目中。 它是 RAM 闪存 API。 另请检查映射文件、例如第283行

    我使用了具有 ramfunc 的闪存函数:

    #pragma CODE_SECTION(Fls_Erase, ".TI.ramfunc")

    此致、

    问题

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

    Quy、

    好的、您没有使用 ROM 闪存 API。  您显示的 pragma 仅用于 FLS_Erase、而不用于闪存 API。

    您可以执行如下操作、将 API 映射到闪存以进行加载、并将 RAM 映射到执行。   



    .TI.ramfunc
    {-l FlashAPI_F28002x_FPU32.lib}

    }LOAD = FLASH_SECX、
    运行= RAMLSX、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (8)

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    非常感谢您提供的信息。

    我刚刚再次阅读了 F28002x_Flash_API_Reference_Guide、还有一个问题:

    FlashAPI_ROM_F28002x_FPU32.lib 与 FlashAPI_F28002x_FPU32.lib 的区别在于***ROM_lib 位于引导 ROM 中、而另一个位于闪存中、不是吗?

    我是否还必须执行指令才能将*** ROM***.lib 加载到 RAM 中?

    或者、我们不需要将 BootROM 版本加载到 RAM 中、因为 BootROM 可以调用闪存中的中断函数?

    此致、

    问题

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

    Quy、

    ROM 版本已在 BootROM 中-因此、您无需在链接器 cmd 文件中为其执行任何操作。  您只需将该库添加到项目中即可。  无需将其复制到 RAM -对 ROM 闪存 API 的任何调用都将直接转到引导 ROM 空间中的闪存 API。  然而、在一个激活的闪存擦除/编程操作期间、仍然不允许闪存访问。   使用 ROM API 的优势是可以节省 RAM 空间。  

    请注意、ROM 闪存 API 不受保护。  如果您希望闪存 API 也位于安全存储器中、则需要使用非 ROM API 并将其映射到安全闪存/RAM。  

    非 ROM 版本:如果要将其嵌入应用程序、则需要将其映射到闪存、然后在 应用程序执行其函数之前将其复制到 RAM。

    这回答了您的问题吗?

    谢谢、此致、

    Vamsi