《FBOOTROM引导模式和程序.pdf》由会员分享,可在线阅读,更多相关《FBOOTROM引导模式和程序.pdf(13页珍藏版)》请在金锄头文库上搜索。
1、28335 使用串口烧写程序 串口烧写是一种相对较方便的烧写方式 相对于仿真器或是CAN烧写 相对于 仿真器或是USB转 CAN 的设备 串口是一种非常廉价的烧写方式 而且也不需要安装 专业的集成开发环境CCS等 但是不能实现在线调试 因此也只适用于程序基本不用 再调整或大批量的场合 F28335 的存储器映射图如下 BOOTROM 是一块 8K X 16 的只读存储器 位于地址空间0 x3FE000 0 x3FFFFF 片内 BOOTROM 在出厂时固化了引导加载程序以及定点和浮点数据表 片上 BOOTROM 的存储映射如下图所示 1 内 BOOT ROM 数学表 在 BOOT ROM 中保
2、留了 4K X 16 位空间 用以存放浮点和IQ 数据公式表 这些数据 公式表有助于改善性能和节省SARAM空间 向量表 CPU向量表位于ROM 存储器 0 x3FE000 0 x3FFFFF 段内 如下图所示 复位后 当 VMAP 1 ENPIE 0 PIE 向量表禁止 时 该向量表激活 在内部 BOOT ROM 引导区中能够调用的唯一向量就是位于0 x3FFFC0 的复位向量 复 位向量在出厂时被烧录为直接指向存储在BOOT ROM 空间中的 InitBoot 函数 该函数 用于开启引导过程 然后通过通用I O 引脚上的检验判断 决定具体引导模式 引导 模式与控制引脚之间的关系如下图所示
3、Bootloader 特性 Bootloader 是位于片上引导ROM 中的在复位后执行的程序 用于在上电复位 后 将程序代码从外部源转移到内部存储器 这允许代码暂时存储在掉电不丢失数据 的外部存储器内 然后被转移到高速存储器中执行 引导 ROM 中的复位向量将程序执行重定向至InitBoot 函数 执行器件初始化 之后 bootloader 将检查 GPIO 引脚的状态以确定您需要执行哪种引导模式 这些选项 包括 跳转至闪存 跳转至SARAM 跳转至 OTP或调用其中一个片上引导加载例程 完成选择进程后 如果已完成所需的引导加载 处理器将在所选引导模式确定 的应用起点继续执行 如果调用了bo
4、otloader 则由外设加载的输入流确定此应用起 点地址 然而 如果选择直接引导至闪存 OTP 或 SARAM 这些存储器块中每一个存 储器块的应用起点均已预定义 上图显示了引导进程的概述 以下引导模式不掉用bootloader 他们会跳转至存储器中的预定义位置 1 跳转至闪存中的分支指令 在此模式下 引导ROM 软件将针对28x 操作配置器件 然后直接分支至闪存的 0 x33FFF6 位置 此位置刚好是128 位代码安全模块 CSM 密码位置之前 您需要预 先在 0 x33FFF6 位置处编写分支指令 以将代码执行重定向至定制的boot loader或应 用代码 在仅有 RAM 的器件上
5、引导至闪存 将跳转到保留存储器 因此不应当使用此选项 2 跳转至 M0 SARAM 在此模式下 BOOTROM 将针对 28x 操作配置器件 然后直接分支至0 x000000 即 M0 SARAM 存储器块中的第一个地址 3 跳转至 OTP 存储器 在此模式下直接分支至0 x380400 即 OTP存储器块中的第一个地址 以下引导模式将调用一个用于将数据流从外设加载至存储器的引导加载例程 SCI A 注意此处的SCI A 对应的是 GPIO28 和 GPIO29 SPI A I2C A eCAN A GPIO0 GPIO15 并行引导 如果使用 SCI 或者其他引导的话 首先需要将启动模式选择
6、相关的引脚配置成 对应的模式 然后器件退出复位状态之后 首先从复位向量处开始运行 即从 0 x3FFFC0 处 该地址存放着BOOT ROM 中的第一个汇编初始引导程序InitBoot 程序 的入口地址 程序跳转至0 x3FFC00 执行 InitBoot 程序 该程序主要初始化F28335 器 件工作的目标模式 然后读取安全保护模块的密码 如果CSM密码被擦除 全部等于 0 xFFFF 则自动解锁 否则CSM仍被锁定 对 CSM密码读取完成后 初始化例程调用模式选择功能函数 SelectBoot 该函数根据GPIO 的状态确定处理器引导的方式 一旦完成SelectMode 将会把入口地 址返
7、回给初始化引导 然后初始化引导函数调用回复CPU 寄存器的退出例程 ExitBoot 并退出到由引导模式确定的程序入口地址 因此我们在使用SCI 升级程序时可以分两个步骤 第一个步骤是我们需要一个 Bootloader 程序 第二个就是我们要升级的程序 BootLoader 程序就是我们在选择引 导 SCI 模式之后 SelectBoot 之后通过串口加载的第一个程序 待ExitBoot 之后会跳 转到我们这个bootloader 指定的地址开始执行 即将控制权交给我们的这个 BootLoader 程序 因此我们的BootLoader 程序就肩负着串口接收我们的应用程序并 将应用程序烧写到FL
8、ASH的任务 第二个就是我们的应用程序 这个跟平常的应用程 序一样 没有任何区别 1 BootLoader 程序 由上面的介绍明显知道我们的Bootloader 程序是运行在RAM里面的 所以使 用 CCS在编写该程序的时候使用的是RAM Link 的 CMD 而且该程序除了串口的处理 还有包括 FLASH操作的 API 函数 而这些函数必须要运行在RAM 里面 而且在进行 FLASH操作的时候要将中断全部都关掉 FLASH的 API 有相关的例程是烧进FLASH的 还要拷贝到RAM 我们这里正好还免去了拷贝的过程 因为我们整个程序都是运行在 RAM 中的 Bootloader 数据流的结构
9、上图就是 BootLoader 数据流的结构 数据流的第一个16 位字称为键值 该键 值用来指向Bootloader 指示流入的数据流的宽度 8 位或 16 位 在这里 SCI 就是 8 位 对于8 位数据流 键值为0 x08AA 如果 bootloader 收到一个无效的键值 加 载则中止 则直接跳转到FLASH 开始执行 接下来的8 个字 2 9 用于初始化寄存器直 如果bootloader不使用这些值 则将这些值留作将来使用 第 10 个和第 11 个字组成了22 位应用起点地址 此地址用于在完成引导加载 后初始化 PC 也就是我们程序的起点 第 12 个字表示传输的第一个数据块的大小
10、对于8 位和 16 位数据流格式 该 数据块的大小均定义为块中的16 位字个数 例如 要从8 位数据流中传输一个包含 20 个 8 位数据值的数据块 该块大小将为0 x000A 表示有 10 个 16 位字 第 13 和 14 个字表示程序的目的地址 后面跟的就是程序的字 直到遇到数据 块长度为 0 的则传输结束 上图为 BOOTLoader 传输流程 如果不相等会自动退出引导程序 系统会从内 部 FLASH存储器执行程序 这里需要讲一下 我们的Bootloader 数据流如何得到 我们正常的使用CCS编 译链接得到了文件 然后使用 boot sci8 map o i 详细解释 可参考 TMS
11、320C28x Assembly Language Tools User 当然你可以将这些命令参数写 成脚本 然后直接执行即可 这就会生成Intel 格式的 hex 文件 我们需要自己对这 个 hex 文件解析 对于生成的Hex 文件都是以冒号开始 后面一个字节是数据长度 2 3 字节是地址 第4 字节是数据类型 00 表示数据记录 01 表示文件结束记录 02 表示扩展段地址记录 04 表示扩展线性地址记录 首先需要一个将两个字符转换为一个字节量函数 Void CharToByte char pChar BYTE pByte char h l h pChar 0 l pChar 1 if l 0 pByte BYTE h 16 1 解析的关键代码 If fopen s while feof myFile len fgetc myFile ut 文件生成 hex 文件的目录下 通过命令行执行如下命令 即可生成 hex 文件 在按照上图所示根据自己实际情况配置完成后 我们要将我们板子DSP的启动 方式更改为SCI A 启动方式 然后才能进行烧写 烧写成功如上图所示 在烧写完成之后 将拨码开关重新切换至FLASH启动方 式 重新启动DSP 这时可以观察程序的运行情况