1.前言
通常了解一款芯片,我们最开始从它的电特性描述出发,随后看其外设、存储、时钟等系统基本框架。我相信大家拿到一款芯片之后第一件事就是去查阅其数据手册,对芯片特性有个初步了解。
很多芯片开发者在了解芯片特性之后,会直接拷贝官方提供的例程进行调试,之后慢慢熟悉芯片,变成开发者模式。在这过程中,很多开发者往往忽略了一个重要的步骤,那就是熟悉芯片启动原理,所以我们今天将DSP28335这款芯片的启动原理与大家分享。
2.上电复位
颠覆我们感性认识的是,芯片上电过程不是一个瞬时过程,而是 爬坡过程 ,也就是说芯片上电也是需要时间的。
在了解芯片基本特性之后,我们清晰的知道一般芯片都有上电复位模块(POR),也可以称为上电延时复位,其作用是通过延时器件在上电电压爬坡过程中把芯片锁定在复位状态,保证芯片模拟模块和数字模块初始化至已知状态再启动芯片。
当电压逐渐增大,直到达到阈值电压时,上电复位电路会释放内部复位信号。在其他必要条件充足的情况下,芯片开始启动。
3.BOOT ROM
BOOT ROM是芯片内部存储器中固化好的一块只读存储区,用来存放引导程序。
BOOT ROM在芯片内部存储器中地址0x3FE000-x3FFFFF如上图所示。
上图是BOOT ROM中按功能分类的段地址存储区。
CPU Vector Table,此功能区在VMAP = 1 ,ENPIE = 0的情况下使用。
再完成芯片引导程序后,此功能区其他部分被用来存放中断向量表。
4.启动过程
芯片上电完成后,开始运行程序。首先PC指针指向CPU Vector Table中的RESET(地址:0xFFFC0)。
通过观察CMD文件中的RESET地址,我们发现此地址存放着.reset,通过访问存储区中翻译成汇编语言的代码,这里存放着一条跳转指令。芯片复位后第二步,跳转到InitBoot函数入口地址,执行InitBoot函数。
在InitBoot函数中,对器件模式、地址进行选择,还对某些功能进行初始化。最关键的是调用了SelectBootMode这个函数,这个函数通过BOOT引脚状态来决定通过哪种方式引导程序,接下来我们一起走进SelectBootMode。
DSP28335InitBoot中的SelectBootMode是通过读取4个IO引脚的状态决定程序引导方式。
如上图所示定义16种状态。
在引导方式上可以分为两大类,一类是进行ADC校准,一类是不进行ADC校准。
SelectBootMode首先依据读取到的引脚状态判断是否是不进行ADC校准,不校准直接跳过后续程序,将读取到的引导模式的引导函数入口地址返回。
若需要ADC校准,则往下执行ADC校准。
校准后再判断以哪种方式引导,并将引导函数入口地址返回。
返回后在InitBoot中将引导函数入口地址存入ACC,再将ACC赋予PC退出InitBoot,开始运行用户程序。
一般我们将程序引导至FLASH(地址:0x33FFF6)。
通过工程下的CMD文件可发现0x33FFF6中存放着codestart函数,所以紧接着运行codestart函数。
codestart函数中禁止看门狗,再调用RTS中的c_int00函数。
c_int00函数中为C语言的运行搭建运行环境,然后跳转至main函数,来到C语言的世界。
5.总结
以上是DSP28335芯片上电到运行至main函数的基本过程,其基本流程可查阅芯片技术参考手册第二章,流程图如下图所示。
以上是本期全部内容,那么现在芯片就可以正常运行、万事大吉了吗?
当然不是,芯片启动后还需对芯片进行一系列初始化配置,那么这又是怎样一个过程呢?
全部0条评论
快来发表一下你的评论吧 !