AN3561_MC9S08JM60的USB Bootloader(中文)

AN3561_MC9S08JM60的USB Bootloader(中文)
AN3561_MC9S08JM60的USB Bootloader(中文)

应用笔记AN3561

MC9S08JM60的USB Bootloader

文件编号:AN3561

版本:0,08/2005

苏州大学飞思卡尔嵌入式系统研发中心翻译

https://www.360docs.net/doc/ee17944657.html,

2009年11月

I

1.简介 (1)

2.B OOTLOADER概述 (1)

2.1 Bootloader资源 (1)

2.2 Flash存储器保护 (2)

2.3 向量重定向 (3)

2.4软件启动过程 (3)

2.4.1用户模式 (3)

2.4.2 bootloader初始化 (4)

2.4.3 Bootloader模式 (5)

2.5 PC驱动及PC GUI工具 (6)

3B OOTLOADER实现指南 (7)

3.1 软件整合 (7)

3.2 PC驱动安装 (9)

3.3 运行PC GUI工具 (11)

3.3.1 启动PC GUI工具 (11)

3.3.2 擦除Flash (14)

3.3.3 空白检测 (14)

3.3.4 Flash写入 (15)

3.3.5 代码校验 (17)

4.结论 (18)

附录A例程 (19)

MC9S08JM60的USB Bootloader

II

1.简介 (1)

2.B OOTLOADER概述 (1)

2.1 Bootloader资源 (1)

2.2 Flash存储器保护 (2)

2.3 向量重定向 (3)

2.4软件启动过程 (3)

2.4.1用户模式 (3)

2.4.2 bootloader初始化 (4)

2.4.3 Bootloader模式 (5)

2.5 PC驱动及PC GUI工具 (6)

3B OOTLOADER实现指南 (7)

3.1 软件整合 (7)

3.2 PC驱动安装 (9)

3.3 运行PC GUI工具 (11)

3.3.1 启动PC GUI工具 (11)

3.3.2 擦除Flash (14)

3.3.3 空白检测 (14)

3.3.4 Flash写入 (15)

3.3.5 代码校验 (17)

4.结论 (18)

附录A例程 (19)

III

1. 简介

本应用笔记描述了MC9S08JM60的bootloader(可译作“引导装入”)技术,该bootloader允许通过USB对Flash进行在线编程。在线编程(ICP)是属于对安装在电路板上的MCU进行编程和擦除等处理的技术。允许用户在产品开发、生产期间代码更改,以及代码升级。

MC9S08JM60是Freescale半导体提供的低成本、高性能的8位MCU中HCS08系列的一员。有60KB的片内Flash,不需要提供特殊电压就可以写入、擦除。在线编程可以通过几种通信方法进行。MC9S08JM60有一USB2.0的全速模块,这使得该MCU 适合通过USB接口在线编程。USB速度较快可以在2-3秒对60KB flash写入。比BDM 速度要快。

基于flash的bootloader代码可以分为3个功能模块:

z在板和PC之间枚举和传输信息USB低层驱动

z命令解释以及.s19信息数据的下载

z Flash擦除和写入

图1是USB bootloader的系统环境。

目标

系统

USB

线缆

图1 系统环境

PC和目标系统通过USB接口使用Freescale半导体规定的USB协议通信。目标系统担当USB设备,PC担当USB主机。PC对目标系统的编程在2.5(PC驱动和PC GUI 工具)中描述。

2.Bootloader概述

2.1 Bootloader资源

bootloader尽可能少的使用MCU资源以最小化对应用的影响。

z USB模块:bootloader中不使用USB中断。只有控制传输端点(端点0)被使用。

z内存空间:bootloader有效的利用内存。代码小于1KB、RAM只使用70个字

1

2

节。其中11个字节为bootloader 变量59个字节为flash 擦除写入使用。Flash 擦除/写入的命令必须在RAM 中执行。

图2 是MC9S08JM60的内存分布和bootloader 的内存空间。Bootloader 的变量位于0x00B0到0x00BA 。Bootloader 代码驻留在flash 的最后,0xFC00至0xFFAF 。

图2 存储映射

2.2 Flash 存储器保护

