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.

[参考译文] MSPM0G3107:将 PC 更改为应用程序代码的不同地址

Guru**** 2394305 points
Other Parts Discussed in Thread: MSPM0G3507, MSPM0G3107, UNIFLASH, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1497446/thread

器件型号:MSPM0G3107
Thread 中讨论的其他器件:MSPM0G3507UNIFLASHSYSCONFIG

工具/软件:

您好、

我修改了 MSPM0G3107的 secondary_bsl_can_LP_MSPM0G3507_nortos_ticlang 演示。 工作正常。 但是、从次级引导加载程序来看、如何将 PC 更改为应用程序代码的起始地址、即0x00000000。

我已经尝试使用以下代码片段、将应用的起始地址馈 送至 www.ti.com/.../slaae88中提到的地址。 但是,它是不起作用的。
/*! 使用其复位矢量地址*/跳转到应用程序
#define TI_MSPBoot_APPMGR_JUMPTOAPP (){(void (*)())(*(uint32_t *)(APP_AREA_START_ADDR + 4))
();}

我还尝试了   boot_application_LP_MSPM0G3507_nortos_ticlang 演示中提到的以下 API。  但是,它是不起作用的。

静态 void start_app (uint32_t *vector_table)

/*以下代码将 SP 重置为中指定的值
*提供的矢量表,然后调用重置处理程序。
*
*根据 ARM Cortex 规范:
*
* ARM Cortex VTOR
*
*
*偏移矢量
*
* 0x00000000 ++++++++++++++++++++++++++++++++++++++
*|初始 SP 值|
* 0x00000004 ++++++++++++++++++++++++++++++++++++++
*|重置|
* 0x00000008 ++++++++++++++++++++++++++++++++++++
*| NMI |
*++++++++++++++++++++++++++++++++++++++++
*|。 |
*|。 |
*|。 |
*
**/

/*使用 vector_table[0]中存储的值重置 SP */
_asm volatile (
"LDR R3、[%[vectab]、#0x0]\n"
"MOV SP、R3 \n":[vectab]"r"(vector_table);

/*将重置向量设置为新向量表(将重置为0x000)*/
SCB->VTOR =(uint32_t) vector_table;

/*跳转到 vector_table[1]处的复位处理程序地址*/

((void (*)(void))(*(vector_table + 1)))();
}

