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.

[参考译文] CC1312R:在 FlashProgram()使用之前禁用线路缓冲器

Guru**** 2551110 points
Other Parts Discussed in Thread: CC1312R, CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1046220/cc1312r-line-buffer-disabling-prior-to-flashprogram-usage

器件型号:CC1312R
主题中讨论的其他器件: CC1310

你好。

我们的平台采用 CC1312R 器件并使用 FlashProgram()函数运行内部闪存写入代码。

(代码包含  simplelink_cc13x2_26x2_SDK_4_40_04_04 SDK、不含 RTOS)。

根据  FlashProgram()的简短说明,建议在执行写操作之前禁用行缓冲区和高速缓存。

可以使用 VIMSLineBufDisable()/VIMSLineBufEnable()函数禁用/启用线路缓冲器。  

我们尝试寻找一个 TI 的示例、该示例类似于我们在代码中所做的工作、我们认为我们找到了一个示例:  

ti\simplelink_cc13x2_26x2_sdk_4_40_04_04\examples\notos\CC1312R1_LAUNCHXL_bim\bim_offchip

该示例显示了函数 writeFlashPg()的用法,该函数又调用  FlashProgram()。

尽管如此,行缓冲区禁用/启用似乎在  writeFlashPg()调用之前或 writeFlashPg()本身中都不使用。

如果我在该示例中缺少允许省略线路缓冲器启用/禁用的内容、请发送电子邮件给我。  

如果代码中确实缺少行缓冲区禁用/启用-为什么这样? 是否有任何情况  可以避免在写入内部闪存时启用/禁用线路缓冲器?  

我将摘录以下代码  

非常感谢  

/Gil。  

 /*********
*@fn checkImagesExtFlash
*
*@简要检查外部闪存上存储的映像。 如果找到有效的映像
*要复制,它会复制映像,如果映像是可执行的,则会跳转
*以执行。
三、会议的报告

 /*********

 .

/*将映像复制到内部闪存*/
uint8_t RetVal = BIM_copyImage (eFlStrAddr、imgFxdHdr.len、startAddr);

/*更新元数据标题中的副本状态*/
extFlashWrite (EXT_FLASH_ADDRESS (flashPageNum、IMG_COPY_STAT_OFFSET)、1、(uint8_t *)&STATUS);

/*如果图像复制成功*/
if (RetVal ==成功)

/*更新图像复制状态并计算
复制的 CRC
并更新它的 CRC 状态。 CRC_STAT_OFFSET
*

uint32_t CRC32 = CRC32_calc (flash_page (startAddr)、intFlashPageSize、0、imgFxdHdr.len、false);
if (CRC32 =imgFxdHdr.CRC32)//如果 CRC 匹配,则在复制的映像中更新其状态

STATUS = CRC_VALID;
/*元数据中的更新状态*/
extFlashWrite (flash_address (flashPageNum、CRC_STAT_OFFSET)、
sizeof (status)、&status);

/*内部闪存中的更新状态*/
writeFlashPg (flash_page (startAddr)、crc_STAT_OFFSET、
STATUS、sizeof (status))(&S);

#if (定义的(安全))
/*检查内部闪存映像上的符号验证*/
securityStatus = Bim_authentateImage (startAddr、metadataHdr.fixedHdr.len、false);
其他
securityStatus =成功;
#endif /*#if defined (security)*/

三、会议的结果

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A

/*********
*@fn writeFlash
*
*@简要将数据写入闪存。
*
*@param page -要在闪存中写入的页
*@param offset -闪存页中开始写入的偏移量
*@param pBuf -指向要写入的数据缓冲区的指针
*@param len -要以字节为单位写入的数据长度
*
*@返回无。
*
uint8_t writeFlashPg (uint8_t page、uint32_t offset、uint8_t * pBuf、uint16_t len)

uint8_t 高速缓冲状态;
uint32_t flashStat = flash_Success;

cachesState = disableCache ();

flashStat = FlashProgram (pBuf、(uint32_t) flash_address (page、offset)、len);

enableCache (高速缓存状态);

返回((flashStat = fapi_status_Success)? Flash_Success:flash_failure);

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

    您好、Gil、

    您能否详细介绍 一下您使用 FlashProgram API 编写的内容?

    FlashProgram 是 driverlib 的一部分。 一般而言、我建议您使用 NVS 驱动程序。 实现驱动程序以处理更多这些问题。 您可以找到以下文档:

    https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_5_20_00_52/docs/drivers/doxygen/html/_n_v_s_8h.html 

    (如果需要、闪存 driverlib 文档:  

    https://dev.ti.com/tirex/explore/content/simplelink_cc13x0_sdk_4_10_01_01/docs/driverlib_cc13xx_cc26xx/cc13x0/driverlib/group__flash__api.html#ga0d891d79df6dbba0288b15a8c30c1331) 

    谢谢、

    玛丽·H.

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

    您好 Marie  

    感谢您发送邮件。  

    我们使用 FlashProgram 将信息从外部闪存复制到 CC1312的内部闪存。 除此之外,没有太多可说的:)  

    虽然我们熟悉 NVS 驱动程序、但 ProgramFlash 函数是我们的其他产品中已经运行的代码的一部分、而该函数正常工作。

    以上问题源于这样一个事实、即我们不确定  VIMSLineBufDisable/VIMSLineBufEnable 是必须执行的操作、建议还是应在特定场景中添加的操作...这是因为这些函数不会出现在 TI 的官方示例中。  

    此致

    /Gil  

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

    您好、Gil、

    我强烈建议禁用它。 请参阅 NVS 驱动程序 disableFlashCache () API 中的实现。

    /*
     *  ======== disableFlashCache ========
     *  When updating the Flash, the VIMS (Vesatile Instruction Memory System)
     *  mode must be set to GPRAM or OFF, before programming, and both VIMS
     *  flash line buffers must be set to disabled.
     */
    static uint8_t disableFlashCache(void)
    {
        uint8_t mode = VIMSModeGet(VIMS_BASE);
    
        VIMSLineBufDisable(VIMS_BASE);
    
        if (mode != VIMS_MODE_DISABLED) {
            VIMSModeSet(VIMS_BASE, VIMS_MODE_DISABLED);
            while (VIMSModeGet(VIMS_BASE) != VIMS_MODE_DISABLED);
        }
    
        return (mode);
    }

    谢谢、

    玛丽·H.

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

    您好 Marie

    非常感谢您的邮件和帮助。

    已理解并将添加。

    在您允许的情况下-还有两个问题  

    1) 1)您是否有任何假设、为什么在本讨论中最初显示的示例中缺少这些函数?

    2) 2) VIMSLineBufDisable 和 VIMSLineBufEnable 是否也应添加到类似的 CC1310代码中?

    此致

    /Gil

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

    您好、Gil、

    1) 1)我不知道。 它可能与闪存的扇区有关。 BIM 始终驻留在同一扇区中、该扇区永远不会被覆盖。

    2)是的、我建议遵循与 NVS 驱动程序相同的过程。

    谢谢、

    Marie