位于0xFC00至0xFFAF 的Flash 存储器必须保护起来以避免意外擦除bootloader 代码。Flash 保护寄存器控制MC9S08JM60的flash 存储器的保护。如果使能保护,块保护从flash 存储器上次512字节的边界地址开始。例如:如果值0xFA 写入到Flash 保护寄存器,那么flash 存储器从0xFC00到0xFFFF 被保护。写NVPROT 寄存器保护bootloader 代码是用户的责任。对于保护机制的详细信息,可参考MC9S08JM60数据手册的4.5.6。

直接页寄存器

RAM

4096字节 Flash

1872字节 RAM 4085字节

Flash 57760字节

非易失寄存器

向量表 Bootloader 变量

重定位向量表 Bootloader 代码

2.3 向量重定向

如果flash存储机制使能,那么位于0xFFC0至0xFFFF的向量表不能被修改。除了复位以外的所有向量必须重定向到合适的地址,该地址为用户代码中中断服务子程序的入口地址。如果NVOPT中的FNORED位被写为0,那么MC9S08JM60支持向量重定向。例如:如果地址为0xFC00至0xFFFF的flash存储器被保护,清零FNORED位使得向量表由0xFFC0-0xFFFD重定位到0xFBC0-0xFBFD。写入FNORED位重定向向量表是用户的责任。对于向量重定位机制的详细信息,参考MC9S08JM60数据手册的4.5.7。

2.4软件启动过程

图3是bootloader启动过程。

复位

模式?

COP、MCG、时钟及

USBCTL0初始化

用户模式Bootloader模式

图3 Bootloader启动过程

复位后运行一小段代码以确定运行模式。在本例中(参考附录A:“例程”)使用一GPIO PTG0来决定运行模式。如果PTG0为高电平,目标系统进入用户模式,否则进入bootloader模式。

2.4.1用户模式

如果目标系统进入用户模式将会执行一跳转指令跳转到用户应用代码。用户应用代码位于未保护的flash存储区域(0x1960-0xFBFF)。

用户应用代码的入口地址可以随着每次链接工程不同而不同。模式决定代码驻留在被保护的flash存储区,不能被更新。用户代码的绝对入口地址必须提供给bootloader。图4是使用用户模式的绝对入口地址0xFB00跳转到用户应用代码的例子。如果确定是用户模式,执行JMP 0xFB00跳转到0xFB00。在0xFB00,另一条跳转指令调用_Startup()函数来运行用户应用代码。这使得系统跳转到地址0xFB00而进入用户模式不论

3

4

_Startup()在哪儿。

图4 用户模式的固定入口地址

_Startup()是C 语言的标准的启动函数。配置设备由用户完成。

2.4.2 bootloader 初始化

在MCU 进入bootloader 模式之前用户必须做以下几步: 1. 在进入bootloader 模式之前禁止看门狗(COP )。

COP 可能导致USB 枚举错误和flash 擦除/写入错误。系统选择寄存器1(SOPT1)中的COPT 位置位可以禁止COP 。设置COP 的详细信息,请参考MC9S08JM60数据手册的5.4。

注:

SOPT1是只能写一次的寄存器。为了在应用中使用COP ,可以在模式确定后设置SOPT1寄存器。

2. 设置多用途时钟发生器(MCG )

MC9S08JM60的USB 模块要求两个时钟源,一个24MHz 的总线时钟和一个48MHz 的基准时钟。48MHz 的基准时钟直接已MCGOUT 为源。对于MC9S08JM60的USB 操作,MCG 必须设置为PEE 模式使用外部晶振达到48MHz 的MCGOUT 频率。详细信息请参考MC9S08JM60数据手册的第12章。

3. 设置片内稳压器(regulator )以及USBDP 上拉

MC9S08JM60有3.3V 的片内稳压器可以为USB 内部收发器提供稳定的电源。如果片内稳压器使能,需要3.9V 至5.5V 的电压供给(V DD )。如果片内3.3V 稳压器禁止,MCU 和USB 可以工作在不同的电压,必须通过VUSB3.3引脚为USB 收发器提供3.3V 的电源。

USB2.0规范对于全速运行要求在USBDP 上有上拉电阻。MC9S08JM60 USB 模块中实现了片内上拉电阻。可以禁止片内上拉电阻,USB 模块可以设置为USBDP 线使用外部上拉电阻。

