![f164932e649eb6c3ad34ee6fc0ae7274.png](https://i-blog.csdnimg.cn/blog_migrate/92a4ba67af876e9afa20d49e5cdb6a8e.jpeg)
1 初识Bootloader
Bootloader定义 · DSP上电引导过程
Bootloader即引导程序,一般指DSP上电复位后负责程序跳转至应用程序之前的出厂程序;也范指将程序数据由指定接口(如CAN)装载到固定区域的过程,包括一次Bootloader和二次Bootloader。
1.1 一次Bootloader
DSP上电复位后,会触发RESET中断,中断指向固化在片内ROM中的Bootloader代码。这是出厂就存在的引导程序,不可修改。它实现的功能是查询Bootloader模式,初始化接口,并从该接口中读取“固定大小”内的源程序并搬移到RAM中执行。这个过程叫一次引导。注意此时的Bootloader不会初始化与模式无关的外设。
1.2 二次Bootloader
对于小程序,只需要一次引导,但一般程序规模大于“固定大小(一般64K或1K)”,这时需要在一次Bootloader的基础上编写一个新的引导程序,这个引导程序不超过“固定大小”,而源程序则放在另外一处,这样在新的Bootloader程序中实现搬移源程序的工作。当系统复位时,一次引导把接口中的二次引导程序复制到RAM中执行,复位结束后,在RAM中执行二次引导,将目的源程序复制到FLASH中执行。即第二次引导实现真正的代码搬移,一次引导是二次引导的引导。
以上是常规意义的二次引导,另外一种方案是仅使用一次引导的程序跳转功能,不使用一次引导复制程序,而程序复制与装载由位于FLASH区的新编写的引导程序完成,实现真正的代码搬移,这里的二次Bootloader具有二次开发的意思。
1.3 DSP上电引导过程
当CPU上电时,会引起上电复位RESET。
RESET向量位于固化在boot ROM中的CPU Vector Table。TMS320x2803x的CPU Vector Table位于地址0x3F E000 - 0x3F FFFF。
![9b0db769b0bb2a3c82bbcbf3e5757b9f.png](https://i-blog.csdnimg.cn/blog_migrate/edbe73e53777cac42231fe1572488a9d.png)
CPU Vector Table内容如下图,其中唯一可被正常响应的向量就是位于0x3F FFC0的RESET向量。RESET向量出厂固化为指向InitBoot函数,InitBoot函数位于上图中的Bootloader functions区域。
![efcfd9e3f8e01352bb2275d3ef52437a.png](https://i-blog.csdnimg.cn/blog_migrate/df297a9d53ee2ac9159679c6459b37d6.jpeg)
进入InitBoot函数后,开始执行Bootloader模式查询过程,并根据查询选择的模式根据需求判断是否调用接口函数(如CAN、SCI、I2C等)读取“固定大小”内的源程序并搬移到RAM中执行,或者直接进入入口地址(如FLASH启动,地址为FLASH用户可用区域的最后2字的位置),TMS320x2803x FLASH入口地址为0x3F 7FF6。至此,完成一次Bootloader过程。
![b4d40383f26515f436e2015893a9cc5e.png](https://i-blog.csdnimg.cn/blog_migrate/c502e986116625d309a7ee9d8c16276b.jpeg)
当仅使用一次引导的程序跳转功能,不使用一次引导复制程序时,上图中条件判断“Call Get_Mode()?”和“Call Boot Loader?”将不被满足,从而执行“No”分支,最终默认配置将进入FLASH区域的BEGIN区(地址0x3F 7FF6)。
对于BEGIN区,查看CMD文件中的MEMORY指令,如下图。BEGIN位于PAGE 0,起始地址为0x3F 7FF6,长度为0x00 0002。(注:该地址恰好位于FLSAH用户可用区的末尾,且长度刚好可以存放一条长跳转语句)
![3012df509ce6f407d762879c322f5072.png](https://i-blog.csdnimg.cn/blog_migrate/b1005ab00982c4badbfe241d05879313.jpeg)
对于BEGIN区内存放的程序段,查看CMD文件中的SECTION指令,如下图。可以看出程序段“codestart”将被存放于此。
![ad4f4c315666c454827b7a6d93b7ecf2.png](https://i-blog.csdnimg.cn/blog_migrate/54f4764533ac6b50e0a2aef37771686f.jpeg)
那么“codestart”程序段里又是什么?查看工程中的“xxx_CodeStartBranch.asm”汇编源文件,如下图,BEGIN区将存放一条长跳转指令,该指令默认指向c_int00。
![8a62920bc47553d801b52e6088f6c76b.png](https://i-blog.csdnimg.cn/blog_migrate/bc3ef69af63f1aa62ef1ec9f7f11b532.jpeg)
c_int00是C/C++程序的入口地址,用于完成C运行环境的初始化,最终跳转到main函数,开始运行应用程序。
![f59e356fca7f720e24fd16d3aa8ccbb8.png](https://i-blog.csdnimg.cn/blog_migrate/075ddbef3745116a3657fa91238fc774.jpeg)
欢迎关注微信公众号: iFTrue未来已来
| 公众号后台回复 bootloader、译文 等获取电力电子相关的文章
| 公众号后台回复 交流群 加入技术讨论群