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.

[参考译文] CC1352R:CAN#39;t FLASH A BLE OAD 生产映像

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1061946/cc1352r-can-t-flash-a-ble-oad-production-image

器件型号:CC1352R
主题中讨论的其他器件:UNIFLASH

您好、专家、

设置:

SDK:       simplelink_cc13xx_cc26xx_sdk_5_30_01_01
Uniflash:   7.0.0.3615
器件:   LPSTK-CC1352R1F3
XDC 工具: 3.62.1.16
编译器:   TI-CGT-ARM_20.2.5.LTS

按照有关构建和加载 OAD 映像的说明、通过刷写 BIM bim_offchip_CC1352R1_LAUNCHXL_nortos_ccs.hex (调试不安全)和  OAD_image_tool.exe 生成的*。bin:

${CG_TOOL_HEX} -order MS --memwidth=8 --romwidth=8 --intel -o ${ProjName}.hex ${ProjName}
${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/oad/oad_image_tool --verbose ccs ${PROJECT_LOC} 7 -hex1 ${ConfigName}/${ProjName}.hex -k ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/oad/private.pem -o ${ConfigName}/${ProjName}

但是、使用 Uniflash 和 Jlink 时、器件不会启动、尽管存在以下情况:

1) 1)闪存验证正常

[SUCCESS] Cortex_M4_0: Program verification successful for Multiple Files

2) 2)图像标题正常

由于  OAD_IMAGE_TOOL 公开了信息、因此图像标题看起来不错:

____________________________
       OAD IMG HDR
____________________________
Field       |    Value
imgID       |    b'CC13x2R1'
CRC         |    0x62EDF26E
bimVer      |    3
metaVer     |    1
techType    |    0xFFFE
imgCpStat   |    0xFF
crcStat     |    0xFF
imgType     |    0x7
imgNo       |    0x0
imgVld      |    0xFFFFFFFF
len         |    0x3F8D4
prgEntry    |    0xCC
softVer     |    0x31303030
imgEndAddr  |    0x3F8D3
hdrLen      |    0x2C
 

}

出现 在 *。bin 的开头:

注1:此外、使用 Uniflash 刷写*。out 时没有任何问题。

注2:未选中选项"Keep CCFG"。

问题:

  1. 因此、如果图像标头 和闪存验证都正确、那么在刷写 BIM.hex 和*。bin 时器件无法启动的原因是什么?
  2. 是否有方法检索引导失败? 引导加载程序详细消息? 其他、
  3. 是否有用于验证*。bin 完整性的工具、以确保二进制文件未损坏?

