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.

[参考译文] TMS320F28027:向不同扇区写入 FLASH_API

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1348024/tms320f28027-flash_api-writing-to-different-sectors

器件型号:TMS320F28027

您好!

我正在编写具有以下配置的应用程序:

CPU 访问引导 ROM 中的闪存 API 代码。
2802x_FlashAPI_BootROMSymbols_v2.01.lib 已链接

SECTIONS
{
 
   /* Allocate program areas: */
   /* The Flash API functions can be grouped together as shown below.
      The defined symbols _Flash28_API_LoadStart, _Flash28_API_LoadEnd
      and _Flash28_API_RunStart are used to copy the API functions out
      of flash memory and into SARAM */

   .cinit              : > BOOT_IMAGE       PAGE = 0
   .pinit              : > BOOT_IMAGE,      PAGE = 0
   .text               : > BOOT_IMAGE       PAGE = 0
   codestart           : > BEGIN            PAGE = 0
   ramfuncs            : LOAD = BOOT_IMAGE, 
                         RUN = RAMM1, 
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         PAGE = 0

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
MemCopy(&RamTimerfuncsLoadStart, &RamTimerfuncsLoadEnd, &RamTimerfuncsRunStart);

闪存扇区 A -->用户引导加载程序
闪存扇区 B、C、D ->应用程序代码

用户引导加载程序具有以下特性:
-读取并写入扇区 B、C、D。 不是
- UART protocoll ,中断驱动
-基本定时器中断
-不使用闪存 API 回调

通常、在引导加载程序中、我会将所有内容都放在 RAM 中。

#pragma CODE_SECTION(mainLoop, "ramfuncs");

我为每个函数和 ISR 例程重复此代码。
第一个问题是:如果 Flash_API 驻留在 ROM 中、我真的需要将所有内容放在 RAM 中吗?
尤其是在我写入不同的扇区时。
也许我只需要在 RAM 中放置 ISR?

第二个问题是:CODE_SECTION 只会在 RAM 中放置命名的函数、还是在其实现中调用的函数?

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

    您好!

    如果 Flash_API 驻留在 ROM 中、我真的需要将所有内容放在 RAM 中吗?

    FLASH_API 可从 ROM 或 RAM 运行、而不是闪存。 从 ROM 运行 API 的唯一好处是、无需额外步骤即可复制函数以执行它们。

    code_section 将只能在 RAM 中放置命名函数或在其实现中调用的函数?

    只有命名的函数 code_section 不是递归副本。

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

    因此我无需将我自己调用 Flash_API 的代码放入 RAM 中?

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

    您好!

    不、如果您需要、可以直接从 ROM 中运行它。 此器件在 ROM 中具有闪存 API、所以就是这样。

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

    谢谢你。 不过为了确保:如果我需要访问阵列、例如

    const Uint16 Buffer[WORDS_IN_FLASH_BUFFER];
    FLASH_ST FlashStatus;
    
    void main(void)
    {
        Flash2802x_Erase(SECTORB | SECTORC | SECTORD, &FlashStatus);
    }
    
    // 1ms
    interrupt void _ISR_Timer_1(void)
    {
        // there is not limition on code on reading buffer
    }

    我没有因擦除扇区 B、C、D 而施加的限制?

    来自"TMS320F2802x PiccoloTM A 修订版 A 闪存 API"

    在这些器件上、只有一个闪存阵列。 闪存架构强制要求闪存
    一次只能执行一个操作。 由于这一限制、在擦除、编程或验证
    闪存、代码本身不能执行并且不能从闪存中提取数据。

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

    您好!

    如果需要访问阵列,例如

    如果您意味着您是否可以擦除多个闪存扇区、则根据文档可以执行此操作(它们不会 同时擦除、但都将被擦除):