完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想在tms570ls3137芯片通过EMIF接口接片外PROM,如何将代码启动。程序在片外PROM中使用,不使用片内FLASH.谢谢
|
|
相关推荐
11 个讨论
|
|
您好,
看到您在E2E上面也咨询了该问题。 e2e.ti.com/.../167683.aspx 我觉得KGreb的回答能够解决您的问题。 不知道您现在具体的问题是什么呢? 能否再描述得详细一点?是如何使用linker吗? 另外,Brian Fortman的建议也非常重要: TMS570系列针对安全性能要求较高的系统设计的高可靠性微控制器,其内部flash和RAM都具有ECC功能。能够检测数据的错误,避免误操作的发生。但是您如果把代码放在外部存储器,那么相当于放弃了内部flash的ECC功能,可能会增加系统安全性风险。 所以也请您考虑是否真的需要使用外部存储器。 |
|
|
|
|
|
cz0519博睿康 发表于 2020-5-28 15:36 Zhangjie, 您好, 是的,您可以把初始化程序放在内部Flash中运行,主程序放在片外运行。 跳转的方式就是简单的函数调用即可。 关键是您对linker的操作,要把所有您需要放在外部存储器的内容(代码和数据)都映射到相应的位置。 这个具体方法您可以参考下面链接中的文档: 该文档中的举例如下: 如果您使用CCS作为编译环境,CMD文件如下: /****************************************************************************/ /*** Specify the Memory Configurations ***/ /****************************************************************************/ MEMORY [ FAST_MEM : org = 0x00000000 len = 0x00001000 /* PROGRAM MEMORY (ROM) */ SLOW_MEM : org = 0x00001000 len = 0x00001000 /* DATA MEMORY (RAM) */ PROM : org = 0x08000000 len = 0x00000400 /* COEFFICIENTS (PROM), 即您的外部存储器, 您需设置好相应的地址*/ ] /****************************************************************************/ SECTIONS [ .text : [] > FAST_MEM /* Link all .text sections into ROM */ .intvecs : [] > 0x0 /* Link interrupt vectors at 0x0 */ .data : /* Link .data sections */ [ tables.obj(.data) . = 0x400; /* Create hole at end of block */ ] = 0xFF00FF00 > PROM /* Fill and link into PROM,这里只是把所谓的table.obj链接到外部存储器了,如果您需要把代码放在这边的话,也可以使用类似方法。*/ ctrl_vars: /* Create new sections for ctrl variables */ [ ctrl.obj(.bss) ] = 0x00000100 > SLOW_MEM /* Fill with 0x100 and link into RAM */ .bss : [] > SLOW_MEM /* Link remaining .bss sections into RAM */ ] /****************************************************************************/ /*** End of Command File ***/ /****************************************************************************/ 关于ECC,是Error Correction Code的缩写。 TMS570LS3137支持单bit修正和双bit检测(SECDED)。 这个功能需要用户代码来使能,您可以查看TMS570LS3137数据手册中的4.10.3 ECC Protection for Flash Accesses一节。 数据手册:www.ti.com/.../tms570ls3137.pdf 另外,您也可以使用HALCoGen驱动代码生成工具。 下载地址: www.ti.com/.../halcogen |
|
|
|
|
|
cz0519博睿康 发表于 2020-5-28 15:36 Zhangjie, 您好, 是的,您可以把初始化程序放在内部Flash中运行,主程序放在片外运行。 跳转的方式就是简单的函数调用即可。 关键是您对linker的操作,要把所有您需要放在外部存储器的内容(代码和数据)都映射到相应的位置。 这个具体方法您可以参考下面链接中的文档: 该文档中的举例如下: 如果您使用CCS作为编译环境,CMD文件如下: /****************************************************************************/ /*** Specify the Memory Configurations ***/ /****************************************************************************/ MEMORY [ FAST_MEM : org = 0x00000000 len = 0x00001000 /* PROGRAM MEMORY (ROM) */ SLOW_MEM : org = 0x00001000 len = 0x00001000 /* DATA MEMORY (RAM) */ PROM : org = 0x08000000 len = 0x00000400 /* COEFFICIENTS (PROM), 即您的外部存储器, 您需设置好相应的地址*/ ] /****************************************************************************/ SECTIONS [ .text : [] > FAST_MEM /* Link all .text sections into ROM */ .intvecs : [] > 0x0 /* Link interrupt vectors at 0x0 */ .data : /* Link .data sections */ [ tables.obj(.data) . = 0x400; /* Create hole at end of block */ ] = 0xFF00FF00 > PROM /* Fill and link into PROM,这里只是把所谓的table.obj链接到外部存储器了,如果您需要把代码放在这边的话,也可以使用类似方法。*/ ctrl_vars: /* Create new sections for ctrl variables */ [ ctrl.obj(.bss) ] = 0x00000100 > SLOW_MEM /* Fill with 0x100 and link into RAM */ .bss : [] > SLOW_MEM /* Link remaining .bss sections into RAM */ ] /****************************************************************************/ /*** End of Command File ***/ /****************************************************************************/ 关于ECC,是Error Correction Code的缩写。 TMS570LS3137支持单bit修正和双bit检测(SECDED)。 这个功能需要用户代码来使能,您可以查看TMS570LS3137数据手册中的4.10.3 ECC Protection for Flash Accesses一节。 数据手册:www.ti.com/.../tms570ls3137.pdf 另外,您也可以使用HALCoGen驱动代码生成工具。 下载地址: www.ti.com/.../halcogen |
|
|
|
|
|
我使用的是KEIL编译环境,使用halcogen代码生成工具,导入到keil4中的。其中CMD文件 为 /*----------------------------------------------------------------------------*/ /* sys_link.cmd */ /* */ /* (c) Texas Instruments 2009-2010, All rights reserved. */ /* */ FLASH 0x00000000 0x00200000 [ VECTORS 0x00000000 0x00000020 [ *.o (intvecs, +First) ] FLASH0 0x00000020 0x0017FFE0 [ *.o (reset, +First) *(InRoot$$Sections) .ANY3 (+RO) ] FLASH1 0x00180000 0x00180000 [ .ANY2 (+RO) ] ARM_LIB_STACK 0x08000000 EMPTY 0x00001500 [ ] RAM 0x08001500 0x00026B00 [ .ANY (+RW +ZI) ] ] /*----------------------------------------------------------------------------*/ 如果我想讲main函数开始的程序放置入片外程序存储器(地址为0x60000000),我如何更 改CMD文件。谢谢!还有就是ECC功能是只要启动就可以了吗? |
|
|
|
|
|
cz0519博睿康 发表于 2020-5-28 16:22 Zhangjie, 您好, 抱歉,KEIL不是很熟悉。下面是使用CCS的操作方法,不过各家编译环境大同小异。 (这是个比较简单的办法,如果您需要高级操作,可以查看KEIL的编译器/连接器文档。) 1. 定义外部存储单元。 /*----------------------------------------------------------------------------*/ /* Memory Map */ MEMORY [ VECTORS (X) : origin=0x00000000 length=0x00000020 FLASH0 (RX) : origin=0x00000020 length=0x0007FFE0 FLASH1 (RX) : origin=0x00080000 length=0x00080000 FLASH2 (RX) : origin=0x00100000 length=0x00080000 FLASH3 (RX) : origin=0x00180000 length=0x00080000 EXTFLASH (RX) : origin=0x60000000 length=0x00080000 STACKS (RW) : origin=0x08000000 length=0x00001500 RAM (RW) : origin=0x08001500 length=0x00026B00 ] 2. 定义代码段".application"在外部存储器中。代码段的名字您可以自己定义 SECTIONS [ .intvecs : [] > VECTORS .text : [] > FLASH0 | FLASH1 | FLASH2 | FLASH3 .application : [] > EXTFLASH .const : [] > FLASH0 | FLASH1 | FLASH2 | FLASH3 .cinit : [] > FLASH0 | FLASH1 | FLASH2 | FLASH3 .pinit : [] > FLASH0 | FLASH1 | FLASH2 | FLASH3 .bss : [] > RAM .data : [] > RAM ] 3. 在源文件中定义需要放在.application section中的函数,比如需要把main()放在这个section中的话: #pragma CODE_SECTION(main, ".application") void main(void) [ /* USER CODE BEGIN (3) */ while(1); /* USER CODE END */ ] 预编译语句#pragma CODE_SECTION是编译器相关的,也就是说在KEIL中的写法和用法可能稍有不同,但是大同小异。 一般都是放在函数定义的前面的。也有直接将整个.obj指定在某个section的操作办法,具体请参考您使用的环境的手册。 关于ECC,我们在TMS570LS3137中提供的是SECDED机制,也就是说,出现单bit错误时,ECC会直接将错误更正,并记录总的更正次数。 您可以设置一个阈值,超过一定次数,ECC就会产生中断来通知系统。当双bit或更多错误发生时,ECC的编码机制无法自动完成修复,但ECC可以探知问题存在并发出中断来通知系统。 所以具体如何使用这些安全功能跟您的系统设计息息相关,硬件本身只能提供最基础的帮助。 |
|
|
|
|
|
testd27 发表于 2020-5-28 16:32 我使用类似方法在KEIL环境下试了一下,我将前20个字节和emif的初始化放置于FLASH中,其余程序放在片外rom中,我使用的ROM是at28bv256,程序可以跳转了,跳到0x60000000地址运行后,程序最终停止在 0x00000004 未定义的入口处,也就是说程序运行不正常,不知道对于芯片内部寄存器及堆栈的初始化可否放置于片外运行?谢谢! |
|
|
|
|
|
cz0519博睿康 发表于 2020-5-28 16:40 Hi Zhangjie, 不是很清楚您说前20个字节的含义... 不过正常情况下,MCU上电后应该进行一些必要的初始化程序。这个过程一般叫做Boot Strap. 以我们的HALCoGen生成的代码为例的话,Boot Strap主要完成了下面的工作: 1. 初始化堆栈指针 2. 初始化内部Flash, 时钟树,清除RAM 3. 为有初值的全局变量赋值,或有需要在RAM上运行的代码进行copy 4. 跳转至用户程序,一般是main(); 不知道这些操作您的程序是否完成了? 在您的应用里,EMIF的初始化部分是一定要放在内部flash中完成的,这一点没错。 另外,您说可以跳转至0x60000000,不知道是用什么样的调试方式,是否可以单步跟踪一下?看看是什么地方使程序跳回0x00000004了? |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
669 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
597 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1048 浏览 1 评论
731 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
520 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
158浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
120浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
123浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
122浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
163浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 16:49 , Processed in 1.357399 second(s), Total 88, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号