关于程序从flash搬运到RAM运行
一般而言,程序在RAM中运行的时间要远快与FLASH中运行时间,如F28335在Flash里运行程序如果是最高系统时钟150MHz时需要5个等待周期,而在RAM中运行程序是零等待周期的,这也是很多用户提到程序在线仿真一切正常,但是烧写到flash运行就不正常的原因。
在应用中为了提高关键代码的执行速度,可以将Flash中的对应代码搬移到RAM中执行。具体的实现一般分为3步:
在cmd文件中声明ramfuncs地址空间,包括代码在Load(下载)和Run(执行)时所分别对应的Flash和RAM地址;
定义代码搬移函数,MemCopy():其主要功能为将Flash所对应的代码搬移至RAM;
在main.c中首先声明需要搬移的函数,声明三个外部变量,执行MemCopy(),将对应的函数搬移至RAM中;
在工程中添加以上的操作,便可以正常调用相关函数,该函数会自动跳转至RAM中运行。
补充:
为了有效地提升代码执行速率,建议只将部分关键代码搬移至RAM中运行,没有必要将main()主函数的全部代码搬移至RAM。
另外,以我目前所知的,如果程序中有用到FLASH API和delay_us()函数的,这部分代码必须copy到RAM运行。其中FLASH API是有规定:
Flash API execution is interruptible; however, there should not be any read or fetch access from the Flash bank/OTP when an erase or program operation is in progress. Therefore, the Flash API functions, the user application functions that call the Flash API functions, and any ISRs (Interrupt service routines,) must be executed from RAM. For example, the entire code snippet shown below should be executed from RAM and not just the Flash API functions. The reason for this is because the Fapi_issueAsyncCommandWithAddress() function issues the erase command to the FSM, but it does not wait until the erase operation is over. As long as the FSM is busy with the current operation, there should not be a Flash access.
而delay_us()函数如果没有copy到RAM这一步的话通常会进入非法中断。
例程参考:C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\flash_f28335
文档参考:http://www.ti.com/lit/an/spraau8a/spraau8a.pdf
关于程序串口升级
以F28335为例,介绍如何通过SCI串口进行在线程序升级。
跳线,以28335 controlcard为例。
需要先用跳线将芯片的boot模式设置为SCI-A启动(设置boot模式,即配置boot引脚对应GPIO口的电平)。
注:如果使用TI开发板做此实验,一般开发板上都会留有控制boot引脚的开关,查询一下对应开发板的user’s guide可以找到开关位置并进行设置就可以了,不需要跳线。
设置完boot模式后将SCI引脚连接至PC端(或上位机),如图:
下载codeskin的C2prog(http://www.codeskin.com/c2prog-download),安装打开,然后用CCS自带的HEX2000(C:\ti\ccs920\ccs\tools\compiler\ti-cgt-c2000_18.12.3.LTS\bin)将程序编译输出的.out文件转换为hex文件。高版本的CCS可以直接转换,转换方式如下图:
进行烧写:
可能出现问题的解决方案:
检查硬件看看用的是不是上面图中谈到的SCI引脚
串口烧写时也是可以用仿真器+CCS监视开发板的运行
有些RS-232转RS-485的接口工具并不能很好工作
最主要的,串口烧写是通过芯片内部的Bootloader来工作的,所以,当开发板连上串口,有正确跳线的时候,用串口调试助手向开发板发送下面的字符开发板应该会有返回信号
上面发送的41AA0800000000000000000000000000000000000000000800000000C011223344556677意思是
在0x0000c000写11223344556677。
更具体的,可以参考bootROM文档中的说明:
C2000芯片的加锁和解锁
由于部分企业需要对芯片内部的程序进行加密处理,C2000提供了两种加密方式:一种是在工程中添加DSP28***_CSMPasswords.asm,一种是直接在CCS的on-chip flash中修改密码。这里以F28335为例,详细描述两种方式的操作方法:
添加CSM加密文件的方法
该方法是直接使用controlSUITE中提供的DSP28***_CSMPasswords.asm文件,将此文件加入工程中,修改其中的密码,与其他文件一起编译烧写即可。文件内容如下:
.sect "csmpasswds"
.int 0xFFFF ;PWL0 (LSW of 128-bit password)
.int 0xFFFF ;PWL1
.int 0xFFFF ;PWL2
.int 0xFFFF ;PWL3
.int 0xFFFF ;PWL4
.int 0xFFFF ;PWL5
.int 0xFFFF ;PWL6
.int 0xFFFF ;PWL7 (MSW of 128-bit password
.sect "csm_rsvd"
.loop (3F7FF5h - 3F7F80h + 1)
.int 0x0000
.endloop
对应的CMD文件中地址分配情况:
MEMORY
{
…
CSM_RSVD : origin = 0x3F7F80, length = 0x000076
…
CSM_PWL : origin = 0x3F7FF8, length = 0x000008
…
}
SECTIONS
{
…
csmpasswds : > CSM_PWL PAGE = 0
…
csm_rsvd : > CSM_RSVD PAGE = 0
…
}
按照上面的方法编译好后,你的程序已经加密好了,最后编译生成.out文件一起写入Flash中。
On – chip flash加密法
这个方法比较简单,烧写完毕.out文件后,在debug界面点击Tools - On-Chip Flash,在弹出的窗口中下拉找到Code Security Password的Key 1~7位置填入你要加密的密码,然后点击Program Password再点击lock就加密了,相当于对密码区写入你上面.asm文件中的内容。
关于解密:
同样以F28335为例:
1、配置芯片的GPIO 84~87引脚的电平状态为1100(也有说只针对key4~key7加密,即只加密高64位密码,则可以不用修改boot模式,直接连接JTAG解密,但本人没有验证过),使芯片进入Branch to check boot mode模式(详情可参考芯片Datasheet第106页,6.1.9 Boot ROM )。如果是TI购买的F28335 controlCARD(以R2.2版本为例),那么把controlCARD上SW2开关的1~4分别配置为1100即可。
2、打开CCS,连接芯片和PC,上电。配置target configuration(View - Target Configuration),配置完成后Test Connection一下,测试成功后进入下一步。(本来以为直接点击debug就可以了,但实验了几次发现一定要做一下这个步骤才行,否则没办法进入debug模式)
3、点击小虫子图标进入debug模式,进入之后如果显示没有连接JTAG的话先点击Connect Target连接JTAG,然后点击Tools - On Chip Flash,在On Chip Flash中的Code Security Password – Key 0~7中输入正确的密码,然后点击Unlock。这样就解锁了,系统会提示:
C28xx: GEL Output:
ADC Calibration not complete, check if device is unlocked and recalibrate.C28xx: Flash Programmer: Warning: The configured device (TMS320F28335), does not match the detected device (). Flash Programming operations could be affected. Please consider modifying your target configuration file.
C28xx: Starting device unlocking...
C28xx: Device unlocked. To clear the programmed password, please erase Sector A of Flash memory.
解锁成功后你就可以正常使用芯片进行烧写flash了。
4、如果你希望不更换程序但需要彻底解锁芯片(以后启动都不需要输入密码解锁),那么按照上述系统提示的“To clear the programmed password, please erase Sector A of Flash memory.”操作。接着刚才的步骤,跳到On Chip Flash中的Erase Sector Selection,选择Sector A(默认是全选的),然后点击“Erase Flash”。这样就去掉密码了,系统会提示:
C28xx: Erasing Flash memory...
C28xx: GEL Output:
ADC Calibration not complete, check if device is unlocked and recalibrate.C28xx: Operation completed successfully.
或者也可以把Code Security Password - Key0~7全部改为F,默认就是不加密状态。
以上就完成了芯片的解锁和清除密码操作了。
加密注意事项:
将128-bit全部设为1意味着不加密,即所谓的”unsecure”。
将128-bit全部设为0意味着永久加密,此时芯片不可被解密,即无法再操作flash,也无法读取其中的程序和数据。一般情况下,不要进行此设置。
DSP烧写过程中如果密码区被写入密码、烧写过程中受到干扰、电源不稳定、时钟不稳定等等原因都会导致芯片锁死。以上情况即为意外上锁,即你不知道密码的情况下,几乎是没有办法解锁的,只能考虑更换芯片。
PS:
最新的28004x、2837x等芯片中增加了双代码安全模块(DCSM),该功能支持将芯片中的memory划为两个独立区域,并设置各自独立的的128位CSM密码。该功能可以阻止未授权人员访问加密内容,进而有效防止您的代码被重复或逆向编译;与此同时,需要维护与升级的代码可以存储于另一个独立区域内,并授权给相关人员使用。详细的可以参考这篇FAE分享的blog: