Other Parts Discussed in Thread: C2000WARE
使用c2000示例代码将代码中看门狗模式改为复位,仍会出现此问题
论坛中工程师推测是引导问题,说明的在连接烧录器时,将0x0d00块值赋0x5a,将0x0d04地址赋值0x03该方法仍然不行
请问应该怎么解决呢


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.
使用c2000示例代码将代码中看门狗模式改为复位,仍会出现此问题
论坛中工程师推测是引导问题,说明的在连接烧录器时,将0x0d00块值赋0x5a,将0x0d04地址赋值0x03该方法仍然不行
请问应该怎么解决呢


你好,具体是哪个例程?我看了一下F280049的例程,跟你的不一样啊
C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f28004x\examples\watchdog
你好,代码会跳转到0x3fb02a其实就是看门狗导致的,看门狗复位了,芯片就会运行到这个地址。
例程中,之所以用中断的方式没有进入这个地址,是因为用中断的情况下程序设计只产生中断而不产生复位信号:
typedef enum
{
//! Watchdog can generate a reset signal
SYSCTL_WD_MODE_RESET,
//! Watchdog can generate an interrupt signal; reset signal is disabled
SYSCTL_WD_MODE_INTERRUPT
} SysCtl_WDMode;
所以能看到工程中的两个变量wakeCount和loopCount在增加。
而改成SYSCTL_WD_MODE_RESET模式之后就会直接产生复位信号,导致芯片复位,进而再导致程序进入0x3fb02a地址。
如果你在程序中使能喂狗
wakeupISR(void)
{
wakeCount++;
//
// Acknowledge this interrupt located in group 1
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
那么程序就不会进入错误地址了。
总结:导致进入错误地址的原因不是因为程序有问题,而是因为看门狗引起了芯片复位,从而进入了错误地址(这个地址在boot部分)。说白了,这个是正常现象,CCS仿真的时候复位芯片就是会进入这个错误地址。
不是,因为仿真模式下的程序引导跟离线模式的不一样。仿真模式下芯片引导是由CCS去完成的,所以会造成芯片硬件复位后跳转报错。
你可以看一下这个FAE分享的帖子:
另外,如果觉得我的回复能帮助你解决问题的话,还请点击绿色的“确认答案”按钮,方便其他工程师参考。
建议你去看一下datasheet的8.9 Boot ROM and Peripheral Booting,这不是一两句话能讲得完的。
而且,这跟看门狗也没多大关系,你要了解得这么复杂干嘛?如果是需要自己做bootloader APP的话可以研究一下,你做看门狗完全不用知道这些。
这里只能简单介绍一下程序执行流程和我记得的几个地址,其他具体地址要一个个查。
如果是ram启动,入口地址在0x0000 0000,flash启动的话在0x8 0000,相应的,程序会这两个入口地址放一条跳转指令,跳转到_c_int00(_c_int00地址不固定),调用boot28.asm进行C28x运行环境配置,最后自动跳转到执行main()函数。
其实关于bootloader,官方有提供基于SCI的例程,你也可以参考例程来设计:
C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f28004x\examples\flash
但是说实话,bootloader和看门狗其实是两个相关性很小的部分了,如果有bootloader的问题建议你可以直接新开一个帖子讨论。