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.

[参考译文] EK-TM4C1294XL:KCPDT 串行引导加载程序跳转 NmiSR()

Guru**** 2553450 points
Other Parts Discussed in Thread: EK-TM4C1294XL, TM4C1294KCPDT, LM3S8971

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1013980/ek-tm4c1294xl-kcpdt-serial-bootloader-jumps-nmisr

器件型号:EK-TM4C1294XL
主题中讨论的其他器件: TM4C1294KCPDTLM3S8971

Tivaware 2.1.2.111 driverlib 和串行引导加载程序(SBL)项目:

引导加载程序的 KCPDT 工具链构建会将自身复制到 SRAM (0x2000.0000)、并通过 EK-TM4C1294XL Launch Pad 从(0x4000)启动闪存应用程序、而不会出现任何问题。

但是、当加载到具有512KB 闪存的 TM4C1294KCPDT 定制 PCB 时、相同的 SBL 构建似乎不会将闪存 SBL 复制到 SRAM 中、而是通过 BL_STARTUP_CCS.s 将资产 NmiSR ()复制到 SRAM 中 否则、KCPDT 应用从定制 PCB 上的闪存0x0000运行而不会出现问题。  

在两个 MCU 类别上、BL_LINK_cmd 布局(如下所示)是相同的。 为什么 KCPDT 不会将加载的闪存 SBL 复制到相同的 SRAM 地址范围 KCPDT?

/*系统内存映射*/

存储器

闪存(RX):origin = 0x00000000,length = 0x00010000
SRAM (rwx):origin = 0x20000000,length = 0x00040000

/*内存中的段分配*/

部分



.intvecs
.text
.const
.data
} load = FLASH、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size)



.bss
堆栈
}run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top)

