F28335BOOTROM引导模式和程序
- 格式:pdf
- 大小:1.63 MB
- 文档页数:15
TMS320C6701(以下简称C6701)是一款浮点运算DSP,适用于需要大量运算且实时性要求高的场合,如导航解算等。
在浮点DSP芯片中,C6701是一款可应用于恶劣环境并具有高可靠性的产品,因此该型DSP芯片虽然推出较早,却依然在某些领域具有重要应用价值。
DSP应用程序需脱离开发系统独立工作,在实时DSP应用系统中,通常将应用程序存储在外部非易失性存储器(如FLASH、E EPROM、PROM等)中。
系统上电后,DSP将外部程序存储器的程序代码加载到可高速存取的RAM中,加载完成后自动跳转到零地址开始运行。
因此DSP程序烧写及自动加载是实时DSP系统设计的重要部分。
本文采用的烧写方法不需要格式转换到外部辅助设备,同时DSP程序不再进行二次加载,简化了烧写及程序自动加载的过程。
1 加载方案及电路设计1.1 外围电路设计C6701有三种加载模式:不加载(No Boot)、ROM加载(Rom Boot)、主机加载(Host Boot)。
这三种加载模式由C6701的BOOTMODE[4:0]引脚电平设定,由这5个引脚的设置共同决定使用何种存储空间映射模式。
在恶劣环境及高可靠应用场合中,可使用不加载方式,也可使用程序从ROM中加载到DSP片外高可靠RAM存储器中的运行方式。
FLASH、EEPROM、PROM等程序存储芯片多为8位或16位,在高可靠应用环境中8位比较常见。
本文中设置BOOTMODE[4:0]为01010B,即程序由外部8位程序存储器加载到外部32位SRAM中,LENDIAN引脚接高电平。
外部程序存储器选用FLASH芯片AM29LV160,32位SRAM芯片选用ACT—S512K32V。
FLASH和SRAM芯片与C6701的硬件连接如图1和图2所示。
1.2 加载方案设计在BOOTMODE[4:0]为01010B的设置下,程序由外部8位程序存储器加载到外部32位SRAM中。
C6701具体加载过程为:DMA按默认时序从CE1地址(0x01000000)复制64 KB到零起始地址外部SRAM芯片中,加载完成后,从零地址处开始执行。
张掌柜讲F28335DSP系列之把DSP程序从烧到RAM变成烧到FLASH中的方法一、前言1、首先跟大家强调一点,阅读这个文档的前提是,已经阅读过本店《张掌柜讲DSP系列之CCS4.2 XDS100在CCS4.2环境下仿真编程新手入门.pdf》这个文档,并且熟练掌握里面的操作步骤。
我后面讲解的话语里面,如果有你看不懂的,请回过头去看《张掌柜讲DSP系列之CCS4.2 XDS100在CCS4.2环境下仿真编程新手入门.pdf》。
这个文档我写的比较简练,希望大家看的时候仔细一些。
2、其次,说明一下我写这个文档的原因,很多买家朋友在本店购买TMS320F 28335DSP开发板套装,在RAM程序调试完毕后,将程序固化到FLASH的过程中遇到困难。
因为这些困难是很多朋友都会遇到的,所以我专门写这个文档讲解一下。
3、提醒一下,用仿真器烧写DSP的FLASH程序完成后,给开发板断电,然后拔掉仿真器和DSP开发板之间JTAG的连接,然后再给开发板上电,否则DSP开发板连着DSP 仿真器的时候,无法正常运行FLASH中的程序。
4、最后说明一下,在CCS4的Debug界面下,可以成功的Connect(连接),可以成功的Load program到DSP的片内RAM中,这个就说明DSP仿真器和DSP开发板没有硬件上的损坏或者问题,完全可以放心。
二、把烧写到RAM程序修改成烧写到FLASH的首先,希望大家明白一点,想把一个原来是烧写到DSP的片内RAM的程序修改成是烧写到DSP片内FLASH的程序,不仅仅是修改一个cmd文件就结束了,还需要做其他几个步骤,这里我重点强调一下。
第一步:把28335_RAM_lnk.cmd这个从project中移除,用右键选择28335_RAM_lnk.cmd然后选delate。
如下图1,然后出现对话框,点YES,如图2。
图1图2第二步:右键选择project名称,然后选add file to project,如下图3,然后出现浏览框,在\Code of TMS320F28335 CCS4\v120\DSP2833x_common\cmd这个子文件夹下,选择F28335.cmd,点OK,至此可以在project的文件列表内看到F28335.cmd被添加到project中。
TMS320F28335经验若干要点TMS320F28335开发过程中常见问题总结1.SPI驱动TLE7241E出现返回值不对的问题。
主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E 收到的命令不正确,所以返回值不正确。
2.SPI驱动EEPROM时,如果用金属物触到clock pin时,能正确运行,否则不能正确运行。
出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和eeprom 的时序对上,而不用金属物触碰时时序不正常,当使dsp MOSIpin数据发送提前半个周期后,eeprom工作正常。
3.示波器有时会导致显示的波形被消尖,所以用示波器测量时周期不能太大。
TMS320F28335笔记-I2C1.响应和非响应的区别是什么?关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。
因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。
这表示该设备给出了一个ACK。
如果它不拉低SDA 线,就表示不响应(NACK)。
另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。
总结下,i2c通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA线拉低而已。
对于SCL线,从机是没有任何能力去控制的。
从机只能被动跟随SCL再说的清楚些:主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA 线。
主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。
绝密,DSPF28335实⽤板使⽤教程官⽅声明YXDSP-F28335系列开发板是南京研旭开发⽣产并直接进⾏销售及提供技术服务的产品,暂时未设置任何代理商。
如有其它任何⼚商或代理使⽤“YXDSP-F28335开发套件”的名义进⾏销售,均属于假冒产品。
南京研旭对您购买及使⽤此假冒产品过程中造成的所有损失均不承担任何责任。
官⽅指定销售⽹站:/doc/98ddcdb369dc5022aaea002f.html 中⽂名称:研旭商城官⽅指定销售⽹站:/doc/98ddcdb369dc5022aaea002f.html 中⽂名称:研旭淘宝商城YXDSP-F28335开发板是研旭电⽓科技有限公司⾃主研发的,针对⾼校、研究所和中⼩企业⼩批量设计的需求⽽研发的。
该开发板可以满⾜基于所有F28335开发时的所有应⽤。
YXDSP-F28335开发套件功能强⼤,代码丰富,⽅便使⽤。
在国内,我们的产品已经成为众多的国家级科研院所、⼤学、国家重点实验室、电⼒、通讯、⼯业、医疗类公司指定的开发⼯具。
TMS320F28335型数字信号处理器是TI公司的⼀款TMS320C28X系列浮点DSP控制器。
与以往的定点DSP相⽐,该器件的精度⾼,成本低,功耗⼩,性能⾼,外设集成度⾼,数据以及程序存储量⼤,A/D转换更精确快速等。
TMS320F28335具有150MHz的⾼速处理能⼒,具备32位浮点处理单元,6个DMA通道⽀持ADC、McBSP和EMIF,有多达18路的PWM输出,其中有6路为TI特有的更⾼精度的PWM输出(HRPWM),12位16通道ADC。
得益于其浮点运算单元,⽤户可快速编写控制算法⽽⽆需在处理⼩数操作上耗费过多的时间和精⼒,从⽽简化软件开发,缩短开发周期,降低开发成本。
采⽤六层核⼼板与底板的分拆形式,在听取⼴⼤DSP⼯程师意见的基础上,以保证DSP 能稳定独⽴运⾏、外设资源充分扩展为原则,优化结构设计,注重EMC处理,⽆论在设计还是在⼯艺上,均⽤⼼完成。
28335使用串口烧写程序串口烧写是一种相对较方便的烧写方式,相对于仿真器或是CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大批量的场合。
F28335的存储器映射图如下:BOOTROM 是一块8K X 16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以及定点和浮点数据表,片上BOOTROM的存储映射如下图所示:1.内BOOT ROM数学表:在BOOT ROM中保留了4K X 16位空间,用以存放浮点和IQ数据公式表,这些数据公式表有助于改善性能和节省SARAM空间。
向量表:CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。
复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。
在内部BOOT ROM引导区中能够调用的唯一向量就是位于0x3FFFC0的复位向量。
复位向量在出厂时被烧录为直接指向存储在BOOT ROM 空间中的InitBoot函数,该函数用于开启引导过程。
然后通过通用I/O引脚上的检验判断,决定具体引导模式。
引导模式与控制引脚之间的关系如下图所示:Bootloader特性:Bootloader是位于片上引导ROM中的在复位后执行的程序,用于在上电复位后,将程序代码从外部源转移到内部存储器。
这允许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到高速存储器中执行。
引导ROM中的复位向量将程序执行重定向至InitBoot函数。
执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。
这些选项包括:跳转至闪存、跳转至SARAM、跳转至OTP或调用其中一个片上引导加载例程。
完成选择进程后,如果已完成所需的引导加载,处理器将在所选引导模式确定的应用起点继续执行。
dspf28335启动过程1.DSP reset后运行的起始地址是多少?0x3FFFC02.仿真器烧写程序的步骤是?根据cmd文件把程序烧到指定位置,然后执行。
3.DSP的Flash启动过程是什么?首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。
当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。
然后会跳到0x33FFF6处执行。
在CCS5.2工程的cmd文件中有如下代码:MEMORY{PAGE 0 :BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will go here */...}SECTIONS{...codestart : > BEGIN PAGE = 0...}即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main 函数,之后就是main函数的执行。
总的就是:Reset(0x3fffc0)—>initBoot()—>判断启动方式—>codestart(0x33fff6)—>_c_int00—>main函数4.F28335如何烧写代码到flash中并运行?首先使用添加C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_com mon\cmd\F28335.cmd。
此文件即为配置代码到flash中的TI官方配置文件。
TMS320F28335学习笔记-启动过程分类:DSP TMS320F28335项目研发笔记(11)版权声明:本文为博主原创文章,未经博主允许不得转载。
1.DSP reset后运行的起始地址是多少?0x3FFFC02.仿真器烧写程序的步骤是?根据cmd文件把程序烧到指定位置,然后执行。
3.DSP的Flash启动过程是什么?首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。
当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。
然后会跳到0x33FFF6处执行。
在CCS5.2工程的cmd文件中有如下代码:MEMORY{PAGE 0 :BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will gohere */...}SECTIONS{...codestart : > BEGIN PAGE = 0...}即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main 函数,之后就是main函数的执行。
4.F28335如何烧写代码到flash中并运行?首先使用添加C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_common\cmd\F28335.cmd。
此文件即为配置代码到flash中的TI官方配置文件。
然后参考C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_examples_ccsv4\flash_f2833 5。
F28335存储器功能概述班级:姓名:学号:F28335芯片整体功能框图存储器映射1、F28335使用32位数据地址线和22位程序地址线。
2、32位数据地址线可访问4GB的数据空间, 16位/32位3、22位程序地址线可访问4MB的程序空间。
16位/32位。
4、存储器模块采用统一编址方式映射到程序空间和数据空间。
F28335的存储器分为以下几部分:1. 单周期访问RAM(SARAM)2. Flash存储器3. OTP存储器4. Boot ROM(装载了引导程序)5. 安全模块6. 外设存储器(片内的外设)7. 片外存储器一、单周期访问RAM(SARAM)共分10部分:(1)M0和M1,可映射到数据空间或程序空间(2)L0~L3、 L4~L7,可映射到数据空间或程序空间二、flash存储器闪存的英文名称是"Flash Memory",一般简称为"Flash",它属于内存器件的一种,是一种不挥发性( Non-Volatile )内存。
闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。
是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
F28335的Flash存储器一般可以把程序烧写到Flash中,以避免带着仿真器试调。
F28335器件包含256K*16位的嵌入式闪存存储器,被分别放置在8个32k*16位扇区内。
三、OTP存储器OTPROM(One Time Programmable Read-Only Memory),可以进行片内编程操作,而且可以增强加密功能。
TMS320F28335中文资料TMS320F28335采用176引脚LQFP四边形封装,其功能结构参见参考文献。
其主要性能如下:高性能的静态CMOS技术,指令周期为6.67 ns,主频达150 MHz;高性能的32位CPU,单精度浮点运算单元(FPU),采用哈佛流水线结构,能够快速执行中断响应,并具有统一的内存管理模式,可用C/C++语言实现复杂的数学算法;6通道的DMA控制器;片上256 Kxl6的Flash存储器,34 Kxl6的SARAM存储器.1 Kx16 OTPROM 和8 Kxl6的Boot ROM。
其中Flash,OTPROM,16 Kxl6的SARAM均受密码保护;控制时钟系统具有片上振荡器,看门狗模块,支持动态PLL调节,内部可编程锁相环,通过软件设置相应寄存器的值改变CPU的输入时钟频率;8个外部中断,相对TMS320F281X系列的DSP,无专门的中断引脚。
GPI00~GPI063连接到该中断.GPI00一GPI031连接到XINTl,XINT2及XNMI外部中断,GPl032~GPI063连接到XINT3一XINT7外部中断;支持58个外设中断的外设中断扩展控制器(PIE),管理片上外设和外部引脚引起的中断请求;增强型的外设模块:18个PWM输出,包含6个高分辨率脉宽调制模块(HRPWM)、6个事件捕获输入,2通道的正交调制模块(QEP);3个32位的定时器,定时器0和定时器1用作一般的定时器,定时器0接到PIE模块,定时器1接到中断INTl3;定时器2用于DSP/BIOS的片上实时系统,连接到中断INTl4,如果系统不使用DSP/BIOS,定时器2可用于一般定时器;串行外设为2通道CAN模块、3通道SCI模块、2个McBSP(多通道缓冲串行接口)模块、1个SPI模块、1个I2C主从兼容的串行总线接口模块;12位的A/D转换器具有16个转换通道、2个采样保持器、内外部参考电压,转换速度为80 ns,同时支持多通道转换;88个可编程的复用GPIO引脚;低功耗模式;1.9 V内核,3.3 V I/O供电;符合IEEEll49.1标准的片内扫描仿真接口(JTAG);TMS320F28335的存储器映射需注意以下几点:片上外设寄存器块0~3只能用于数据存储区,用户不能在该存储区内写入程序.OTP ROM区(0×38 0000~0×38 03FF)为只读空间,存储A/D转换器的校准程序,用户不能对此空间写入程序。
一、28335的启动介绍TI支持很多种方式的boot,内部的ram(saram),flash,sci,但无论哪种启动都遵循下面的流程:而该流程中的reset,initboot,call selectbootmode, read i/o state, call boot loader这些步骤都是固化在芯片内的程序自己执行的,也就是说这些代码在出厂的时候已经在TI的芯片内。
(我们写的程序是从codestart出开始的,其代码在DSP2833x_CodeStartBranch.asm 内,其指定位置在CMD文件内定义。
下载到flash中时是在0x3f7ff6处,因为复位的时候指向的0x3fffc0,先执行固化的bootloader再跳转到0x3f7ff6。
下载到RAM中时是在0处。
因为不需执行bootloader。
)在28335中是一段的8k*16的read-only的memory,地址位于0x3fe000-0x3fffff,见下图:根据上面的流程图,详细的解释一下流程:1.在3fffc0到3fffff其实是放了中断向量表的地方:系统一开机当然是处于reset中断,因此直接跳至reset的地方执行(0x3fffc0)。
而这个地方的两个字节只是放了一条指令,就是跳至initboot函数,也就是3ff34c的地址执行bootloader。
.reset 与reset是不同的,一个在memory,一个在sections中。
.reset只包含一个32位的中断矢量,指向实时支持库rts2800_ml.lib 中的C编译器导引函数,即_c_int00子程序。
通常我们不用此块,而是另外创建分支指令指向开始代码。
如4中介绍。
2.在3ff34c的bootloader的程序,这里主要有initboot, 和SelectBootMode, 以及一些外设引导的函数。
SeleteBootMode根据芯片的硬件或软件设置来判断芯片该去哪里寻找程序入口,直接目的是如何找到main,然后执行应用程序。
28335使用串口烧写程序串口烧写是一种相对较方便的烧写方式,相对于仿真器或是CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大批量的场合。
F28335的存储器映射图如下:BOOTROM 是一块8K X 16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以及定点和浮点数据表,片上BOOTROM的存储映射如下图所示:1.内BOOT ROM数学表:在BOOT ROM中保留了4K X 16位空间,用以存放浮点和IQ数据公式表,这些数据公式表有助于改善性能和节省SARAM空间。
2.CPU向量表:CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。
复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。
在内部BOOT ROM引导区中能够调用的唯一向量就是位于0x3FFFC0的复位向量。
复位向量在出厂时被烧录为直接指向存储在BOOT ROM空间中的InitBoot函数,该函数用于开启引导过程。
然后通过通用I/O引脚上的检验判断,决定具体引导模式。
引导模式与控制引脚之间的关系如下图所示:Bootloader特性:Bootloader是位于片上引导ROM中的在复位后执行的程序,用于在上电复位后,将程序代码从外部源转移到内部存储器。
这允许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到高速存储器中执行。
引导ROM中的复位向量将程序执行重定向至InitBoot函数。
执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。
这些选项包括:跳转至闪存、跳转至SARAM、跳转至OTP或调用其中一个片上引导加载例程。
完成选择进程后,如果已完成所需的引导加载,处理器将在所选引导模式确定的应用起点继续执行。
28335使用串口烧写程序
串口烧写是一种相对较方便的烧写方式,相对于仿真器或是
CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大
批量的场合。
F28335的存储器映射图如下:
BOOTROM 是一块8K X 16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以
的存储映射如下图所示:
及定点和浮点数据表,片上BOOTROM
1.内BOOT ROM数学表:
在BOOT ROM中保留了4K X 16位空间,用以存放浮点和IQ数据公式表,这些数据公式表有助于改善性能和节省SARAM空间。
向量表:
CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。
复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。
在内部BOOT ROM引导区中能够调用的唯一向量就是位于0x3FFFC0的复位向量。
复位向量在出厂时被烧录为直接指向存储在BOOT ROM 空间中的InitBoot函数,该函数用于开启引导过程。
然后通过通用
I/O引脚上的检验判断,决定具体引导模式。
引导模式与控制引脚
之间的关系如下图所示:
Bootloader特性:
Bootloader是位于片上引导ROM中的在复位后执行的程序,
用于在上电复位后,将程序代码从外部源转移到内部存储器。
这允
许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到
高速存储器中执行。
引导ROM中的复位向量将程序执行重定向至InitBoot函数。
执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。
这些选项包括:跳转至闪存、跳转至SARAM、跳转至OTP或调用其中一个片上引导加载例程。
完成选择进程后,如果已完成所需的引导加载,处理器将在所
选引导模式确定的应用起点继续执行。
如果调用了bootloader,则由外设加载的输入流确定此应用起点地址。
然而,如果选择直接引
导至闪存、OTP或SARAM,这些存储器块中每一个存储器块的应用起
点均已预定义。
上图显示了引导进程的概述。
以下引导模式不掉用bootloader,他们会跳转至存储器中的预定义位置:
1.跳转至闪存中的分支指令:
在此模式下,引导ROM软件将针对28x操作配置器件,然后直接分支至闪存的0x33FFF6位置。
此位置刚好是128位代码安全模块(CSM)密码位置之前。
您需要预先在0x33FFF6位置处编写分支指令,以将代码执行重定向至定制的boot-loader或应用代码。
在仅有RAM的器件上,“引导至闪存”将跳转到保留存储器,因此不应当使用此选项。
2.跳转至M0 SARAM
在此模式下,BOOT ROM将针对28x操作配置器件,然后直接分支至0x000000,即M0 SARAM存储器块中的第一个地址。
3.跳转至OTP存储器
在此模式下直接分支至0x380400,即OTP存储器块中的第一个地址
以下引导模式将调用一个用于将数据流从外设加载至存储器的引导
加载例程:
SCI-A(注意此处的SCI-A对应的是GPIO28和GPIO29)
SPI-A
I2C-A
eCAN-A
GPIO0-GPIO15并行引导。
如果使用SCI或者其他引导的话,首先需要将启动模式选择相
关的引脚配置成对应的模式,然后器件退出复位状态之后,首先从
复位向量处开始运行,即从0x3FFFC0处,该地址存放着BOOT ROM 中的第一个汇编初始引导程序InitBoot程序的入口地址,程序跳转
至0x3FFC00执行InitBoot程序。
该程序主要初始化F28335器件工
作的目标模式。
然后读取安全保护模块的密码,如果CSM密码被擦
除(全部等于0xFFFF)则自动解锁,否则CSM仍被锁定。
对CSM密码读取完成后,初始化例程调用模式选择功能函数(SelectBoot),该函数根据GPIO的状态确定处理器引导的方式。
一旦完成SelectMode将会把入口地址返回给初始化引导。
然后初始
化引导函数调用回复CPU寄存器的退出例程(ExitBoot)并退出到
由引导模式确定的程序入口地址。
因此我们在使用SCI升级程序时可以分两个步骤,第一个步骤
是我们需要一个Bootloader程序,第二个就是我们要升级的程序,BootLoader程序就是我们在选择引导SCI模式之后,SelectBoot之后通过串口加载的第一个程序,待ExitBoot之后会跳转到我们这个bootloader指定的地址开始执行(即将控制权交给我们的这个BootLoader程序),因此我们的BootLoader程序就肩负着串口接
收我们的应用程序并将应用程序烧写到FLASH的任务。
第二个就是
我们的应用程序,这个跟平常的应用程序一样,没有任何区别。
1.BootLoader程序
由上面的介绍明显知道我们的Bootloader程序是运行在RAM 里面的,所以使用CCS在编写该程序的时候使用的是RAM_Link的CMD,而且该程序除了串口的处理还有包括FLASH操作的API函数,
而这些函数必须要运行在RAM里面,而且在进行FLASH操作的时候
要将中断全部都关掉,FLASH的API有相关的例程是烧进FLASH的还要拷贝到RAM,我们这里正好还免去了拷贝的过程,因为我们整
个程序都是运行在RAM中的。
Bootloader数据流的结构:
上图就是BootLoader数据流的结构,数据流的第一个16位字称为键值,该键值用来指向Bootloader指示流入的数据流的宽度:8位或16位(在这里SCI就是8位),对于8位数据流,键值为0x08AA,如果bootloader收到一个无效的键值,加载则中止。
则直接跳转到FLASH开始执行。
接下来的8个字(2-9)用于初始化寄存器直,如果bootloader不使用这些值,则将这些值留作将来使用。
第10个和第11个字组成了22位应用起点地址,此地址用于在完成引导加载后初始化PC,也就是我们程序的起点。
第12个字表示传输的第一个数据块的大小。
对于8位和16位数据流格式,该数据块的大小均定义为块中的16位字个数,例如,
要从8位数据流中传输一个包含20个8位数据值的数据块,该块大
小将为0x000A,表示有10个16位字。
第13和14个字表示程序的目的地址,后面跟的就是程序的字,直到遇到数据块长度为0的则传输结束。
上图为BOOTLoader传输流程,如果不相等会自动退出引导程序,系统会从内部FLASH存储器执行程序。
这里需要讲一下,我们的Bootloader数据流如何得到,我们
正常的使用CCS编译链接得到了文件,然后使用–boot
–sci8 --map= -o -i (详细解释可参考TMS320C28x-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’ && l<=’9’)
l=l-‘0’;
else if(l>=’a’ && l<=’f’)
l=l-‘a’+0xa;
else if(l>=’A’ && l<=’F’)
l=l-‘A’+0xa;
if(h>=’0’ && h<=’9’)
h=h-‘0’;
else if(h>=’a’ && h<=’f’)
h=h-‘a’+0xa;
else if(h>=’A’ && h<=’F’)
h=h-‘A’+0xa;
*pByte=(BYTE)h*16 + 1;
}
解析的关键代码:
If(fopen_s(&myFile,filename,”r”) != 0)
{
Printf(“打开文件%s失败!”,filename);
}
while(!feof(myFile))
{
++len;
fgetc(myFile);
}ut文件生成hex文件的目录下,通过命令行执行如下命令:即可生成hex文件。
在按照上图所示根据自己实际情况配置完成后,我们要将我们板子DSP的启动方式更改为SCI-A启动方式,然后才能进行烧写。
烧写成功如上图所示。
在烧写完成之后,将拨码开关重新切换
至FLASH启动方式,重新启动DSP,这时可以观察程序的运行情况。