This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好,再次
对于我的项目、我将使用(编译的)闪存库
-使用标题" Flash2806X_API_Library.h"、
和 lib 文件:Flash2806X_API_wFPU_Library.lib
该库与复制到 RAM 的 SW API 一起使用。
只要写入,一切都可以正常工作--即成功写入已擦除的闪存。
调用 Flash_Eras()时出现问题:函数不返回,此外,
我发现目标经过了复位(看门狗肯定关闭)。
有没有人知道会发生什么错误? 由于库是预编译的、因此我无法检查任何内容...
此致、
Goetz
尊敬的 Kevin:
从汇编显示中可以看到、所有库代码都从 RAM 运行。
对库函数(Flash_Program()、Flash_Eras())的所有调用都在"EDIS"之前,后跟"EINT"。 总之、只有这样
程序中的一个有效中断:CPU 定时器2中断。
我发现,即使中断处于活动 状态,Flash_Program()也能正常运行;Flash_Eras()在任何情况下都不运行,即不返回。
稍后停止调试器会发现程序执行刚刚开始...
因为我必须修改链接器命令文件(否则、没有足够的内存用于 RAM 函数) 、所以我发送它
通过这篇文章——也许有些问题(我还不熟悉 TI 的 IDE……)。
谨致问候、
Goetz
注意:2月22日星期五、我不会在这里、我将在星期一回来...
========================================================================================================================================================
由于"插入文件"不起作用、我将其粘贴在此处:
========================================================================================================================================================
存储器
{
第0页: /*程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
PRAML1 :origin = 0x008800,length = 0x000400 //片上 RAM 块 L1 */
OTP :origin = 0x3D7800,length = 0x000400 //片上 OTP */
FLASHD :origin = 0x3E8000、length = 0x004000 //片上闪存*/
FLASHC :origin = 0x3EC000,length = 0x004000 //片上闪存*/
FLASHA :origin = 0x3F4000,length = 0x003F80 //片上闪存*/
csm_RSVD :origin = 0x3F7F80,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin :origin = 0x3F7FF6,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL_PROG:origin = 0x3F7FF8、length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
RAML4 :origin = 0x00A000、length = 0x002000 //片上 RAM 块 L4 */
FPUTABLES :origin = 0x3FD860,length = 0x0006A0 //引导 ROM 中的 FPU 表*/
IQTABLES :origin = 0x3FDF00,length = 0x000B50 //引导 ROM 中的 IQMath 表*
IQTABLES2 :origin = 0x3FEA50,length = 0x00008C //引导 ROM 中的 IQMath 表*
IQTABLES3 :origin = 0x3FEADC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/
ROM :origin = 0x3FF3B0,length = 0x000C10 //引导 ROM */
复位 :origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分 */
向量 :origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分 */
第1页:/* 数据存储器*/
/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页 中*/
BOOT_RSVD :origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
RAMM0 :origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
RAMM1 :origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
DRAML0 :origin = 0x008000、length = 0x000800 //片上 RAM 块 L0 */
RAML2 :origin = 0x008C00,length = 0x000400 //片上 RAM 块 L2 */
RAML3 :origin = 0x009000,length = 0x001000 //片上 RAM 块 L3 */
// RAML4 :origin = 0x00A000,length = 0x002000 //片上 RAM 块 L4 */
RAML5 :origin = 0x00C000、length = 0x002000 //片上 RAM 块 L5 */
RAML6 :origin = 0x00E000、length = 0x002000 //片上 RAM 块 L6 */
RAML7 :origin = 0x010000、length = 0x002000 //片上 RAM 块 L7 */
RAML8 :origin = 0x012000,length = 0x002000 //片上 RAM 块 L8 */
FLASHB :origin = 0x3F0000,length = 0x004000 //片上闪存*/
}
/*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*
部分
{
/*分配计划领域:*/
/*闪存 API 函数可以按如下所示组合在一起。
定义的符号_Flash28_API_LoadStart、_Flash28_API_LoadEnd
和_Flash28_API_RunStart 用于将 API 函数复制出
闪存存储器的内存空间、并加至 SARAM */
/ /
//对于 Piccolo,我们不需要从闪存复制 API,因为它是*/
引导 ROM 中存在/* *
/ /
Flash28_API://仅适用于 API 不在 BootROM 中的情况
{
-lFlash2806x_API_wFPU_Library.lib (.econst)
-lFlash2806x_API_wFPU_Library.lib (.text)
} 负载= FLASHD
// 运行= PRAML1,
运行= RAML4、
Load_start (_Flash28_API_LoadStart)、
Load_End (_Flash28_API_LoadEnd)、
RUN_START (_Flash28_API_RunStart)、
PAGE = 0
// 页= 1.
.cinit :> FLASHA PAGE = 0
.pinit :> FLASHA, page = 0
.text :> FLASHA PAGE = 0
codestart :> begin page = 0
ramfuncs :load = FLASHA,
// 运行= PRAML1,
运行= RAML4、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0
// 页= 1.
csmpasswds :>csm_PWL_PROG page = 0
csm_rsvd :>csm_RSVD page = 0
/*分配未初始化的数据段:*/
.stack :>RAMM0 page = 1.
.ebss :> RAML3 PAGE = 1.
.esysmem :>DRAML0 page = 1.
/*初始化段进入闪存*/
/*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
econst :> FLASHA PAGE = 0
.switch :> FLASHA PAGE = 0
/*分配 IQ 数学区域:*/
IQMath :> FLASHA page = 0 /*数学代码*/
IQmathTables :>IQTABLES, PAGE = 0,TYPE = NOLOAD
/*分配 FPU 数学区域:*/
FPUmathTables :> FPUTABLES, PAGE = 0,TYPE = NOLOAD
/*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables2 :> IQTABLES2,PAGE = 0,TYPE = NOLOAD
{
IQMath.lib (IQmathTablesRam)
}
*
/*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables3 :> IQTABLES3,PAGE = 0,TYPE = NOLOAD
{
IQMath.lib (IQmathTablesRam)
}
*
/*.reset 是编译器使用的标准段。 它包含*/
/* C 代码_c_int00起始地址。 /*
/*当使用引导 ROM 时,此部分和 CPU 矢量*/
/*不需要表。 因此、默认类型设置为 */
/* DSECT */
.reset :> reset, page = 0,type = DSECT
VECTORS :> VECTORS PAGE = 0,TYPE = DSECT
}