位置:51电子网 » 技术资料 » 显示光电

AT91SAM7Sxx系列MCU Boot-Loader的设计

发布时间:2007/8/24 0:00:00 访问次数:426

引言


AT91SAM7xx 系列是Atmel 公司推出的基于ARM7内核的32位MCU。用户代码编译在Thumb 模式下可获得16位指令宽度,从而节约内部程序空间。目前这个系列芯片的内部Flash空间范围从32KB到256KB, RAM空间范围是8KB 到 64KB。除了SAM7S32外,这个系列的芯片都内嵌有USB2.0全速通讯模块。本文介绍的就是基于USB接口的用户程序升级工具。


我们知道 Atmel 公司为这个系列芯片提供了 SAM-BA 下载工具。这个工具在产品阶段的应用有一定的局限,就是为了启动芯片内部的 SAM-BA 程序,用户需要短接芯片的TST引脚到电源端,然后上电10秒钟,再重新上电.本文介绍的Boot-loader 程序常驻在芯片内部Flash空间,启动方法是用户按住产品的一个特定的按键然后上电。这样大大简化了产品固件的升级过程。


1 Boot-loader 在Flash中的位置


为了在整个SAM7Sxx系列中通用同一个Boot-Loader程序,我们把它定位在Flash的低端位置偏移量为0x800至0x15ff位置,共占用3584个字节空间。相应的用户程序在链接时要避开使用这段地址。笔者采用的是IAR编译环境,需要修改链接目标定位控制文件达到定位目标文件的目的。以S256为例,需要修改at91SAM7S256_NoRemap.xcl 文件


Boot-loader 的链接控制文件中需要修改的项目有:


-DROMSTART1=00 中断向量表起始位置


-DROMEND1=3F 中断向量表结束位置


-DROMSTART2=800 目标程序起始位置


-DROMEND2=15FF 目标程序结束位置


CODE, ICODE CONST 的定位同样需要相应的修改。


Boot-loader 启动文件为Atmel提供(Cstartup.s79),但需要作一定修改:


RSEG ICODE:CODE:ROOT(2) 改为RSEG INTVEC:CODE:ROOT(2) 把异常向量表定位在0x00至0x3f.


异常向量表的末端添加语句RSEG ICODE:CODE:ROOT(2) 把启动代码定位在CODE段.


用户应用项目需要修改at91SAM7S256_NoRemap.xcl文件中


-DROMSTART1=00 中断向量表及启动代码起始位置


-DROMEND1=7FF 中断向量表及启动代码结束位置


-DROMSTART2=1600 目标程序起始位置


-DROMEND2=3FFFF 目标程序结束位置


CODE, ICODE CONST 的定位同样需要相应的修改。以避免和Boot-Loader 地址重叠。


2 Boot-Loader 的实现


2.1 Boot-Loader 的启动


上电复位后,PC指针首先指向Boot-Loader,Boot-Loader首先初始化IO口,然后判断用户有无按下启动Boot-Loader的按键。如果该键没有被按下,同时Flash内有用户代码,则跳到用户程序入口。下面代码是用汇编写用户入口子程序。


PUBLIC EnterUser


CODE16


EnterUser:


ldr r1, = 0x15fc ; 0x15fc 保存用户入口地址