通过置位或清零寄存器USBCTL0中的USBPU 位和USBVREN 位,可以配置片内稳压器和片内上拉电阻。该步必须在进入bootloader 模式之前进行。Bootloader 代码修改寄存器USBCTL0中其他位时保留这些信息。表1总结了在进入bootloader 模式之前怎样配置寄存器USBCTL0。片内稳压器和片内上拉电阻的详细信息,请参考

模式确认

Bootloader 模

式 用户模式 JMP 0xFB00

5

MC9S08JM60数据手册的17.3.1。

表1 不同应用的USBCTL0配置

3.3V 稳压器 USBDP 上拉电阻 USBCTL 设置 内部 内部 0x44 内部 外部 0x04 外部 内部 0x40 外部

外部 0x00

如果启动过程被用户修改了,一定要小心配置SOPT1、MCG 及USBCTL0。不恰当的设置可能导致bootloader 出错并损坏目标系统。

2.4.3 Bootloader 模式

图5是bootloader 模式的软件流程图。在USB 线插上后,USB 枚举开始。USB 线缆第一次插上时需要安装PC 驱动。如果枚举成功,目标系统会被识别为MC9S08JM60 USB ICP 设备。一PC GUI 工具可以用来在线编程。PC 驱动和PC GUI 工具在2.5节(PC 驱动和PC GUI 工具)阐明。

图5 bootloader 模式流程图

Bootloader 模式的代码以源代码和二进制库的形式提供。用户和库之间的接口称为

空白块检测

擦除Flash 写入

代码校验 校验? 写入? 擦除?

空白检测?USB 枚举 Bootloader 入口

6

Bootloader_Main()函数。编译和链接时该代码一定要定位到flash 存储器中的0xFC00至0xFFAF 。电源复位(POR )可以退出bootloader 模式。

注:

如果以二进制库的形式使用bootloader 代码,Bootloader_Main ()作为入口函数一定不能改变。

2.5 PC 驱动及PC GUI 工具

MC9S08JM60的PC 驱动和PC GUI 工具和MC68HC908JB16的基本相同。参考AN2399及其软件。如果没有安装PC 驱动,PC 不能识别bootloader 模式下的MC9S08JM60。MC9S08JM60的驱动包括USBICP.inf 和USBICP.sys 。可以在该应用笔记的软件中找到。

PC GUI 工具发送命令到目标系统进行擦除和写入。图6是该PC GUI 工具的截图。该工具的使用方法在3.3(运行PC 工具)详细介绍。

图6 USB PC GUI 工具

7

3 Bootloader 实现指南

本段详细介绍了MC9S08JM60 USB bootloader 实现的过程。附录A 提供了一个例程(“Example Project ”)作为参考。该例程可以作为创建工程的模板。AN3561SW 中包含一个CodeWarrior 下的该工程。

3.1 软件整合

bootloader 应用的编译工具是HC (S )08的CodeWarrior ,版本为5.1或者更高。下面步骤说明了怎样创建一个bootloader 支持的简单的工程。

1.创建一个新工程

使用CodeWarrior 的新工程向导创建一个MC9S08JM60的新工程。 2.按照图7修改prm 链接文件

a )0xFC00至0xFFAF 的flash 空间为Bootloader 代码保留。名为Bootloader_ROM 的Bootloader 代码段放置在该区域。

注意

bootloader 段一定要命名为Bootloader_Rom 编译到保护的flash 空间0xFC00至0xFFAF 。

b )0xB0至0xBA 的RAM 用于bootloader 的变量。Z_RAM 的开始地址必须改为0xBB 。

c )修改复位向量。使用_Entry 函数代替_Startup 函数作为向量0。注释_Startup 函数添加_Entry 函数。

图7 修改prm 文件

3.初始化NV 寄存器

8

为了实现flash 块保护以及向量表重定位一定要初始化NVOPT 和NVPROT 寄存器。使用图8中命令初始化NV 寄存器。

图8 初始化NV 寄存器

注意

NVOPT 和NVPROT 寄存器位于非易失性存储器中。只可以写一次而且必须在代码的第一行。请参考附录A “Example Project ”。

4.向工程中加载bootloader 库 如图9中选择CodeWarrior 菜单“Project->Add Files ”并将JM60_Bootloader_Vx.y.lib 添加到库中。

