[求助]PE生成FLASH操作函数擦除不了FLASH(已解决)
本帖最后由 FSL_TICS_Robin 于 2014-11-27 11:01 编辑前几天刚用KL25官方板子实现IAP,也是用PE生成的FLASH函数,FLASH所有扇区都能擦除。现在把程序移植到KL16的工程板子上,用JLINK调试。我的FLASH分成三部分,1部分正常程序,2部分IAP程序,3部分做EEPROM,1和2由链接文件分配,3由FLASH函数直接操作,结果FLASH擦除函数只能擦除3,不能擦除1和2。搞了一天了,2个工程的配置都一样啊。是KL25和KL16的区别么? 这个要移植吗?直接用PE新建一个KL16的工程不就好啦 没看懂。IAP程序能擦除IAP程序所在扇区么?IAP程序拷贝到ram中运行么? 地主阿山 发表于 2014-10-16 18:58
这个要移植吗?直接用PE新建一个KL16的工程不就好啦
是啊,没什么修改的东西啊,就是不行啊 fengyunyu 发表于 2014-10-16 19:39
没看懂。IAP程序能擦除IAP程序所在扇区么?IAP程序拷贝到ram中运行么?
只要擦除的不是当前正在执行的那几条程序,有何不可?况且真正执行擦除的那几行代码就是在RAM里的。 同意二楼,最好pe新建工程。 发现个很奇葩的现象,我把IAP程序区分配为0x4c00-0x5c00(实际程序生成的代码大概分配到0x5200多,也就是0x5400-0x5c00都是未使用的),在主程序里做了2件事(1,将2个数写到0x5400。2,擦除0x5000-0x5800)执行的代码全部在0x4c00以内,运行结果是0x5000-0x5400的内容擦不掉(这部分是JLINK烧写的),0x5400-0x5800的内容就擦掉了(这部分是程序操作的),由此得出的猜想:是不是JLINK对部分代码存储空间做了保护? jiang887786 发表于 2014-10-17 08:10
同意二楼,最好pe新建工程。
我这个就是新建的 为了进一步验证猜想,我把主程序的写操作定为写到0x5300,IAP的代码到0x5230为止,0x5000-0x5400是一个扇区,运行结果是写操作也无法实现。 来个版主冒个泡好么…… 是不是你存储空间太大了?改小一点试试看 luckner 发表于 2014-10-17 11:00
是不是你存储空间太大了?改小一点试试看
太大?我128K的芯片,工程是32K的 lbblsws 发表于 2014-10-17 11:01
太大?我128K的芯片,工程是32K的
额试试看吧 有次我分配的存储空间大了就有问题 luckner 发表于 2014-10-17 11:04
额试试看吧 有次我分配的存储空间大了就有问题
试什么啊? 楼主你好。请问你使用的KL16的芯片全称是什么?另外,你使用KL25,用PE生成的flash函数都是正常的是吗?只是使用KL16的时候擦除不了?请给出你说的3块地址范围。 lbblsws 发表于 2014-10-17 11:05
试什么啊?
扇区大小 KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间(详细见7,9楼)3块地址不是问题所在,我更改了3次的3块地址,3都是能顺利擦写的。 luckner 发表于 2014-10-17 11:09
扇区大小
FLASH的一个扇区大小是固定的,我怎么调?目前我实际只用了20K不到。工程建立的最大许可就是32K,实际量产要用的也是32K,你要调什么? FSL_TICS_ZJJ 发表于 2014-10-17 11:08
楼主你好。请问你使用的KL16的芯片全称是什么?另外,你使用KL25,用PE生成的flash函数都是正常的是吗?只 ...
KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间(详细见7,9楼)3块地址不是问题所在,我更改了3次的3块地址,3都是能顺利擦写的。 lbblsws 发表于 2014-10-17 11:12
KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间( ...
把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。
lbblsws 发表于 2014-10-17 11:19
KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间 ...
你也可以用opensda接过去调试看看,是不是JLINK导致的。
还有,你现在用的是什么IDE? FSL_TICS_ZJJ 发表于 2014-10-17 11:21
你也可以用opensda接过去调试看看,是不是JLINK导致的。
还有,你现在用的是什么IDE? ...
我用的KDS,openSDA怎么接过去啊? FSL_TICS_ZJJ 发表于 2014-10-17 11:20
把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。
我的电脑加密的,工程给你没有用,我只能贴代码 FSL_TICS_ZJJ 发表于 2014-10-17 11:20
把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。
int main(void)
/*lint -restore Enable MISRA rule (6.3) checking. */
{
/* Write your local variable definition here */
LDD_TError Error;
uint8 xxx ={0x00,0x00};
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
/* For example: for(;;) { } */
InitEeprom();
Error = Flash_Write(Flash_DeviceData, xxx, 0x5300, 2);
do{
Flash_Main(Flash_DeviceData);
}
while(Flash_GetOperationStatus(Flash_DeviceData) != LDD_FLASH_IDLE);
Error = Flash_Erase(Flash_DeviceData, 0x5000, 0x400);
do{
Flash_Main(Flash_DeviceData);
}
while(Flash_GetOperationStatus(Flash_DeviceData) != LDD_FLASH_IDLE);
7楼9楼所说都是在这段程序里观察到的,FLASH函数都是PE生成的,现在存储在普通程序段
直接用PE新建一个KL16的工程 FSL_TICS_ZJJ 发表于 2014-10-17 11:20
把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。
我重新新建了一个16的工程,代码如下,部分省略:
/* User includes (#include below this line is not maintained by Processor Expert) */
__attribute__((section (".iapsymbols")))void IAP_Main(void);
void IAP_Main(void)
{
uint16 i;
for (i=0; i<10000; i++);
}
/*lint -save-e970 Disable MISRA rule (6.3) checking. */
int main(void)
/*lint -restore Enable MISRA rule (6.3) checking. */
{
/* Write your local variable definition here */
uint8 xxx ={0x00,0x00};
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
/* For example: for(;;) { } */
Flash_Write(Flash_DeviceData, xxx, 0x5ff0, 2);
do{
Flash_Main(Flash_DeviceData);
}
while(Flash_GetOperationStatus(Flash_DeviceData) != LDD_FLASH_IDLE);
Flash_Erase(Flash_DeviceData, 0x5c00, 0x800);
do{
Flash_Main(Flash_DeviceData);
}
while(Flash_GetOperationStatus(Flash_DeviceData) != LDD_FLASH_IDLE);
for (;;)
{
}
再附上调试界面截图 lbblsws 发表于 2014-10-17 12:54
我重新新建了一个16的工程,代码如下,部分省略:
/* User includes (#include below this line is not m ...
好的,我试下,待会给你回复! FSL_TICS_ZJJ 发表于 2014-10-17 13:04
好的,我试下,待会给你回复!
完全一样的代码,我在CW上也试了一下,在KL25上也试了一下,基本排除编译器的问题,只有两种可能,一个是16和25的区别,另一个就是调试器的区别,我板载的那个opensda如果外接出来是不是要把PCB上线割了引出来?然后板子就没用了吧? lbblsws 发表于 2014-10-17 14:08
完全一样的代码,我在CW上也试了一下,在KL25上也试了一下,基本排除编译器的问题,只有两种可能,一个是 ...
那不需要, KL25上不是有个J11吗?
只要跳线就可以了。
主要就是跳掉SWD_CLK,其余直接接到你KL16板子就行。
不用了,可以找个跳帽,把J11接上就行。 FSL_TICS_ZJJ 发表于 2014-10-17 14:37
那不需要, KL25上不是有个J11吗?
只要跳线就可以了。
你哪里实验了能擦写么? lbblsws 发表于 2014-10-17 14:47
你哪里实验了能擦写么?
你好,目前我是这样的。
在0X00006000开始的256个字节,定义了常量。
然后,对0x5ff0写入11个字节的数据,成功。
擦除从0x5c00开始的2个sector,成功。
我把我的代码给你, 你可以跑下看看结果是否和我一样。
我建立的工程就是KL16 128M的,
直接编译,下载,不要重新生成代码,否则会刷掉一些代码。 FSL_TICS_ZJJ 发表于 2014-10-17 15:53
我把我的代码给你, 你可以跑下看看结果是否和我一样。
我建立的工程就是KL16 128M的,
直接编译,下载,不 ...
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调不了……还有NMI的功能要禁止掉,否则我PCB板上的CPU不能工作,修改的话又要生成代码…… lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...
我重配置下再给你啊。 lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...
去掉了NMI引脚功能,并且配置了JLINK, 我自己把OPENSDA模拟成JLINK了,仿真之后结果也是正确的。
你测试下试试哦,
然后把结果贴出来我看看。 lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...
再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了。
我写opensda那个就是为了给个参考,大家自己发挥其他的,方法一样。 可能是一些小地方没有注意到!版主很敬业! FSL_TICS_ZJJ 发表于 2014-10-17 16:50
再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了 ...
我点击编译的时候弹出这个什么意思? 本帖最后由 lbblsws 于 2014-10-18 09:47 编辑
FSL_TICS_ZJJ 发表于 2014-10-17 16:50
再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了 ...
忽略此楼…… 结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSDA模拟的? FSL_TICS_ZJJ 发表于 2014-10-17 16:48
去掉了NMI引脚功能,并且配置了JLINK, 我自己把OPENSDA模拟成JLINK了,仿真之后结果也是正确的。
你测 ...
版主……截图看到了么? lbblsws 发表于 2014-10-18 09:43
结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSD ...
楼主,不好意思,最近不在阿莫论坛,刚看到你的问题。
我是用opensda模拟的JLINK, 你用我代码,用实际的JLINK是擦除不了吗?
这样,我明天把我板子焊上SWD接口,然后用真的JLINK 烧下。 lbblsws 发表于 2014-10-18 09:43
结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSD ...
另外你那边寄存器窗口,跑完刷新下看看。 FSL_TICS_ZJJ 发表于 2014-10-20 17:30
楼主,不好意思,最近不在阿莫论坛,刚看到你的问题。
我是用opensda模拟的JLINK, 你用我代码,用实际的 ...
是啊,擦不了 FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。
是这个寄存器么? FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。
执行完擦除函数后的寄存器 FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。
这是在FRDM-KL25Z板子上跑的程序,分别用openSDA和Jlink固件调试的,完全一样的硬件和程序,得到2个结果……求解。 本帖最后由 FSL_TICS_ZJJ 于 2014-10-27 17:42 编辑
lbblsws 发表于 2014-10-27 10:20
这是在FRDM-KL25Z板子上跑的程序,分别用openSDA和Jlink固件调试的,完全一样的硬件和程序,得到2个结果 ...
我试了下,的确,我试了我的JLINK也不行,擦不掉,但是用opensda就能擦掉。
应该和仿真器有关系。 FSL_TICS_ZJJ 发表于 2014-10-27 17:18
我试了下,的确,我试了我的JLINK也不行,擦不掉,但是用opensda就能擦掉。
应该和仿真器有关系。 ...
JLINK仿真不行,脱机运行可以,验证过了。 lbblsws 发表于 2014-10-27 20:37
JLINK仿真不行,脱机运行可以,验证过了。
嗯,应该是Jlink仿真器禁止了仿真擦除有数据区域。
页:
[1]