【TI FAE经验分享】C2000上电引导模式解析

在使用c2000的时候,经常遇到工程师说芯片仿真能够运行,但是单机跑却不能跑起来;或者在调试时,复位芯片 》 run,发现程序不能跑起来。这其中的原因主要是没有了解c2000的引导模式设置。另外当我们想通过其他方式去引导芯片启动的时候,往往也需要清楚知道c2000的引导是怎么设置的。因此,在这里跟大家分享一下我对c2000引导模式的理解,希望对各位理解芯片从上电到跑到main这一段芯片运行情况有所帮助。
以c2000 piccolo系列的引导模式为例,delfino稍微有点区别,concerto系列的引导则更复杂。但理解了piccolo的引导原理对我们理解后面两个系列的芯片有非常大的帮助。
1.首先我们根据图1来看一下芯片上电后的代码执行流程,当芯片在接收到一个复位信号后,会到0x3fffc0去复位向量,该复位向量跳到bootrom 0x3ff75c中去执行bootloader的程序,这里主要有initboot, 和selectbootmode, 以及一些外设引导的函数。seletebootmode根据芯片的硬件或软件设置来判断芯片该去哪里寻找程序入口,直接目的是如何找到main,然后执行应用程序。
我们最常用到的主要有两种引导模式:
一种是boot to ram,即跳到0x000000的ram中,去开始执行指令,主要针对程序加载在ram的仿真模式;另外一种是boot to flash,则跳到0x3f7ff6中去开始执行代码。
相应的,程序会这两个入口地址0x000000, 0x3f7ff6放一条跳转指令,在codestart.asm源文件中,原因是在flash的入口地址处只有两个单元的空间,后面是csm模块,所以需要跳转;而在ram中之所以也需要跳转,主要是因为在跳转到main之前,需要执行一小段代码_c_int00,该代码会使用0x000003之后的一段ram,如果代码放在那里,在执行_c_int00之后会损坏代码。
另外就是一些外设引导模式,如sci引导以及spi引导等,像我们常使用的c2prog软件就支持sci引导,然后通过串口下载程序。
2. 那么芯片的selectbootmode函数是如何来判断芯片的引导模式(boot mode)呢?
从图2中我们可以看到,首先会判断芯片是否连接仿真器,根据trst引脚的状态来判断。
如果是仿真器连接,则进入仿真引导(emulation boot),这时候芯片的引导主要是靠2个ram的单元来判断,即emu_bmode和emu_key,地址是0xd01和0xd00,所以我们在连接仿真器后,可以首先修改这两个emu_bmode和emu_key来设置引导模式;
如果没有连接仿真器,则进入单机跑模式(stand alone), 这时候芯片的引导主要靠gpio34和gpio37的状态,以及两个otp存储单元的值来判断。不过我们经常没有使用otp这两个单元,用gpio的状态就已经够了。
图2. 两种状态下的引导模式
3. 仿真器连接时的引导模式配置
当带仿真器的时候,芯片会根据emu_bmode和emu_key这两个单元的值来判断引导模式,比如我们带仿真器最常用的就是引导到ram,即需要设置emu_key = 0x55aa, emu_bmode = 0x000a。当我们在仿真的时候,程序load到flash的时候,就需要设置emu_key = 0x55aa, emu_bmode = 0x000b,如果emu_bmode = 0x0003的话,由于我们没有对otp单元进行操作,即otp的值为0xffff,所以这种情况下也是boot to flash。
在带仿真器跑程序的时候,我们发现即使我们不配置引导模式,程序也能够跑到main,这主要是因为ccs的功能,在程序load到芯片的时候,或是reset 》 restart,ccs会自动屏蔽bootloader的过程,自动跳到main函数入口。如果我们只选择reset cpu,则需要配置引导模式,即对0x0d01, 0x0d00这两个单元在memory window进行写相应的值,或是在script的菜单中选择引导模式,程序才能够跑到main中。
4. 单机跑是引导模式配置
单机跑的时候,我们最常用的是跑到flash中,这时候则需要配置gpio34和gpio37的引脚为高电平,由于piccolo系列芯片这几个引导都有上电默认内部上拉使能,所以即使不用加上拉电阻也可以。这时候的引导模式是getmode,由于我们没有去配置otp两个单元,所以这两个单元默认为0xffff,所以芯片的引导模式最终为boot to flash。
5. 其他外设的引导模式
从上面这几张图中可以看到还有许多外设引导的功能,以sci引导为例,带仿真器和单机跑的时候,都要配置相应的存储单元以及gpio口状态,使之配置为sci boot mode。然后芯片会sci boot 函数,准备接收串口的代码,上位机要根据sci boot的通信协议,生成sci boot的数据流格式,将数据通过串口发送给芯片,芯片的bootloader会接收该代码,接收完后会根据该数据流中的起始运行地址去开始执行从sci下载的代码。


三星电子表示将于本月在中国建设一条新的存储芯片生产线
运用物联网技术进行数码转型的美七大零售商
物联网/MR在内的十个改变你生活的高新技术
与“极光”互相呼应 路虎全新SUV命名“星脉” 下月首发!
基于LTC3115-1的手持式设备、工业仪表和汽车电子系统多种输入电压的电源设计
【TI FAE经验分享】C2000上电引导模式解析
宁德时代高功率的为什么是磷酸铁锂电池?
PMC-Sierra推出12Gb/s SAS控制器+扩展器
德国测试报告纰漏手机辐射排行
微软引领生物识别技术再升级!安全体验或将进入生物识别时代
无人机发展迅猛 但也需尊重相关法律法规
三星智能手表OLED面板由京东方提供
必易微荣获“市场表现奖”,董事长、总经理谢朋村先生荣获“杰出贡献奖”
安防行业洗牌 留给中小安防企业企业的机会已经不多了
信息化部部长向外界介绍了我国5G网络铺设的速度
工控一体机电脑的性能特征
高通基于可穿戴设备的多国语言字库解决方案 — 字型专业美观
什么是电力补偿电容器,它的作用是什么
基于可编辑逻辑器件实现IEEE 802.11协议帧生成器的应用方案
Arduino篇—点亮LED