主题中讨论的其他器件: 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 函数?