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.

[参考译文] TM4C123GH6PM:引导加载程序问题

Guru**** 2513185 points
Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1327531/tm4c123gh6pm-bootloader-problem

器件型号:TM4C123GH6PM
主题中讨论的其他器件: EK-TM4C123GXL

我目前使用 TM4C123GH6PM 微控制器来开发一款引导加载程序。 在引导加载程序开发过程中、我需要修改"tm4c123gh6p.cmd"文件中的闪存位置、以便在从引导加载程序跳转到应用程序时、可以正确访问中断矢量表。 我参考了论坛上提供的方法、并对"tm4c123gh6p.cmd"文件中的地址进行了以下更改:

--------------------------------------------------------------------------------------------------------------------------------------------------------

--retain=g_pfnVectors

#define APP_BASE 0x00008000
#define RAM_BASE 0x20000000

内存
{
FLASH (RX): origin = APP_BASE , length = 0x00040000 - APP_BASE
SRAM (rwx):origin = 0x20000000、length = 0x00008000

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

/*内存中的段分配*/

部分
{
.intvecs:> app_base
.text :>闪存
.const :>闪存
cinit :>闪存
请输入您的密码:> FLASH
init_array:> FLASH

.vtable:> 0x20000000
.data :> SRAM
bss :> SRAM
.sysmem:> SRAM
.stack:> SRAM

__STACK_TOP =_STACK + 512;

-------------------------------------------------------------------------------------------------------------------------------------------------

在我更改"tm4c123gh6p.cmd"中的闪存地址后、我遇到了问题。 当使用基于 ROM 的 API 函数(如"ROM_GPIOPinRad"、"ROM_TimerDisable"等)并在调试模式下运行程序时、程序在到达基于 ROM 的 API 函数时、会跳转到填有"F"的地址。 但是、如果我不使用基于 ROM 的 API 函数、程序可以在调试模式下正常运行。 当我将'tm4c123gh6p.cmd 中的闪存地址恢复为原始地址并使用基于 ROM 的 API 函数时、程序仍然可以在调试模式下正常运行。 为什么会发生这种情况? 如果使用基于 ROM 的 API 函数会导致问题、则将.c 文件转换为.bin 文件以进行引导加载程序烧写可能会导致程序不可执行。 这是因为当我更改 tm4c123gh6p.cmd 中的中断矢量表位置时、中断矢量表偏移量不包括基于 ROM 的 API 函数?

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

    您好!

     您是否也修改了  APP_START_ADDRESS 和 VTABLE_START_ADDRESS 的引导加载程序 bl_config.h 文件、以与您的.cmd 文件匹配?  C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c123gxl\boot_serial 中提供了库存 TM4C123应用示例。 这是一个位于0x2800的串行示例、引导程序将从串行端口下载应用程序固件并将固件映像编程到0x2800。 我建议您先按原样运行该示例。 一旦它开始工作、您就可以将地址更改为另一个位置、如0x8000。  

    //*****
    //
    //应用的起始地址。 该值必须是1024的倍数
    //字节(使其与页边界对齐)。 矢量表应在
    //此位置,以及向量表(栈位于
    //在 SRAM 中,位于闪存中的复位矢量)被用作
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define APP_START_ADDRESS 0x2800

    //*****
    //
    //应用程序定位其异常向量表的地址。
    //它必须是1024字节的倍数(使其与页对齐)
    //边界)。 通常、应用程序将以其矢量表和
    //该值应设置为 APP_START_ADDRESS。 此选项用于
    //满足从外部存储器运行的应用程序,这些应用程序可能不是
    //可由 NVIC 访问(向量表偏移寄存器仅为30位)
    //长)。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define VTABLE_START_ADDRESS 0x2800