编程浪子的博客

碌碌无为终为过

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

手上一块英倍特的EM-SAM3S开发板,拿到已经有一个月了。本来是做uLoong活动使用的板子,可当初由于不熟悉这个芯片,使用了STM32F4当作了替代。最近准备抽点时间折腾下这个板子。

这个板子的资源如下:

MCU:ATMEL Cortex M3 AT91SAM3S4C (主频 64MHz )

FLASH:片内256KB,片外2Gb NandFlash

SDRAM :片内48KB

接口:MicroSD I/F、LCD I/F、RS232 I/F 、USB I/F、JTAG I/F、 Audio I/F 、RS485 I/F

其他功能:RTC、LED×2、USE Button、Zigbee、QTOUCH接口、Free IO、AD

电源:USB供电或者外接5V电源

今天从启动开始看看。以下内容是我分析英倍特提供的例程时的产物。

【预备知识】

Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。

【启动分析】

在例子程序中,MCU启动时,会将vector中定义的第二个地址作为程序的入口地址。即Reset_Handler。

至于为什么会从vector加载,可以查看分散加载文件(.sct)。这里有这么一段:

Vector_region 0x400000

{

    board_cstartup_keil.o (vectors, +FIRST)

}

这个声明就是让链接器将board_cstartup_keil.o加载到0x400000。

而0x400000就是内部flash的起始地址:

clip_image002

board_cstartup_keil.o由board_cstartup_keil..c生成。这个文件中,定义了两个东西:__vector_table[]和static void _Reset_Handler( void )

__vector_table就是中断向量表,__vector_table的第二个地址就是_Reset_Handler。因此,MCU启动时将向量表加载完成后,就开始执行_Reset_Handler这个函数。

在这个函数中跳转到main函数。好了,花花丽丽的C开始了。

(至于为什么加载到了0x400000是__vector_table而不是_Reset_Handler,那是因为那个+FIRST这个属性)

【总结一下】

1、在分散加载文件中,设置程序加载到的位置。加载到0x400000这个地址的,就会在启动时候执行。

2、这里的启动文件有很简单的两个东西,中断向量表和函数_Reset_Handler。中断向量表的第二个地址就是复位中断程序入口地址。

3、汇编文件workaround.s没用了。删掉里边的内容都没关系。于是一行汇编代码都没有了,这也算是自己写sct文件的好处吧。

posted on 2013-07-19 21:01  编程浪子_  阅读(1099)  评论(0编辑  收藏  举报