TI中文支持网
TI专业的中文技术问题搜集分享网站

28377D 双核烧写flash 的一些疑惑

您好,请教些问题,

使用双核,以前一直用ram做的正常工作,现在改了下cmd 搬到单机运行,结果两个cpu都不工作了,没有任何输出,感觉没有加载起来。自己折腾了好久,网上看了好些问题,也还是没明白为啥不工作了。板子本身应该没问题,以前单核的程序,可以standalone运行。

疑惑一:
从一些帖子里看到<http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/p/77143/190597.aspx#190597>“
看controlsuite里的双核例程,在cpu1的主函数里有InitSysCtrl(); cpu2的主函数里没有,是不是双核初始化就是这样,只需要在cpu1里进行一次初始化?

你说的对,就是在CPU1初始化一下系统时钟,flash等就行了。CPU2无需配置。

另外从这个贴里也看到
<http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/p/114030/311014.aspx#311014>

"大哥,你好,我在你的指示下将blinky双核的程序做了化简,只在cpu1中写了IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);  
将cpu2中的
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);都删除了 ,load 完之后   掉电 再 上电   发现两个小灯确实按程序的设定进行亮灭了,
"

InitSysCtrl() V140版本里这个函数里含有memcpy() 和 InitFlash(), (另外已经设置了ifdefCPU1 配置clk 对cpu2 也不影响)。所以我的问题是在 cpu2里 不需要memcpy()和 InitFlash()吗?
按道理两个cpu是独立的flash,cpu2应该也还要把代码搬运代码到ram吧,如果为了加快速度。

疑惑二:
参考例程在自己的板子上做了双核的程序,使用ram和flash 设置可以,但用standalone后,断电开电运行,两个cpu都不work了。在cpu2里, 我加了 InitSysCtrl() 和 一些函数的加载ram设置  #pragma CODE_SECTION(critical funs xxx, "ramfuncs"); 请问,有什么可能原因呢?

疑惑三:
当出现standalone不工作后,怎么才能知道哪里出问题,有哪些调试手段可以看到cpu此时是卡在哪里了,还是根本没有boot起来?

非常感谢!

datong fang:

疑惑一:哈哈 第二帖子是我发的  问题已经解决  。cpu2也做了搬运代码到ram。

可以加我qq:292835953  交流下!

mangui zhang:

回复 BO LIU:

感谢分享    学习一下了

Yang Thompson:

回复 BO LIU:

学习学习

user4946172:

回复 BO LIU:

你好   我用的就是V200的程序 还是卡在那个地方 

// // Wait until CPU02 control system boot ROM is ready to receive // CPU01 to CPU02 INT1 interrupts. // do { bootStatus = IPCGetBootStatus() & 0x0000000F; } while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY));

看这句话的意思是从CPU2读取boot状态  但是读取过来的数据一直是个0            这里我不太明白,此时CPU2还没有运行到main函数中,这个boot状态寄存器CPU2是怎么写进去的?    CPU1读取这个状态赋值给这个变量bootStatus,好像也没用到呀.

BO LIU:

回复 user4946172:

CPU2的启动是受CPU1来控制的,通过CPU1中的函数 “IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);”来启动CPU2。

Executes a CPU02 control system bootloader.//!//! \param ulBootMode specifies which CPU02 control system boot mode to execute.//!//! This function will allow the CPU01 master system to boot the CPU02 control//! system via the following modes: Boot to RAM, Boot to Flash, Boot via SPI,//! SCI, I2C, or parallel I/O. Unlike other IPCLite driver functions, this//! function blocks and waits until the control system boot ROM is configured//! and ready to receive CPU01 to CPU02 IPC INT0 interrupts. It then blocks and waits//! until IPC INT0 and IPC FLAG31 are available in the CPU02 boot ROM prior to//! sending the command to execute the selected bootloader.

 这个状态寄存器在硬件上就是一个来自于cpu2 boot rom的一个信号,“CPU1读取这个状态赋值给这个变量bootStatus” 就是个基本的查询的while 循环嘛,cpu 1 检查等待这个boot rom上电后是否准备好了来接受它的中断 int 1。 然后再等待IPC INT0 and IPC FLAG31 are available in the CPU02 boot ROM了,就可以根据外部的启动模式,cpu1使能一些和启动相关的几个IO和外设的控制权给cpu2 和它的boot rom 控制系统,然后就可以发送一些command给这个boot rom:

//CPU01 to CPU02 IPC Boot Mode Register IpcRegs.IPCBOOTMODE = ulBootMode; // CPU01 To CPU02 IPC Command Register IpcRegs.IPCSENDCOM = BROM_IPC_EXECUTE_BOOTMODE_CMD; // CPU01 to CPU02 IPC flag register IpcRegs.IPCSET.all = 0x80000001;

(关于command的讨论的参考:

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/489067

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/591993?TMS320F28377D-The-bootloader-about-28377D )

然后cpu2 boot rom 接受了这些配置,就可以来引导cpu2去加载运行之前烧写在cpu 2 flash里的用户程序(数据和函数)去从特定的地址来开始启动运行。 (默认的代码也是从flash里运行的,但用户可以在cpu2的主函数初始化时memcopy 一些关键的程序到ram上加快执行速度)。你的那个问题是可以这么来大概解释: cpu2主体是还没有运行,但是它的boot rom可以运行 (boot rom是一小块受保护的rom/flash,固化了一小段芯片制造商提供的程序,上电后这段程序马上用来引导cpu 去特定的地址加载运行特定的程序。触发它的也即是那些关键的几个command,也就是上面那些cpu1发过来的flag信号)。boot rom 还有bootloader 可以参见:https://stackoverflow.com/questions/15665052/what-is-the-difference-between-a-bootrom-vs-bootloader-on-arm-systems

赞(0)
未经允许不得转载:TI中文支持网 » 28377D 双核烧写flash 的一些疑惑
分享到: 更多 (0)