ldr r0, [r1,#0]


bx r0


如果用户在上电时有按下该键,则运行Boot-Loader 的主循环。


2.2 USB 驱动


USB驱动采用HID类以省下开发驱动程序的需要.HID的报表采用如下结构:


const char LoaderDescriptor[] = {


0x06, 0xA0, 0xFF, // 厂家定义用途


0x09, 0x01, // 厂家定义用途


0xA1, 0x01, // 报表集合:应用


// The Input report


0x09, 0x03, // 厂家定义的报表ID


0x15, 0x00, // 逻辑最小值 (0)


0x26, 0xFF, 0x00, // 逻辑最大值(255)


0x75, 0x08, // 报表位宽(8 位)


0x95, 0x03, // 报表长度(3 )


0x81, 0x02, // 输入报表


// The Output report


0x09, 0x04, // 厂家定义的报表ID


0x15, 0x00, // 逻辑最小值 (0)


0x26, 0xFF, 0x00, // 逻辑最大值 (255)


0x75, 0x08, // 报表位宽


0x96, 0x04, 0x01, // 报表长度(260 字节)


0x91, 0x02, // 输出报表


0xC0}; // 集合结束


这样PC下传的数据报大小是260B,其中第一字节为写命令,第二,第三字节是用户固件的页地址(用户固件需编译为二进制文件*.bin).接下来是256字节的固件数据。


2.3 Flash 的操作


把所有操作Flash的函数定义在RAM空间,例如:


__ramfunc int CFlash::Erase_All(void)


因为SAM7Sxx系列的Flash采用单层结构,不允许程序在Flash上运行的同时改写Flash的内容, 所以要将操作Flash的程序放在RAM中运行.


2.4 数据包的处理


第一个数据包包含用户启动代码和异常向量表。Boot-Loader需要修改复位向量,并保存用户入口地址(伪代码如下)


if (Page == 0) {


Get User Entrance Addre

引言


AT91SAM7xx 系列是Atmel 公司推出的基于ARM7内核的32位MCU。用户代码编译在Thumb 模式下可获得16位指令宽度,从而节约内部程序空间。目前这个系列芯片的内部Flash空间范围从32KB到256KB, RAM空间范围是8KB 到 64KB。除了SAM7S32外,这个系列的芯片都内嵌有USB2.0全速通讯模块。本文介绍的就是基于USB接口的用户程序升级工具。


我们知道 Atmel 公司为这个系列芯片提供了 SAM-BA 下载工具。这个工具在产品阶段的应用有一定的局限,就是为了启动芯片内部的 SAM-BA 程序,用户需要短接芯片的TST引脚到电源端,然后上电10秒钟,再重新上电.本文介绍的Boot-loader 程序常驻在芯片内部Flash空间,启动方法是用户按住产品的一个特定的按键然后上电。这样大大简化了产品固件的升级过程。


1 Boot-loader 在Flash中的位置


为了在整个SAM7Sxx系列中通用同一个Boot-Loader程序,我们把它定位在Flash的低端位置偏移量为0x800至0x15ff位置,共占用3584个字节空间。相应的用户程序在链接时要避开使用这段地址。笔者采用的是IAR编译环境,需要修改链接目标定位控制文件达到定位目标文件的目的。以S256为例,需要修改at91SAM7S256_NoRemap.xcl 文件


Boot-loader 的链接控制文件中需要修改的项目有:


-DROMSTART1=00 中断向量表起始位置


-DROMEND1=3F 中断向量表结束位置


-DROMSTART2=800 目标程序起始位置


-DROMEND2=15FF 目标程序结束位置


CODE, ICODE CONST 的定位同样需要相应的修改。


Boot-loader 启动文件为Atmel提供(Cstartup.s79),但需要作一定修改:


RSEG ICODE:CODE:ROOT(2) 改为RSEG INTVEC:CODE:ROOT(2) 把异常向量表定位在0x00至0x3f.


异常向量表的末端添加语句RSEG ICODE:CODE:ROOT(2) 把启动代码定位在CODE段.


用户应用项目需要修改at91SAM7S256_NoRemap.xcl文件中


-DROMSTART1=00 中断向量表及启动代码起始位置


-DROMEND1=7FF 中断向量表及启动代码结束位置


-DROMSTART2=1600 目标程序起始位置


-DROMEND2=3FFFF 目标程序结束位置


CODE, ICODE CONST 的定位同样需要相应的修改。以避免和Boot-Loader 地址重叠。


2 Boot-Loader 的实现


2.1 Boot-Loader 的启动


上电复位后,PC指针首先指向Boot-Loader,Boot-Loader首先初始化IO口,然后判断用户有无按下启动Boot-Loader的按键。如果该键没有被按下,同时Flash内有用户代码,则跳到用户程序入口。下面代码是用汇编写用户入口子程序。


PUBLIC EnterUser


CODE16


EnterUser:


ldr r1, = 0x15fc ; 0x15fc 保存用户入口地址


ldr r0, [r1,#0]


bx r0


如果用户在上电时有按下该键,则运行Boot-Loader 的主循环。


2.2 USB 驱动


USB驱动采用HID类以省下开发驱动程序的需要.HID的报表采用如下结构:


const char LoaderDescriptor[] = {


0x06, 0xA0, 0xFF, // 厂家定义用途


0x09, 0x01, // 厂家定义用途


0xA1, 0x01, // 报表集合:应用


// The Input report


0x09, 0x03, // 厂家定义的报表ID


0x15, 0x00, // 逻辑最小值 (0)


0x26, 0xFF, 0x00, // 逻辑最大值(255)


0x75, 0x08, // 报表位宽(8 位)


0x95, 0x03, // 报表长度(3 )


0x81, 0x02, // 输入报表


// The Output report


0x09, 0x04, // 厂家定义的报表ID


0x15, 0x00, // 逻辑最小值 (0)


0x26, 0xFF, 0x00, // 逻辑最大值 (255)


0x75, 0x08, // 报表位宽


0x96, 0x04, 0x01, // 报表长度(260 字节)


0x91, 0x02, // 输出报表


0xC0}; // 集合结束


这样PC下传的数据报大小是260B,其中第一字节为写命令,第二,第三字节是用户固件的页地址(用户固件需编译为二进制文件*.bin).接下来是256字节的固件数据。


2.3 Flash 的操作


把所有操作Flash的函数定义在RAM空间,例如:


__ramfunc int CFlash::Erase_All(void)


因为SAM7Sxx系列的Flash采用单层结构,不允许程序在Flash上运行的同时改写Flash的内容, 所以要将操作Flash的程序放在RAM中运行.


2.4 数据包的处理


第一个数据包包含用户启动代码和异常向量表。Boot-Loader需要修改复位向量,并保存用户入口地址(伪代码如下)


if (Page == 0) {


Get User Entrance Addre

相关IC型号

热门点击

 

推荐技术资料

按钮与灯的互动实例
    现在赶快去看看这个目录卞有什么。FGA15N120AN... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!