谢谢、

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

    你好、Jo、

    我已将此主题分配给了其他人。 他们应尽快答复。

    BR、
    安德烈斯

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

    您好!

    仔细查看存储器映射时、我注意到矢量表被映射@ 0x0090。:

    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .image_header 
    *          0    00000000    0000008d     
                      00000000    0000008d     oad_image_header_app.obj (.image_header:retain)
    
    .resetVecs 
    *          0    00000090    0000003c     
                      00000090    0000003c     mioty_pem4f.oem4f (.resetVecs)
    
    .intvecs   0    000000cc    00000000     UNINITIALIZED
    

    但是、在.image_header 中指定并被 BIM 使用 的程序入口点(prgEntry)等于0x00cc、对应 于.intvecs:

    ____________________________
           OAD IMG HDR
    ____________________________
    Field       |    Value
    imgID       |    b'CC13x2R1'
    CRC         |    0x62EDF26E
    bimVer      |    3
    metaVer     |    1
    techType    |    0xFFFE
    imgCpStat   |    0xFF
    crcStat     |    0xFF
    imgType     |    0x7
    imgNo       |    0x0
    imgVld      |    0xFFFFFFFF
    len         |    0x3F8D4
    prgEntry    |    0xCC          // <- it should be 0x90 for the .resetVecs
    softVer     |    0x31303030
    imgEndAddr  |    0x3F8D3
    hdrLen      |    0x2C

    实际上、链接器脚本会在 .intvecs 而不是.resetVecs 的地址公开符号 prgEntryAddr。

      GROUP > ENTRY
      {
        .resetVecs  
        .intvecs        LOAD_START(prgEntryAddr)
        EntrySection
      }

    因此 、器件不会在中断矢量表(.resetVecs)上跳转(CCS 编译器不使用该矢量)。

    因此、为了解决我的问题、我修改了链接器脚本 COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR\SOURCE \ti\ble5stack\ccommon\cc26xx\ccs\cc26x2_app_oad_agama.cmd、如下所示:

      GROUP > ENTRY
      {
        .resetVecs  LOAD_START(prgEntryAddr)
        .intvecs
        EntrySection
      }

    请确认吗?  

    谢谢

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

    你好、Jo、

    我无法识别您发布的代码片段。 默认情况下、这是 SDK 中的代码片段:

      GROUP > ENTRY
      {
        .resetVecs
        .intvecs
        EntrySection  LOAD_START(prgEntryAddr)
      }

    谢谢、

    玛丽·H.

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

    您好、Marie、

    感谢您的贡献、这只是一个错误的复制粘贴。

    我要指出的是、prgEntryAddr 不代表 .resetVecs、而是 .intvecs 地址、并且出于任何原因、我的 OAD 项目具有以下存储器映射:

    .resetVecs @ 0x90

    .intvecs @ 0xCC

    prgEntryAddr @ 0xCC  

    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .image_header 
    *          0    00000000    0000008d     
                      00000000    0000008d     oad_image_header_app.obj (.image_header:retain)
    
    .resetVecs 
    *          0    00000090    0000003c     
                      00000090    0000003c     mioty_pem4f.oem4f (.resetVecs)
    
    .intvecs   0    000000cc    00000000     UNINITIALIZED
    
    EntrySection 
    *          0    000000cc    00000000     UNINITIALIZED

    因此、引导加载程序不是在0x90 (.resetVecs)跳转、而是在 .intvecs (0xCC)加载应用 程序、从而导致崩溃。

    我的解决   方案是修改链接器脚本、以便在.resetVecs 位置设置 prgEntryAddr 地址。

    此外  、DMM_wsnnode_ble_sp_oad_app_CC1352R1_LAUNCHXL_tirtos_ccs 项目包含2 个.resetVecs 段:

    • 第一个@ 0x90、长度为:0x3C
    • 第2个(也是)@ 0x90、长度为0x00、随后是.intvecs 和 EntrySection

    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .data:xdcRomConstPtr 
    *          0    20000100    00000004     UNINITIALIZED
                      20000100    00000004     ble_oad_release_pem4f.oem4f (.data:xdcRomConstPtr)
    
    .data:xdcRomExternFuncPtr 
    *          0    20000104    00000004     UNINITIALIZED
                      20000104    00000004     ble_oad_release_pem4f.oem4f (.data:xdcRomExternFuncPtr)
    
    .data:xdcRomStatePtr 
    *          0    20000108    00000004     UNINITIALIZED
                      20000108    00000004     ble_oad_release_pem4f.oem4f (.data:xdcRomStatePtr)
    
    .bootVecs 
    *          0    00000000    00000008     DSECT
                      00000000    00000008     boot.aem4f : boot.oem4f (.bootVecs)
    
    .resetVecs 
    *          0    00000090    0000003c     
                      00000090    0000003c     ble_oad_release_pem4f.oem4f (.resetVecs)
    
    .vecs      0    20000000    000000d8     NOLOAD SECTION
                      20000000    000000d8     ble_oad_release_pem4f.oem4f (.vecs)
    
    xdc.meta   0    00000000    00000122     COPY SECTION
                      00000000    00000122     ble_oad_release_pem4f.oem4f (xdc.meta)
    
    xdc.noload 
    *          0    00000000    00000000     COPY SECTION
    
    .image_header 
    *          0    00000000    0000008d     
                      00000000    0000008d     oad_image_header_app.obj (.image_header:retain)
    
    .resetVecs 
    *          0    00000090    00000000     UNINITIALIZED
    
    .intvecs   0    00000090    00000000     UNINITIALIZED

    问题 (请回答):

    哪个 模块 负责 在  同一地址(0x90)但长度不同(分别为0x3C 和0x00)下创建2个.resetVecs?

    谢谢

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

    你好、Jo、

    很抱歉耽误你的时间。

    我刚刚从 SDK 5.30 (simple_peripheral_oad_offchip_CC13X2R1_LAUNCHXL_tirtos_ccs)构建了 simple_peripheral 项目。 这是映射文件代码片段。 如您所见、它与您的文件不同:

    .image_header 
    *          0    00000000    0000008d     
                      00000000    0000008d     oad_image_header_app.obj (.image_header:retain)
    
    .resetVecs 
    *          0    00000090    00000000     UNINITIALIZED
    
    .intvecs   0    00000090    00000000     UNINITIALIZED
    
    EntrySection 
    *          0    00000090    00000000     UNINITIALIZED
    

    您的代码基于哪一个 OAD 项目?

    谢谢、

    玛丽·H