本文的内容为研究MK60DN512VLL10这款芯片的上电启动过程。
这里以Kinetis K60的官方例程与Cortex-M3(Cortex-M4参考手册还没有看)技术参考手册来研究。
研究芯片上电后的启动过程我们需要知道芯片上电后的第一件是什么,因为这里起点,芯片上电后的第一件事就是复位。在离开复位状态后,CM3做的第一件事就是读取下列两个32位整数的值:
从地址0x0000,0000处取出MSP的初值。
从地址0x0000,0004处取出PC的初始值——这个值是复位向量,LSB必须是1.然后从这个值所对应的地址处取指。
而复位也可以认为就是一个中断,要执行中断服务例程,根据Cortex-M3技术参考手册:
从上面两个表可以看出,中断向量编号1就是复位中断。那么0号所说的“没有异常在运行”所指何意?可以看出为MSP的初始值。这从官方例程的向量表中也可以看出:
向量0是用来Intial Supervisor SP,向量1是用来Intial Program Counter。可以认为向量0的值直接就取来做为MSP的值了,而向量1指向的是__startup()函数的地址,这样我们就可以去研究这个函数的功能。可以在crt0.s找到这个函数定义,可以看出是使用汇编写的:
可以看出,其初始化了R0~R12这13个寄存器,这些都是通用寄存器,除此之外还有MSP/PSP、LR、PC“三”个寄存器。并开中断。导入start这个函数的地址,使用BL指令跳转到这个函数中去,那我们就去查看这个start函数:
可以看出这个函数先关了看门狗,把必要数据放入RAM,并进行初始化(包含串口)。确认上一次复位的原因,再进行芯片型号检查,最好到执行main()函数,这里还放了一个while(1),防止cpu无事可做。
这里我们就可以了解芯片上电后是如何一步步运行到main()函数的。
未经允许不得转载:TacuLee » Kinetis K60启动过程解析