DSP的上电过程、Boot Mode以及Boot Loader
对于双核DSP上电后,启动运行的顺序如下所示:
①系统复位或者重新上电之后,CPU2系统一直处于复位状态。CPU1系统会自动跳转到地址0x3FFFC0中获取复位向量,复位向量的目的就是为了使得系统自动跳转到0x3F8000地址上,开始执行Boot ROM 段中存储的Boot loader代码段。对于CPU1而言,CPU1的Boot ROM段中的Boot loader程序首先会从TI-OTP内存段中获取设备的配置字,并配置好器件。
②Boot Loader开始执行DCSM和OTP JTAGLOCK流程。DCSM流程:(1)读取OTP中的Zx_poinyer;(2)解码指针值;(3)度去除TI-OTP中的SECDC;(4)读取Zx BOOT模式;(5)读取ZX DCSM模块。
③Boot Loader检测FUSEERR寄存器中是否存在错误标志位,并采取错误处理机制。之后初始化RAM和内存端的ECC/PARITY。CPU1将引导CPU2系统跳出复位操作,之后便不管CPU2的运行状态。
④CPU1系统的Boot Loader将会根据外部的GPIO和XRST(一般链接下载器才会有)来确定程序的启动方式是从Flash启动还是RAM启动,或者是在XRST为低的情况下,根据PIE向量表(地址为0xD00)的第一个32位的值来确定启动方式(一般是链接了下载器的情况)。确定完之后,CPU1的Boot Loader代码段会将各种信息都更新到指定的RAM段中,以便于CPU1的程序去读取这些状态字。
⑤此时按照启动方式开始跳转程序,如果是Flash启动则将程序指针跳转到Flash的起始地址:0x80000,如果是Ram启动则将程序指针跳转到Ram段的起始地址:0x00000,同时结束Boot Loader并进入CPU1的主程序。
如果此时的启动方式是外设启动,那么Boot Loader则会等待外部程序按照一定的格式将程序加载到Ram中,程序代码传输完成之后,跳转到运行指针开始运行程序代码段。
⑥此时CPU1的Boot Loader完成使命,已退出,并开始执行CPU1中的用户程序。此时的CPU2系统退出了复位状态,仍然在等待启动模式确定,需要CPU1的用户程序来引导CPU2的引导,如果是CPU2也从Flash启动,则通过IPC Command即可触发,但是如果CPU2也需要从外设启动,则需要CPU1首先设置好外设的引脚,之后再触发CPU2开始接受程序。
双核的调试、烧写
TI公司C2000Ware给出的例程,可以学习创建CPU1与CPU2的工程,修改工程属性,设置Predefined Symbols(区分CPU1、CPU2,选择烧写方式),添加头文件路径,使用cmd等。
CPU1有三种工作方式:CPU1_RAM_DEBUG、CPU1_FLASH_DEBUG、CPU1_FLASH_STANDALONE。
CPU2有两种工作方式:CPU2_RAM、CPU2_FLASH。尽管双核共享系统的外设,但是作为主核的CPU1可以通过IPC控制CPU2从何引导启动。
只需要在CPU1的工程中添加:
#ifdef _STANDALONE
#ifdef _FLASH
// Send boot command to allow the CPU2 application to begin execution
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
// Send boot command to allow the CPU2 application to begin execution
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif
双核的调试可以按下方配对:
①CPU1_RAM;仅使用CPU1在线调试,CPU2闲置。
②CPU1_FLASH;仅使用CPU1烧写,CPU2闲置。
③CPU1_RAM<->CPU2_RAM;CPU1与CPU2一起在线调试。
④CPU1_FLASH_STANDALONE<->CPU2_FLASH。CPU1与CPU2一起烧写,CPU2的Boot由CPU1工程中设置IPC。
参考资料目录
《TMS320F2837xD Dual-Core Microcontrollers Datasheet》Memory章节
《TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual》System Control、ROM Code and Peripheral Booting章节