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.

[参考译文] MSPM0G3507:闪存 API 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1418133/mspm0g3507-flash-api-issue

器件型号:MSPM0G3507

工具与软件:

嗨、 团队:

Driverlib 提供了一些 用于写入闪存的 API (例如 programCacheFromRAM8WithECCGenerated)、但它们均在4字节内。 是否有适合大量编写的推荐解决方案? 您是否需要检查某些状态?

谢谢、此致、

Jiahui

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

    您好、Jiahui、

    您可以参考示例代码"flashctl_multiple_size_write_lp_MSPM0G3507"、并可找到更多闪存控制 API、例如:  

    有关闪存控制的说明、请参阅 TRM 中的扇区6.1 NVM 概述。

    此致、

    Janz Bai

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

    你好、Janz

    感谢您的快速回复。

    在这种情况下、最多只能写入8个字节。
    但我们将会进行大量写入、例如128KB 的数据包。 应使用哪种接口、或者针对这种情况应建议哪种设计解决方案? 是否是对以8个字节写入的接口的直接循环调用?

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

    尊敬的 Janz:

    有更新吗?

    谢谢、此致、

    Jiahui

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

    您好、Jiahui、

    很抱歉,我是9月28日到10月7日的国庆节假期  

    实际上、64位数据(加上8个 ECC 位)是一个单个闪存字。 所有器件一次支持单个闪存字编程、一些器件还支持多字编程模式、在该模式下、可以通过单个命令操作写入2个、4个或8个闪存字、但 MSPM0G3507无法写入。  

    一次最多可以将64位数据(加上8个 ECC 位)写入闪存。

    如果要写入更多数据、则需要写入多次。

    此致、

    Janz Bai  

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

    尊敬的 Janz:

    我们是否需要自行调用 driverlib 中的接口来执行循环写入? 请帮助确认以下写入方法是否可接受、以及是否建议检查更多状态以确认写入成功


    在 SDK 中、驱动程序中已经封装了一层 ADC、I2C 等。 闪存是否有任何相关的布置、这将反映在后续新版本的 SDK 中、供所有人使用? 如下图所示

    谢谢、此致、

    Jiahui

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

    您好、Jiahui、

    您的基本逻辑是正确的、但需要注意以下几点:

    1)。 将数据写入闪存之前、需要首先擦除闪存区域、我们的 M0擦除区域大小为扇区(1KB)或存储体(整个闪存)。 我想一个扇区就足够了、但如果您想使用更多扇区、可以通过修改此函数的低音地址来擦除更多扇区。 我建议基地址 为0x400、0x800、0xC00、TEC、因为一个闪存扇区是1KB (1024字节)。

    2)。 M0闪存具有保护功能。  

    因此、在写入 闪存或擦除闪存之前、需要取消保护 MAIN 存储器中的扇区。 函数为:

    此函数将取消保护"MAIN_BASE_ADDRESS"所属的扇区。  

    3)。 如果您在同一个闪存扇区中执行闪存操作、则无需在 UNPROTECT 函数中修改"u32TargetAddress"的值。  

    您可以 每次在 RAM64WithECCGenerated 中向"u32TargetAddress"添加8。

    4)。 如果使用 u32LenTemp 来计算字节数、则-8没有问题。 如果此变量用于计算其他格式的数量、则需要修改它。

    5)。 参考我们 SDK 中的示例代码"flashctl_multiple_size_write"是一种好方法、您可以在"dl_flashctl.h"和"dl_flashctl.c"文件中找到所需的所有函数。 有关闪存控制的相关寄存器的信息、您可以在 TRM 中找到它们。 尝试在 CCS 的调试模式下调试代码、这样可以帮助您查找在编写代码时可以忽略的任何小错误。

     

    我没记得我们已经计划生成用于闪存控制的驱动程序。 我可以讨论并请我的同事确认。

    此致、

    Janz Bai