好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

TMS320F28xxDSP中内部Flash的应用研究.doc

12页
  • 卖家[上传人]:枫**
  • 文档编号:480758557
  • 上传时间:2023-09-24
  • 文档格式:DOC
  • 文档大小:82.50KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • TMS320F28xx DSP 中内部 Flash 的应用研究专业知识 2021-07-05 22:22 阅读 14 评论 0 字号: 大大 中中 小小 1 前言TMS320F28xx DSP片内有128 KX 16 bit字的 Flash、两块 4 K x16bit字的单周期访问 RAM(SARAM)LO 和 L1 、 一块 8 Kxl6 bit 字的单周期访问 RAM(SARAM)HO 、 两块 1 Kxl6 bit字的单周期访问 RAM(SARAM)M0 和 M1 由于存储器种类多、 容量大, 所以从系统的高度来配置各个存储器必须有适宜的方法,而这些方法一般都与片内 Flash 有关另外,TMS320F28xx DSP 片内有看门狗定时器模块 (WDT) 、引导 ROM(ROM bootloader) 模块、代码平安模块(CSM),要合理地使用这些模块为整个系统效劳,必定也要用到 Flash由此可以看出, Flash 的地位和作用比拟显著.所以本文就 Flash 的几种用法作了研究2 从 Flash 拷贝段到 RAM2. 1 拷贝中断向量在TMS320F28xx器件中,外设扩展中断(PIE)模块管理中断请求。

      上电时,所有中断向量必 须位于非易失性存储器(如Flash)中,但是要把中断向量拷贝到 PIEVECT RAM中,这是用户代码中器件初始化程序的一局部 PIEVECT RAM 是一个特定的 RAM 块,它在当前TMS320F28xx器件中是一个 256X 16的块.在数据空间中的起始地址为 Ox000D00把中断向量连接到 Flash,然后在运行时把中断向量拷贝到 PIEVECT RAM中,有许多方法可以实现一个方法是创立包含函数指针的常量 C 结构体,该结构体包括 128 个 32-bit 向量如果使用 DSP281x或者DSP280x夕卜设的结构体.这个结构体叫做 PieVectTableInit,它已经在 DSP281x_PieVect. c 或者 DSP280x_PieVect.c 创立 (参看 TI 提供的例程 )因为这个结构体使用const类型关键词,所以它将会被编译器放置在 .econst段中运行时只需要把这个结构体拷贝到 PIEVECT RAM 中 C 编译器运行时支持库包含名为 memcpy 的存储器拷贝函数,该函数可以被用来完成拷贝任务,其用法如下所示:#includevoid main() {//Initialize the pie_ramPieCtrlRegs.PIECTRL.bit.ENPIE=0;//disable the PIEasm(" EALLOW"); //enable the eallow protected register accessmemcpy((void*)0x00D00,&PieVectTableInit,256);asm("EDIS"); //disable the eallow protected register access以上这个例子为 PIE RAM 起始地址使用的硬编码地址 (hard coded address),明确指定为0x000D00。

      但是硬编码地址并不是较好的编程方式, 用户可以使用 DATA_SECTION 指令创建一个非初始化的假变量 (dummy variable) ,并把这个变量连接到 PIE RAM .然后用这个假变量的名字来代替硬编码地址例如,当使用 DSP281x 或者 DSP280x 外设结构体时,创立一个名为 PieVectTable 的非初始化结构体,并把该结构体连接到 PIEVECT RAM 前面例子中的memcpy()函数可以被替换为:memcpy(&PieVectTable,&PieVectTableInit , 256);注意拷贝长度是 256 个 16-bit 字.对应为 128 个 32-bit 字2. 2 初始化 Flash 控制存放器Flash 控制存放器 FOPT、 FPWR、 : FSTDBY-WAIT 、 FACTIVEWAIT 、 FBANKWAIT 、FOTPWAIT 的初始化代码不能从 Flash 存储器当中运行.否那么就会有不可预料的结果出现所以,Flash控制存放器的初始化函数在运行时必须从 Flash(它的装载地址)拷贝到RAM(它的运行地址 )Flash 控制存放器由 Code Security Module(CSM) 保护。

      如果 CSM 被保护起来了,那么必须从被保护的 RAM( 例如: L0 或者 L1 SARAM) 运行 Flash 控制存放器的初始化代码, 否那么 Flash控制存放器的初始化代码无法访问 Flash 控制存放器 要注意的是, 当器件复位的时候 CSM一般都是被保护起来的,虽然使用假密码 0xFFFF 时 ROM BOOTLOAD-ER 会把它解锁C 编译器的 CODE_SECTION 指令可以用来为 Flash 控制存放器的初始化函数创立独立的可连接段例如:假定 Flash 控制存放器的配置在 C 函数 InitFlash() 中实现,并且想把这个函数放置在名为secureRamFuncs的可连接段当中以下的C代码例程显示了 CODE_SECTION命令在 Flash 存储器配置中的正确用法:#pragma CODE_SECTION(InitFlash, 〞〞 secureRamFuncs)void InitFlash(void){asm("EALLOW");//Enable EALLOW protected register asscessFlashRegs.FPWR.bit.PWR=3;//Flash set to active modeFlashRegs.FSTATUS.bit.V3STA T=1;//Clear the 3VSTAT bitFlashRegs.FSTDBYWAIT.bit.STDYYW AIT=0x01FF;//Sleep to standy cyclesFlashRegs.FACTIVEW AIT.bit.ACITIVEW AIT=0x01FF;//Standby to active cyclesFlashRegs.FBANKWAIT.bit.RANDW AIT=3;//F280x Random access wait statesFlashRegs.FBANKWAIT.bit.PAGEW AIT=3;//F280x Paged access wait statesFlashRegs.FOTPWAIT.bit.OTPW AIT=5;//F280x OTP wait statesFlashRegs.FOTP.bit.ENPIPE=1;//Enable the Flash pipelineasm("EDIS");//Disable EALLOW protected register accessasm("RTP #6 || NOP");//end of InitFlash()secureRamFuncs段可以使用用户连接命令文件 ( d)进行连接。

      这个段需要独立的装载和运行地址另外, 还想让连接器生成一些全局符号, 这些全局符号可以用来决定装载地址、运行地址、 段长度 在实现把这个段从装载地址拷贝到它的运行地址时需要这些信息 用户连接命令文件如下所示:**User's linker command fileSETIONS{secureRamFuncs:LOAD=FLASH,PAGE=0RUN=SECURE_RAM,PAGE=0RUN_START(_secureRamFuncs_runstart),LOAD_START(_secureRamFuncs_loadstart),LOAD_END(_secureRamFuncs_loadend)}在这个例子中,假定存储器 Flash 和 SECURE_RAM 都已经在用户连接命令文件中的MEMORY 段中定义这些存储器的 PAGE 标识符要与它们的存储器定义相匹配在上面的例程中假定两个存储空间都已经在 PAGE 0(程序存储空间 )中声明过了 RUN_START 、LOAD_START 、 LOAD_END 指令将生成全局符号, 这些全局符号有特定的名称,对应着相应的地址最后,这个段必须在运行时从 Flash 拷贝到 RAM ,可以用到编译器运行支持库里面的函数 memcpy()。

      User's C_source file#includeextern unsigned int secureRamFuncs_loadstart;extern unsigned int secureRamFuncs_loadend;extern unsigned int secureRamFuncs_runstart;void main(void){memcpy(&secureRamFuncs_runstart&secureRamFuncs_loadstart&secureRamFuncs_loadend-&secureRamFuncs_loadstart);InitFlash();}2 . 3 性能最优化常数是那些用 C 语言的 const 类型关键词声明的数据结构编译器把所有的常数放置在.econst段中(假定为大存储模式)当前TMS320F28xx器件上的特殊管道(special pipelining)提高 Flash 上运行代码的性能时.每次访问位于片上 Flash 中的数据常数会占用许多周期特别是在 150 MHz TMS320F281x DSP 上 Flash 等待状态要到达 5 个周期. 100 MHzTMS320F280x DSP 到达 3 个周期。

      所以,访问片上 RAM 中的常数与常数表那么成为沉重的负担然而,分立式嵌入式系统要求所有的初始化数据 (如常数 )最初都是位于非易失性存储器中, 所以 ,必须为想访问的 RAM 中的常数建立独立的装载和运行地址. 在运行时把这些常数从片上 Flash 中拷贝到 RAM 中这里介绍两种不同的实现方法方法一:在 RAM 中运行所有的常数阵列这种方法是为整个.econst段指定独立的装载和运行地址其好处是容易使用,而害处是RAM的使用量非常大 (可能只有少量常数需要快速访问,但是用这种方法所有的常数都位于RAM) 在用户连接命令文件中简单地为整个 .econst 段指定独立的装载和运行地址,然后在运行时通过拷贝整个.econst段的方式往工程中添加代码例如://User's linker command fileSECTIONS.econst: LOAD=Flash, PAGE=0RUN=RAM,PAGE=1RUN_STAR(_econst_runstart),LOAD_START(_econst_loadstart),LOAD_END(_econst_loadend)//User's C-source file#include extern unsigned int secureRamFuncs_loadstart;extern unsigned int secureRamFuncs_loadend;extern unsigned int s。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.