Bootloader 库名为JM60_Bootloader_Vx.y.lib 。Vx.y 是版本号,该库可以在文件夹\Template with Bootloader\Source\中找到。

图9 _Entry 函数

5.模式确定

图9中展示了如何确定模式的例子。I/O 口的PTG0设置为输入。在启动阶段如果PTG0为逻辑1,目标系统进入用户模式。否则初始化bootloader 进入bootloader 模式。

6.固定用户模式的入口地址

请参考2.4.1“用户模式”中怎样固定用户模式的入口地址。 7.Bootloader 初始化

9

为了确保代码位于保护flash 区域在入口函数前必须声明一段声明#pragma CODE_SEG Bootloader_ROM 。Bootloader 的初始化要包含COP 禁止、MCG 时钟和USBCTL0寄存器的初始化。

在所有步骤完成之后编译链接工程。查看.map 文件确认bootloader 代码是否位于保护flash 存储区。该应用代码可以加入到该工程中。

3.2 PC 驱动安装

工程建立后,软件要下载到目标系统,软件的下载要通过其他工具例如BDM Multilink ,因为目标系统没有bootloader 代码。关于BDM Multilink 请参考HCS08系列开发支持参考手册(第7章)。

以下是安装PC 驱动的步骤:

1.启动目标系统,选择进入bootloader 模式,当USB 线插入时出现如图10的驱动安装窗口。选择从列表或指定位置(高级)然后点击Next 。

图10 驱动安装窗口

2.指定包含USBICP.inf 文件的文件夹,然后点击下一步。如图

11

10

图11 指定USBICP .INF 文件

3.如果窗口如图12所示,定位包含USBICP.sys 文件的文件夹。本应用笔记中该文件在软件包的PC 软件文件夹下。

图12 安装USBICP .sys 文件

4.如果出现图13中的界面,点击完成完成安装。

11

图13 驱动安装完成

3.3 运行PC GUI 工具

PC GUI 工具是用来擦除和写入的。使用说明如下。

3.3.1 启动PC GUI 工具

如图14打开USBICP.exe 文件载入参数文件。MC9S08JM60的参数文件为9S08JM60.imp 。USBICP 如图15窗口出现并可以使用了。

12

图14 启动PC 工具

图15 USBICP 窗口

13

图16 运行工具错误

如果出现如图16所示的错误窗口,请检测USB 是否枚举成功或者参数文件是否载入。如果USB 枚举成功,如图17可以看到在windows 设备管理中看到Freescale USB JM60 ICP 设备。如果USB 枚举失败,请检测如下几点:

z USB 线缆是否插入

z MCG 输出是否为48MHz 时钟

图17 USB 枚举成功

z COP 是否禁止

z USBCTL0是否如表1中设置

14

z PC 驱动有没有安装

3.3.2 擦除Flash

点击Flash 按钮擦除从0x1960到0xFBFF 地址的flash 存储区。如果成功,出现图18的窗口,在写入之前要进行擦除操作。

图18 擦除Flash

如果Flash 存储器不能被擦除,检测以下几项: z Flash 存储器时钟设置正确 z Flash 没有被保护或加密 z COP 禁止

3.3.3 空白检测

点击Blank Check 按钮检测0x1960至0xFBFF 的flash 存储是否空白。如果成功,出现图19的窗口。

15

图19 空白块检测

3.3.4 Flash 写入

如图20中点击Select File 按钮选择.s19文件写入。该USB ICP 工具只支持S 格式的文件。

16

图20 指定文件

点击Program 按钮写入flash 存储。只有在0x1960至0xFBFF 的falsh 空间可以被写入。超过该范围的flash 存储器忽略。如果成功会出现如图21所示的窗口。

图21 Flash 写入

17

如果flash 存储器不能被写入,检测以下几项: z 载入的S 格式文件是否正确

z 在写入之前flash 存储器是否为空 z flash 存储器时钟是否设置正确 z flash 被是否加密或保护 z COP 是否禁止

3.3.5 代码校验

在代码写入后,bootloader 可以校验MCU 中的代码。点击Verify 按钮进行校验。如果写入正确,会出现图22所示的校验成功。

图22 代码校验

相关主题
相关文档
最新文档