谢谢你

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

    您好、

    首先、请确保将应用程序放置在地址"APP_AREA_START_ADDR"中、该地址应为中断矢量表地址。

    其次、检查.cmd 链接器文件、确保程序链接在 "APP_AREA_START_ADDR ~ 0x20000 - APP_AREA_START_ADDR" 的闪存区域内(适用于 MSPM0G3507)。

    第三、您可以尝试以下程序跳转代码、在更新栈指针之前备份 vector_table、以避免任何优化级别影响。

    uint32_t * vector_table_backup;
    static void start_app(uint32_t *vector_table)
    {
        /* The following code resets the SP to the value specified in the
         * provided vector table, and then the Reset Handler is invoked.
         *
         * Per ARM Cortex specification:
         *
         *           ARM Cortex VTOR
         *
         *
         *   Offset             Vector
         *
         * 0x00000000  ++++++++++++++++++++++++++
         *             |    Initial SP value    |
         * 0x00000004  ++++++++++++++++++++++++++
         *             |         Reset          |
         * 0x00000008  ++++++++++++++++++++++++++
         *             |          NMI           |
         *             ++++++++++++++++++++++++++
         *             |           .            |
         *             |           .            |
         *             |           .            |
         *
         * */
    
        /* Back up of vector_table to avoid being changed because of SP update */
        vector_table_backup = vector_table;
    
        /* Set the Reset Vector to the new vector table (Will be reset to 0x000) */
        SCB->VTOR = (uint32_t) vector_table;
    
        /* Reset the SP with the value stored at vector_table[0] */
        __asm volatile(
            "LDR R3,[%[vectab],#0x0] \n"
            "MOV SP, R3       \n" ::[vectab] "r"(vector_table));
    
        /* Jump to the Reset Handler address at vector_table[1] */
    
        ((void (*)(void))(*(vector_table_backup + 1)))();
    }

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

    嗨、Pengfei、

    感谢您 提供的信息。

    但是、 当我尝试在使用 链接器文件生成功能构建后刷写固件时、 禁用 Startup File Reference (以便编辑 device_linker.cmd)、我收到错误:

    Cortex-M0P:闪存编程器:映像大小错误。 块的长度为246、但由于闪存编程器以64位进行写入、因此它应该被8整除

    谢谢你

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

    你(们)好  

    我假设您使用 Uniflash 进行编程。

    请按照以下说明设置输出文件格式。

    (+) MSPM0G1519:MSPM0G1519的 Uniflash 错误-基于 Arm 的微控制器-内部论坛-基于 Arm 的微控制器-内部- TI E2E 支持论坛

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

    您好、

    我在 CCS 和 Uniflash 中都收到了该错误、 链接无法正常工作

    找不到页面

    抱歉,您所请求的页面不存在。 请使用上面的搜索表找到您感兴趣的信息。

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

    你(们)好

    感谢您的支持。 稍后我会尝试了解跳转代码。

    但是、现在我有一个迫切的问题需要解决。 从辅助引导加载程序、我能够通过 CAN 接收固件字节(34KB)、并将其写入0x12800位置、并且能够成功计算 CRC。 但是、当尝试将代码从0x12800复制到0x0时、在0x1000处进行写入时遇到错误(gErrorType = ERROR_6464BIT_W)。 下面是我用于在0x0和0x12800处写入的代码。 您能支持这个流程吗?

    uint8_t nvm_write(uint32_t write_address, uint32_t *fw_word)
    {
    
        if (gErrorType == NO_ERROR) {
                /*
                * 64-bit write to flash in main memory with ECC generated by hardware.
                * Data must be loaded 32-bits at a time, but a single word program
                * is executed
                */
                DL_CORE_configInstruction(CPUSS_CTL_ICACHE_DISABLE,
                CPUSS_CTL_PREFETCH_DISABLE, CPUSS_CTL_LITEN_DISABLE);                       //Disabling cache
                
    
                 //flash word writer
                 DL_FlashCTL_unprotectSector(
                         FLASHCTL, write_address, DL_FLASHCTL_REGION_SELECT_MAIN);
                 gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated(
                         FLASHCTL, write_address, &fw_word[0]);
    
                 DL_CORE_configInstruction(CPUSS_CTL_ICACHE_ENABLE,
                     CPUSS_CTL_PREFETCH_ENABLE, CPUSS_CTL_LITEN_ENABLE);                    //Enabling cache
    
                 if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED) {
                         /* If command was not successful, set error flag */
                         gErrorType = ERROR_64BIT_W;
                     }
        }
        return gErrorType;
    }


    谢谢你。

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

    您好、

    如果您在我们的 SDK 中使用 secondary_bsl 示例并且没有进行任何更改、请注意、这个 secondary_bsl 程序位于0x1000的地址。 (中断向量表为0x1000、程序为0x1040)。 因此、不允许擦除该区域并使其出现程序运行问题。  

    如果您仍想在0x00地址对映像进行编程、请在.cmd 文件中定义更大的起始地址、并且在 SysConfig 中重新定义备用 BSL 地址(其值应为 FLASH_SBSL_START 地址+ 1)

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

    您好、

    我更新了.cmd 文件。 此外、我在 SysConfig 中 之前还将其更新为 FLASH_SBSL_START 地址+ 1。 仍然不起作用。
     

    -uinterruptVectors
    --stack_size=512
    /*----------------------------------------------------------------------------*/
    /* Memory Map                                                                 */
    
    MEMORY
    {
    //    FLASH_SBSL_INTVEC(RWX)  :	 org = 0x00001000,      len = 0x00000040,
    //    FLASH_SBSL_START(RWX)   :	 org = 0x00001040,      len = 0x00000040,
    //    FLASH_SBSL(RWX)   	    :	 org = 0x00001080,      len = 0x00003400,
        FLASH_SBSL_INTVEC(RWX)  :	 org = 0x000D800,      len = 0x00000040,
        FLASH_SBSL_START(RWX)   :	 org = 0x000D840,      len = 0x00000040,
        FLASH_SBSL(RWX)   		:	 org = 0x000D880,      len = 0x00003400,
    
        SRAM(RW)				:    org = 0x20000000,      len = 0x00008000,
    
        BCR_CFG		 		    : 	 org = 0x41C00000,      len = 0x00000080,
        BSL_CFG				    : 	 org = 0x41C00100,      len = 0x00000080,
        FACTORY_CFG		  		: 	 org = 0x41C40000,      len = 0x00000200,
    }
    
    /*----------------------------------------------------------------------------*/
    /* Section Configuration                                                      */
    
    SECTIONS
    {
    	.intvecs			: PALIGN(8) {} > FLASH_SBSL_INTVEC
    	.sblStart			: PALIGN(8) {} > FLASH_SBSL_START
    
        GROUP(FLASH_MEMORY) {
            .text          	: PALIGN(8) {}
            .const         	: PALIGN(8) {}
            .cinit         	: PALIGN(8) {}
            .rodata			: PALIGN(8) {}
        } > FLASH_SBSL
    
        GROUP(SRAM) {
            .vtable 		: {}
            .data          	: {}
            .bss           	: {}
       } > SRAM
    
        .stack  :   > SRAM (HIGH) SIZE(BSL_CI_stackSize)
        .binit        : palign(8) {} > FLASH_SBSL
        .TI.ramfunc   : load = FLASH_SBSL, palign(8), run=SRAM, table(BINIT)
    
        .factoryConfig          : {} > FACTORY_CFG
        .BCRConfig              : {} > BCR_CFG
        .BSLConfig              : {} > BSL_CFG
    }
    


    我还注意到 flashctl_multiple_size_write_LP_MSPM0G3507_nortos_ticlang 示例可以从起始地址0x1000进行写入、但未能在0x1000之前写入并继续写入0x1000、例如:如果我从起始地址0xFF8写入并在0x1000之后继续写入、则正在写入0x1000并产生相同的错误。

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

    您好、

    很抱歉我错过了一个要修改的项目:更改主要低位扇区的静态写保护。 下面是默认0x1000-0x8000的静态写保护。 一个位用于一个扇区、您需要将其更改为辅助 BSL 程序的受保护区域。

    请参阅 4.3.1基于闪存的辅助 BSL 从0x1000开始  MSPM0引导加载程序(BSL)实现的版本(修订版 C)

    至于 SDK 中的闪存写入示例、错误是因为在本例中、只有 MAIN_BASE_ADDRESS 的扇区不受保护、因此如果设置为0xFF8、则下一个扇区(0x1000)受到保护、不允许被编程。  

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

    您好、

    感谢您提供的信息。

    对应于栈指针的跳转、我已相应地更新了.cmd 链接器文件、现在我能够将 SP 跳转到0x5800、在这里主应用程序就在这里并成功执行应用程序。 我将次级引导加载程序存储在0x1000中。 此过程正常工作。 我将继续进行相同的操作。

    感谢您帮助我解决这个问题。

    此致、
    Vineeth