主题中讨论的其他器件:UNIFLASH
您好!
编写 application_code Flash 存储器后、引导加载程序不会跳转到应用程序代码、这是我们面临的问题。
描述:
1) 1)引导加载程序代码存储在 FLASH1 -0x00180000中
2) 2)应用程序代码存储在 FLASH0 -0x00000000中
首先、我们将引导加载程序加载到控制器、然后使用 UNIFLASH、然后使用引导加载程序加载.hex (应用代码)
当我们从串行端口发出引导命令时、应用程序代码正在运行时
我们将禁用所有中断、然后跳转到引导加载程序地址0x00180000
使用指针((void (*)(void)) 0x00180000);然后启动加载程序代码运行并要求确认闪存擦除、然后发送应用程序代码的.hex 文件
写入应用程序代码后,我们将使用 systemREG1->SYSECR = 0x00;/*全局系统重置*/进行重置
应用程序代码首次运行 app1.hex 文件刷写、如果我们再次刷写、则运行相同的 app1.hex 应用程序代码
如果我们更改应用程序代码、引导加载程序会将闪存 App2.hex 代码写入0x00000000地址、不会发生软复位、应用程序不会运行。
我们尝试使用((void (*)(void)) 0x00000000)();在加载 App2.hex 文件时、要从引导加载程序跳转到应用程序代码、仍然面临问题
我们在禁用所有安全功能的情况下尝试了应用程序代码、但问题仍然相同。
引导加载程序固件 link.cmd 文件内容如下:
/*链接器设置 */
--retain="*(.intvecs)"
/*内存映射 */
存储器
{
/*用户代码开始(2)*/
引导程序(X):origin=0x00000000 length=0x00000020
FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
Vectors_1 (RX):origin=0x00180000 length=0x00000020
FLASH1 (RX):origin=0x00180020 length=0x0017FFE0
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0003eb00
/*用户代码结束*/
}
/*段配置 */
部分
{
/*用户代码开始(4)*/
.intvecs :{}>向量
USER_FLASH_SECTION:{}> vectors_1 /* bootloader vector codes*/
.text :{}> FLASH1
.const :{}>FLASH1
.cinit :{}>FLASH1
.pinit :{}>FLASH1
.bss :{}> RAM
.data :{}> RAM
.sysmem:{}>RAM
/*用户代码结束*/
}
应用代码 link.cmd 文件内容如下:
/*链接器设置 */
--retain="*(.intvecs)"
/*内存映射 */
存储器
{
/*用户代码开始(2)*/
引导程序(X):origin=0x00000000 length=0x00000020
FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
FLASH1 (RX):origin=0x00180000 length=0x00180000
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0003EB00
/*用户代码结束*/
}
/*段配置 */
部分
{
/*用户代码开始(4)*/
.intvecs:{}>向量
.text :{}> FLASH0
.const :{}>FLASH0
.cinit :{}> FLASH0
.pinit :{}> FLASH0
.bss :{}> RAM
.data :{}> RAM
.sysmem:{}>RAM
/*用户代码结束*/
}
应用程序代码的 sys_intvecs.asm 文件内容如下:
.sect ".intvecs"
ARM
;------------------------------------------------------------------
;中断例程的导入引用
.ref _c_int00
.ref _dabort
.ref phantomInterrupt
.def resetEntry
;------------------------------------------------------------------
;中断向量
resetEntry
b _c_int00
UndefEntry
b 未定义尝试
svcEntry
b svcEntry
PrefetchEntry
B prefetchEntry
b _dabort
b 相位中断
LDR PC、[PC、#-0x1b0]
LDR PC、[PC、#-0x1b0]
;----------------------------------------------------------------
请告诉我们上述问题是否存在以及导致应用程序代码无法第二次运行的原因。
谢谢、此致、
Murali Prasad