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.

[参考译文] MSP432P401R:MAP_FlashCTL_programMemory

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/619265/msp432p401r-map_flashctl_programmemory

部件号:MSP432P401R

您好,

快速解决。 能否使用 如下MAP_FlashCTL_programMemory()函数:

我已对所有要编程的扇区进行了保护,并调用 了map_Flashctl_performMassErase().

例如,我想用一些数据对整个主BANK0进行编程,我可以这样做吗:

长度=4096;

TMP = 0;

执行{

tmp =  map_Flashctl_programMemory (src,dest,length);  

} While (!tmp);

在某些方面如此,直到我对主BANK0进行编程。

我知道如果不首先擦除内存,就无法对其进行编程,因此,如果首次尝试失败,它将每隔一段时间失败一次,或者它只会对首次失败的内存进行编程,并跳过首次尝试时编程的内存, 或者,我是否需要在每次编程失败时删除该扇区?  

此致,

Ugljesa Popovic

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

    您好,Ugljesa Popovic,

    我知道,如果不首先擦除内存,就无法对其进行编程,因此,如果此函数第一次尝试失败,它将每隔一次失败一次,或者只对第一次失败的内存进行编程,而跳过第一次尝试时编程的内存, 或者,我是否需要在每次编程失败时删除该扇区?  [/引述]

    正确,您需要先擦除闪存,然后再对其进行编程。  但 在这种情况下,

    Ugljesa Popovic 说:
    我已保护了我要编程的所有扇区,并调用 了MAP_Flashctl_performMassErasure().
    API将不会进入闪烁部分,因为该部分仍受保护。 因此将会出现错误,因为该部分受到保护。

    另一种方法是在尝试对闪存进行编程之前验证闪存是否已被擦除,您可以使用MAP_FlashCTL_verifyMemory API执行此操作

    希望这能有所帮助。

     Davud

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

    大卫杜尔您好,
    感谢重播。
    我不知道您说的是我确实需要在程序之前擦除,还是说是,如果map_Flashctl_programMemory(sr, dest, length)无法编程,那么您是否需要擦除已尝试编程的扇区,这样您就不能在DO-while循环中获得堆栈? :D
    感谢回答的第二部分,不知道在按摩擦除后,扇区会再次受到保护。

    关于MAP_FlashCTL_verifyMemory API。 如果我确认闪存被擦除,MAP_Flashctl_programMemory()肯定会成功,因为我在“DO-while”(DO-while)中执行此操作的全部原因是因为我不知道其他原因,如果闪存被擦除且扇区未受保护,程序内存将会失败?

    此致。

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

    您好,

     很抱歉混淆了。

    [QUETE USER="Ugljesa Popovic]只是为了澄清,因为我不确定你说我确实需要在程序之前擦除,或者说是,如果MAP_FlashCTL_programMemory(src,dest, length)无法编程,那么你需要擦除已经尝试编程的扇区,所以你不能在DO-while循环中获得堆栈? :D[/QUOT]

    您需要在编程之前清除,但由于 您“未保护 要编程的所有扇区,然后调用 map_Flashctl_performMassErase”,因此您将只对 已删除 的扇区进行编程。 换言之,“MAP_FlashCTL_PROGRAM内存”将在尝试对受保护扇区=未擦除扇区进行编程时失败。

    Ugljesa Popovic 说:
    感谢回答的第二部分,不知道在massErase之后扇区会再次受到保护。[/QUOT]

    抱歉,擦除后,扇区将保持未受保护状态。 这就是为什么"map_Flashctl_programMemory"只对未受保护的扇区进行编程的原因。

    关于map_Flashctl_verifyMemory API。 如果我确认闪存被擦除,MAP_Flashctl_programMemory()肯定会成功,因为我在“DO-while”中执行此操作的全部原因是因为我不知道其他原因,如果闪存被擦除且扇区未受保护,程序内存将会失败?

    在某些情况下,不一定会出现与程序或擦除耐久性相关的内部错误,API将返回故障。

    此致,

     David

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

    我结束了这个话题,因为我不会再打扰你了,但我对答案并不完全满意
    我知道我必须取消保护扇区并在程序之前删除,我正在使用massErase,因为我不会逐个扇区删除,而且我知道,如果他尝试对受保护扇区进行编程,程序内存将失败。 我的主要问题是,你可以再看看这个“DO-while”循环的第一篇文章,是:
    现在观看我要编程的一个未受保护的先前已擦除的扇区。 程序内存API开始对扇区进行编程,我们假设由于某种原因,它在扇区的一半处失败。 因为它失败,所以没有条件退出循环,并且再次调用programMemory。
    现在程序内存API是否每次都失败,因为有一半的扇区未被擦除,或者此API是否会“跳过”此扇区的一半,看到他必须编程的数据与闪存中的数据相同,并继续使用相应的数据对扇区的下半部分进行编程?

    此致。