(二

应用 KCPDT:

/*应用程序的起始地址。 通常是中断矢量*/
/*必须位于应用程序的开头。 *
#define APP_BASE 0x00004000 //SBL=0x00004000、16384字节。
#define RAM_base 0x20000000


/*系统内存映射*/

存储器

闪存(RX):origin = 0x00000000、length = 0x00080000 //闪存 KCPDT 80k=524288KB、NCPDT 100k=1、048、572 */
SRAM (rwx):origin = 0x20000000,length = 0x00040000 /* SRAM .bss、.data */

/*以下命令行选项作为 CCS 项目的一部分进行设置。 *
/*如果您使用命令行构建,或者出于某种原因想要*/
/*在此处定义它们,您可以根据需要取消注释并修改这些行。 *
/*如果您使用 CCS 进行构建、最好进行任何这样的构建*/
/*对 CCS 项目进行修改并将此文件保留为单独文件。 *
/**//
/*--heap_size=0 */
/*--stack_size=8192 */
/*--library=rtsv7M4_T_le_eabi.lib */

/*内存中的段分配*/
部分

.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM

__STACK_TOP =__STACK + 512;

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

    尊敬的 GL:

    我还不能深入探讨这一个问题、但这里有两个初始问题:  

    1) 1)是否已验证引导加载程序是否已成功刷写?

    2) 2) 2)您能否比较闪存内容以确保在两个器件中加载了相同的代码?

    如果您使用的是2.1.1、也可以查看版本说明以了解有关此问题的任何错误修复。 也许现在已经解决了一个问题: www.ti.com/.../spmu299

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

    您好、Ralph、

    假定 KCPDT 与 NCPDT 相同、但 SBL Thumb 指令并不执行相同的复制、将 SBL 重新放置到 SRAM 0x2000.0000中。  或者、到闪存顶部512KB 的 KCPDT.cmd 指针与 SBL Thumb 代码 BL_STARTUP_CCS.s 中预期的值不同   

    我使用 LM-Flash 将应用程序加载到0x0000.4000和 SBL 加载到0x0000.0000、但 CCS 调试断点 BL_EMAC.c 或 main.c (uart2)在复位_Cint00和延迟之间 ping 通。 它们从不复制应用程序矢量表0x0000.40000或调用应用程序0x0000.4000。

       CBZ   r0、CallApplication

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

    BTW:KCPDT 可以通过 LM-Flash 发出任何次数的硬件复位、并且 LED、继电器按预期置为有效。 一个想法是让 TI 从 EK-TM4C1294XL Launch Pad 中提取 NCPDT 安装 KCPDT 部件、并实际测试 RA2器件是否按预期工作  

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

    另一点 KCPDT 闪存为512KB、可 VTABLE 寄存器偏移值(HW_NVIC.h)未在1024字节边界上设置。 NCPDT 通过闪存区域中的 VTABLE 偏移量来重新定位 BL 矢量表、这看起来不像它应该的 SRAM 那样。 否则、简单 Blinky 代码 KCPDT 应在 BL 重新定位矢量表后启动、将应用程序矢量表保留在0x4000。  

    似乎存在的经验法则问题是 NCPDT 引导加载程序在可变偏移(0x4000)下与 Blinky 一起工作、但 KCPDT 不会。 特权 SW 为 Thumb 代码指令似乎会导致可 Vtable 偏移边界违反 KCPDT。 因此、如果在 SRAM 中找不到应用程序矢量表偏移量之前不打开 LED、BL 会死机。

    数据表第119页

    系统复位时、向量表固定在地址0x0000.0000。 特权软件可以通过写向量表偏移量(VTABLE)寄存器将向量表的起始地址重新定位到不同的存储位置、范围在0x0000.0400到0x3FFF.FC00 (见119页的"向量表")。 请注意、配置 VTABLE 寄存器时、偏移量必须在1024字节边界对齐。


    ;;将矢量表指针设置为 SRAM 的开头。

    movw r0、#(NVIC_vtable & 0xFFFF)
    movt r0、#(NVIC_vtable >> 16)
    MOV R1、#0x0000
    MOVt R1、#0x2000
    STR R1、[r0]


    ;;设置刚刚复制到 SRAM 的代码的返回地址。

    ORR LR、LR、#0x20000000  


    ;返回给呼叫者。

    BX LR
    endasmfunc

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="48581" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1013980/ek-tm4c1294xl-kcpdt-serial-bootloader-jumps-nmisr/3748845 #3748845"]似乎存在的经验法则问题是 NCPDT 引导加载程序与可变偏移(0x4000)下的 Blinky 一起工作、但 KCPDT 不会[/引用]

    通过间接存储器寻址 Thumb 代码加载 NVIC_VTABLE 偏移的 SBL 调用不适用于 KCPDT、闪存长度= 0x00080000、origin= 0x00004000。

    该调用获取应用程序刷新的 VTABLE 偏移处的表。 需要将文本添加到 PDF 中、请注意从长度中减去原点。 奇怪的是、NCPDT 长度= 0x000100000时不需要。 LM3S8971的 μ~文件也不需要该文件、NVIC_vtable 偏移地址内容似乎会随应用程序一起重定位。 编译器 LTS 或更早版本无关紧要、当源代码向上移动时会丢失闪存长度。

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

    您好、Ralph、

    感谢 PDF 链接、它在许多领域都非常有启发性阅读整个 PDF。 SBL 用户 PDF 没有提到将工具链 Linker.cmd 闪存长度矢量修改为绝对应用程序结束地址。 TI 开发部门进行了更改、但没有进行明显的更改。

    项目 MCU ~cmd 文件只要求 NVIC_TABLE 偏移寄存器内容的目标起始地址与闪存加载的应用程序起始地址相匹配。 而不是为了偏移应用矢量表闪存加载起始地址而减小的闪存长度相对于工具链变体闪存存储器结束地址长度。

    工具链变体 MCU 类的整个闪存范围应可供应用使用、而不应以任何方式添加串行引导加载程序来降低。