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.

[参考译文] TMS320F28388D:在 SYS/BIOS 中使用闪存 API

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios

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

您好!

我的目标是使用 SYS/BIOS 中的闪存 API 在 TMS320F28388D 中的 CM 闪存中进行读取/写入。 当我处理非 RTOS 项目时、我成功完成了这个操作。 但是、我不知道如何在 SYS/BIOS 中使用闪存 API。 是否有人可以解释我该怎么做?


谢谢、
Alex

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

    Alex、

    我认为这两者之间的闪存 API 使用没有任何区别。  您是否遇到任何问题?  请提供特定的详细信息、以便我们的 SYS/BIOS 专家可以为您提供帮助。

    谢谢、此致、
    Vamsi  

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

    Vamsi、

    感谢你的答复。 每当我在一个 SYS/BIOS 项目中调用以下函数时、程序就会卡在该项目中:

        FLASH_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、2);

    我不知道为什么会发生这种情况。 请您解释一下吗?

    谢谢、

    Alex

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

    Alex、

    明白了。  以上不是闪存写入/擦除 API 函数。  它是一个闪存 driverlib 函数。

    以上内容应从 RAM 执行、而不是从闪存执行。  您能确认是否正在从 RAM 执行它吗?

    谢谢、此致、

    Vamsi

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

    Vamsi、  

    是的、我将所有闪存 driverlib 和闪存 API 函数加载到闪存中、然后在 RAM 的".TI.ramfunc"部分复制这些函数。 然后我执行这些函数。

    谢谢、

    Alex

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

    Alex、

    该函数中没有任何环路。  卡住意味着什么?  如果您尝试从此处执行、会发生什么情况?  您可能可以附加一个小型视频。

    您能否检查是否有任何复位(在 XRSn 上切换)?   

    谢谢、此致、

    Vamsi

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

    Vamsi、

    作为测试、每当我调用这两条线时、LED2将被切换:

    GPIO_togglePin (DEVICE_GPIO_PIN_LED2);
    FLASH_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、2);

    但是、每当我调用这两行代码时、它将不会:

    FLASH_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、2);
    GPIO_togglePin (DEVICE_GPIO_PIN_LED2);

    我也没有更改 Flash_initModule()函数内的任何内容。  

    谢谢、

    Alex

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

    在.cfg 文件中、您是否启用了引导模块"Configure Flash controller"选项(Boot.configureFlashController = true)? 如果是、您能否禁用它并查看它是否起作用? 如果您尝试同时使用 Flash_initModule(),它可能会与它们冲突。

    惠特尼

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

    尊敬的惠特尼:

    感谢您的解释。 我已经尝试在.cfg 文件中启用和禁用引导模块、但问题仍然存在。

    谢谢、

    Alex  

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

    我可以通过删除"cm.c"文件中的_flash 预定义符号来解决此问题。 通过这种方式、"memcpy"函数可以成功地将闪存 driverlib 函数复制到 RAM 中。 但是、现在我对以下函数有相同的问题。

    oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、(uint32_t *) address);

    这次、程序卡在该函数中(它擦除 CM 闪存的第一个扇区)

    请您解释一下具体发生了什么以及我如何解决这个问题吗?

    谢谢、

    Alex  

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

    Alex、

    我需要检查为什么删除预定义符号有助于将函数复制到 RAM。  该符号是启用闪存构建配置需要编译/执行的代码所必需的。  我将在下周与 Whitney 讨论、并与您联系。

    关于擦除命令、您是否说一个扇区的擦除成功、然后它卡住了?  如果是、该控件位于哪个地址?

    谢谢、此致、
    Vamsi

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

    Vamsi、  

    感谢你的答复。 我对删除预定义的_flash 有了更多的解释;它可能会对您有所帮助。 在 CM_INIT()函数(在"cm.c"文件中)中,当我删除#ifdef __FLASH 条件时,它会执行"memcpy"函数并成功复制 RAM 中的 Flash_initModule(),这就是程序不会卡在该函数中的原因。 但是,当我取消注释#ifdef _flash 时,程序会卡在 Flash_initModule()函数中。 您可以在下图中看到代码:

    关于擦除命令、我说、即使程序首次开始运行擦除命令、它仍然会卡住。

    谢谢、

    Alex

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

    Alex、

    在上面,您说它卡在  Flash_initModule()中,即使 在取消对#ifdef _flash 的注释后-我是否得到了正确的答案?

    关于擦除:因为您说过"(它会擦除 CM 闪存的第一个扇区)"-我认为它会擦除第一个扇区、然后失败。  您应该提供说明。  PC 卡在何处?  您可以发送地图文件吗?  我想了解闪存 API 的执行位置。

    谢谢、此致、
    Vamsi

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

    Vamsi、

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3799059 #3799059"]您说它卡在  Flash_initModule()中,即使 在取消对#ifdef _flash 的注释后-我是否得到了正确答案?

    否,取消注释#ifdef _flash 后,它成功执行 并通过 Flash_initModule()。 但是、这次它停留在擦除命令中。 在取消注释之前,它会停留在代码中的 ERASE 命令之前的 Flash_initModule()中。 我希望这一点很清楚。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3799059 #3799059"]关于擦除:因为您说过"(它会擦除 CM 闪存的第一个扇区)"-我认为它会擦除第一个扇区、然后失败。  您应该提供说明。  PC 卡在何处?  您可以发送地图文件吗?  我想了解闪存 API 的执行位置。

    是的、我提到过、但我的意思是我希望它会擦除第一个扇区、但实际上它不会擦除。 因此、即使是第一次、它也不会擦除。 很抱歉、如果不清楚。 程序计数器寄存器卡在 0x0026A562处。 闪存 API 从 CM 闪存的第6部分加载、并从 CM 的 C0RAM 运行。 此外、以下文本是您需要考虑的映射文件。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ******************************************************************************
    TI ARM Linker PC v20.2.4
    ******************************************************************************
    >> Linked Fri Aug 13 14:53:46 2021
    OUTPUT FILE NAME: <tcpEchoF2838X.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 0026a561
    MEMORY CONFIGURATION
    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    CMBANK0_RESETISR 00200000 00000008 00000006 00000002 RWIX
    CMBANK0_SECTOR0 00200008 00003ff7 000000a0 00003f57 RWIX
    CMBANK0_SECTOR1 00204000 00004000 00000000 00004000 RWIX
    CMBANK0_SECTOR2 00208000 00004000 00000000 00004000 RWIX
    CMBANK0_SECTOR3 0020c000 00004000 00000000 00004000 RWIX
    CMBANK0_SECTOR4 00210000 00010000 00000000 00010000 RWIX
    CMBANK0_SECTOR5 00220000 00010000 00000000 00010000 RWIX
    CMBANK0_SECTOR6 00230000 00010000 00001e4c 0000e1b4 RWIX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    最棒的

    Alex

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

    PC 寄存器卡在 0x0026A562处、即"_c_int00"。

    最棒的

    Alex

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

    Alex、

    您能否检查 XRSn 上是否有切换?

    谢谢、此致、

    Vamsi

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

    Vamsi、

    感谢您的提问。 我 刚刚检查了几次、运行代码时、XRSn 上没有任何切换。

    谢谢、

    Alex

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

    Alex、

    感谢您的确认。

    您能否将链接器 cmd 文件附加到闪存 API 与.TI.ramfunc 组合在一起的位置(以加载到闪存、但从 RAM 执行)?

    2.您之前提到必须取消注释 #ifdef _flash。  如您在 C2000Ware 示例中所见、我们为给定示例工程的闪存构建配置添加了此符号。  这是为了启用需要编译/执行的代码、以便基于闪存执行。   您是否在项目中定义了此符号?

    3. 请确保调用闪存 API 函数的函数也从 RAM 复制并执行。  闪存 API 指南对此进行了说明、如下所示:

    4.您是否为正在执行闪存擦除/编程操作的内核获取了闪存泵信号量?

    请参阅以下常见问题解答:

    a)搜索 "当闪存 API 无法擦除或编程时、我们可以考虑哪些常见调试提示?" 在以下常见问题解答中:  

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices

    b) 如何将应用程序从 RAM 配置修改为闪存配置?:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674 

    谢谢、此致、
    Vamsi

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

    Vamsi、  

    感谢您的详细回答。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801043 #3801043"]1. 您能否在闪存 API 与.TI.ramfunc 组合的位置附加链接器 cmd 文件(以加载到闪存但从 RAM 执行)?[/quot]

    1) 1)以下文本是链接器 cmd 文件:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    * Copyright (c) 2018, Texas Instruments Incorporated
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    *
    * * Redistributions of source code must retain the above copyright
    * notice, this list of conditions and the following disclaimer.
    *
    * * Redistributions in binary form must reproduce the above copyright
    * notice, this list of conditions and the following disclaimer in the
    * documentation and/or other materials provided with the distribution.
    *
    * * Neither the name of Texas Instruments Incorporated nor the names of
    * its contributors may be used to endorse or promote products derived
    * from this software without specific prior written permission.
    *
    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801043 #3801043"]

    2.您之前提到必须取消注释 #ifdef _flash。  如您在 C2000Ware 示例中所见、我们为给定示例工程的闪存构建配置添加了此符号。  这是为了启用需要编译/执行的代码、以便基于闪存执行。   您是否在项目中定义了此符号?

    [/报价]

    2)是的、我还在项目属性中使用了_flash 符号、但仍然存在相同的问题。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801043 #3801043"]

    3. 请确保调用闪存 API 函数的函数也从 RAM 复制并执行。  闪存 API 指南对此进行了说明、如下所示:

    [/报价]

    3)是的、我确保即使是调用闪存 API 函数的函数也从 RAM 中复制和执行。 我可以在存储器分配中看到已放置在 CM 的 C0RAM 中的那些函数。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801043 #3801043"]您是否为执行闪存擦除/编程操作的内核获取了闪存泵信号量?[/quot]

    4) 4)是的、我调用以下函数来获取 CM 内核的闪存泵信标:

    FLASH_MPREMPumpSemaphore (FLASH_CM_WRAPER_);

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801043 #3801043"]

    请参阅以下常见问题解答:

    a)搜索 "当闪存 API 无法擦除或编程时、我们可以考虑哪些常见调试提示?" 在以下常见问题解答中:  

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices

    b) 如何将应用程序从 RAM 配置修改为闪存配置?:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674 

    [/报价]

    5) 5)感谢您提供这些常见问题解答。 我仔细研究了这些问题及其答案。 我发现我执行了那里提到的所有项目。

    如前所述、我的代码在非 RTOS 项目中正常工作。 我是说我可以在非 RTOS 工程中成功对 CM 内核的闪存执行读/写操作。 但是、当我将相同的函数(我为闪存编程编写的函数)应用到基于 RTOS 的工程时、程序会卡在某些闪存 API 函数中。

    更具体地说、我使用了 您的"tcpEchoF2838X"示例、该示例使用 SYS/BIOS。 我在其中添加了闪存编程函数。 在此代码中、我有一个线程。 该线程用于对 CM 的闪存执行读/写操作。 例如、要执行"写入"操作、首先我使用以下函数擦除闪存:

    1) Fapi_issueAppiCommandAppiAddress (Fapi_EraseSector、(uint32_t *) address);

    然后、我调用此函数在闪存上写入"数据":

    2) fapi_issueProgrammingCommand ((UINT32 *) address、data、size、0、0、0、 Fapi_AutoEccGeneration);

    今天、我刚刚发现、每当我对闪存执行"写入"操作时、程序会成功擦除闪存、但无法对闪存执行写入操作。 另外,作为另一项测试,当我注释掉此代码中的 ERASE 命令(Fapi_issueCommandWithAddress())时,编程命令(Fapi_issueProgrammingCommand))成功写入闪存。 程序似乎只能在线程中运行一个闪存 API 函数。

    我必须再次提到、我在 非 RTOS 项目中使用此代码、它完全正常。 我的意思是擦除所需的闪存扇区、然后将数据写入闪存。 但是、每当我在基于 RTOS 的工程上运行此代码时、我都会遇到前面提到的问题。

    我希望这种解释能更好地解决问题。

    谢谢、

    Alex  

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

    Alex、

    好的。  当前的总结是、您可以很好地擦除而不是编程。  但是、您之前说过、当调用擦除时、控制在 cinit 例程中?  

    您说过、如果不包含擦除、程序将正常工作。  当程序失败时、您从程序命令中得到了什么错误?  程序命令后的 FMSTAT 值是什么?

    一件事: 您能否将链接器 cmd 文件更改为.TI.ramfunc 和 API 库组、如下所示?  也可使用 ALIGN (16)在128位边界上对齐。




    .TI.ramfunc
    {-l F2838x_CM_FlashAPI.lib}

    }负载= CMBANK0_SECTOR0,
    运行= C0RAM、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(16)

    谢谢、此致、

    Vamsi

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

    Vamsi、

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801479 #3801479]OK。  当前的总结是、您可以很好地擦除而不是编程。  但是、您之前说过、当调用擦除时、控制在 cinit 例程中?  [/报价]

    是的、这是我当前情况的摘要。

    关于您的问题、是的、我提到在调用擦除时、控制在 cinit 例程中。 实际上、只要我在 优先级低于 主线程优先级的线程中调用擦除命令、就会发生这种情况。 更具体地说、我的代码中有一个主线程和几个在主线程上运行的子线程。 其中一个线程用于对闪存执行读/写操作。 因此、当我在这种情况下执行代码时、PC 会一直处于 cinit 例程、我不知道原因。 这就是为什么我提到控制在 cinit 例程中的原因。 然后、我缩小了问题范围、并从代码中删除了所有子线程。 现在、我只有一个要在其上执行闪存编程函数的主线程。 这是我的代码的最新情况。 我希望这是清楚的,并有所帮助。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801479 #3801479"]您说、如果不包含擦除、程序将起作用。  当程序失败时、您从程序命令中得到了什么错误?  程序命令后的 fmstat 值是什么?[/quot]

    是的、你是对的。 当我同时执行擦除和编程命令时、程序会擦除闪存、但不会在闪存上写入任何数据。 在这种情况下,我尝试使用以下代码显示 fmstat 的值和程序命令的错误:

    但是、这里的问题是程序永远不会到达显示 fmstat 和擦除命令输出的324和325行。 我的意思是, 在这种情况下,我无法使用 System_printf()函数在 ROV 中看到任何内容。 程序似乎卡在擦除命令中。 但是、我可以看到闪存扇区已在存储器浏览器中被擦除。 当我在不执行程序命令的情况下只执行擦除命令时、也会发生这种情况。  

    另一方面、当我注释擦除 命令(从第323行到330行)时、程序 会成功执行程序命令、并且它会正确显示程序命令(oReturnCheck)的输出、即0 (Fapi_Status_Success)。 此外、fmstat 的值为十进制的320、也是正确的(我在 《TMS320F2838x 闪存 API 参考指南》(SPNU632)中使用 fmstat 寄存器位字段进行了检查)。  这是我问题的最新情况。

    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3801479 #3801479"]

    一件事: 您能否将链接器 cmd 文件更改为.TI.ramfunc 和 API 库组、如下所示?  也可使用 ALIGN (16)在128位边界上对齐。




    .TI.ramfunc
    {-l F2838x_CM_FlashAPI.lib}

    }负载= CMBANK0_SECTOR0,
    运行= C0RAM、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(16)

    [/报价]

    感谢您的建议。 正如您提到的、我还更改了我的链接器 cmd 文件、但同样的问题仍然存在。

    谢谢、

    Alex

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

    您是否启用了中断? 如果是、您是否已将其 ISR 移至 RAM? 是否已确保对 SYS/BIOS Hwi 函数执行相同的操作? 我只是想知道 SYS/BIOS Hwi 调度程序或系统节拍 Hwi 函数是否在中断中被调用、并且它正在尝试从闪存执行它们。

    惠特尼

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

    Whitney、

    我还禁用了 SYS/BIOS 中的 Hwi 模块及其调度程序、但问题仍然存在。

    谢谢、

    Alex

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

    感谢 Vamsi 和 Whitney 的帮助。

    我可以解决这个问题。 我从 CM_init()函数中删除了以下函数:

    interrupt_setVectorTableOffset (((uint32_t) vectorTableRAM);

    现在、我可以在闪存上成功执行写入/读取操作。

    虽然我的问题已经解决了,但我不能完全理解发生了什么。 我想知道您能否详细解释一下这个函数和这个问题、以及这个问题的确切原因是什么。 当我在非 RTOS 工程中运行此函数时、为什么 RTOS 工程中会发生这种情况、而它完全正常工作?

    我期待收到你的回复。

    谢谢、

    Alex

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

    很高兴找到了解决方案。 我需要进行一些调查、以确定、 但通常 SYS/BIOS 会尝试为您管理矢量表、插入其 Hwi 调度程序并配置 NVIC 以适应 Hwi 模块设置、因此我猜的是 CM_init()中的那一行与 SYS/BIOS 在这方面所做的事情相冲突。

    我想让人对这一理论产生怀疑的是您尝试禁用 Hwi、对吧? 也许他们没有完全禁用? 即使你不是特意自己添加 Hwi 模块、如果你正在使用任何与时钟相关的功能、SYS/BIOS 也可能会将它拉入。

    惠特尼

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

    谢谢。 是的、没错。 我在.cfg 文件中的"System Overview"选项卡中禁用了 Hwi 模块。 那么、如果它们没有完全禁用、我该怎么做? SYS/BIOS 代码中是否有任何其他部分使用硬件中断?  

    即使我禁用了 Hwi、我也遇到了相同的问题。 但是、当我删除以下函数时、我的问题得到了解决。

    interrupt_setVectorTableOffset (((uint32_t) vectorTableRAM);

    这里重要的是,如果我需要在 CM_init()函数中删除此函数,那么我如何处理其他外设中的其他中断? Hwi 是否管理这些中断、 而其他外设中的中断不会出现问题?

    谢谢、

    Alex

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

    您可以在 ROV 中上拉 Hwi 模块并查看创建了什么 Hwi。 通常有一个创建用于时钟模块的时钟。 我今天下午对它进行了一些试验,实际上无法找到完全删除它的方法-- Hwi 函数继续显示在.map 文件中。 不过、我认为没有必要将其删除。 请注意、可能需要禁用某些中断或某些可能需要从 RAM 执行的 Hwi 模块函数、以避免干扰闪存编程。

    如果您使用的是 SYS/BIOS、通常需要让 SYS/BIOS 为您管理中断。 您无需在应用程序中直接配置 NVIC 或矢量表、而是通过.cfg 文件或使用 Hwi_create()为中断创建 Hwi 实例、SYS/BIOS 将配置这些内容。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3804141 #3804141]\n 您可以在 ROV 中上拉 Hwi 模块并查看创建了什么 Hwi。 通常有一个创建用于时钟模块的时钟。 我今天下午对它进行了一些试验,实际上无法找到完全删除它的方法-- Hwi 函数继续显示在.map 文件中。 不过、我认为没有必要将其删除。 请注意、可能需要禁用某些中断或某些可能需要从 RAM 执行的 Hwi 模块函数、以避免干扰闪存编程。

    是的、你是对的。 时钟模块只使用一个 Hwi。 尽管 我禁用了两个模块,但问题仍然存在。 但是、当我删除以下函数时、问题就会得到解决。

    interrupt_setVectorTableOffset (((uint32_t) vectorTableRAM);

    您是否知道 SYS/BIOS 的哪些其他部分与此函数有冲突?

    总之、感谢您在闪存编程操作期间使用 Hwi 模块的建议。

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3804141 #3804141"]如果您使用的是 SYS/BIOS、通常需要让 SYS/BIOS 为您管理中断。 您无需在应用中直接配置 NVIC 或矢量表、而是通过.cfg 文件或使用 Hwi_create ()为中断创建 Hwi 实例、SYS/BIOS 将配置这些内容。

    感谢您的解释。 有道理。

    最棒的

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="475471" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1027292/tms320f28388d-using-flash-api-in-sys-bios/3804193 #3804193"]您是否知道 SYS/BIOS 的其他哪些部分与此函数有冲突?

    这个函数应该只与 Hwi 模块发生冲突。 如果任何其他模块需要创建中断或禁用中断或以任何方式更改中断配置、它们将通过对 Hwi 模块的函数调用来实现。

    惠特尼