lbblsws 发表于 2014-10-16 16:48:08

[求助]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的区别么?

地主阿山 发表于 2014-10-16 18:58:25

这个要移植吗?直接用PE新建一个KL16的工程不就好啦

fengyunyu 发表于 2014-10-16 19:39:43

没看懂。IAP程序能擦除IAP程序所在扇区么?IAP程序拷贝到ram中运行么?

lbblsws 发表于 2014-10-16 20:13:25

地主阿山 发表于 2014-10-16 18:58
这个要移植吗?直接用PE新建一个KL16的工程不就好啦

是啊,没什么修改的东西啊,就是不行啊

lbblsws 发表于 2014-10-16 20:15:27

fengyunyu 发表于 2014-10-16 19:39
没看懂。IAP程序能擦除IAP程序所在扇区么?IAP程序拷贝到ram中运行么?

只要擦除的不是当前正在执行的那几条程序,有何不可?况且真正执行擦除的那几行代码就是在RAM里的。

jiang887786 发表于 2014-10-17 08:10:04

同意二楼,最好pe新建工程。

lbblsws 发表于 2014-10-17 09:45:43

发现个很奇葩的现象,我把IAP程序区分配为0x4c00-0x5c00(实际程序生成的代码大概分配到0x5200多,也就是0x5400-0x5c00都是未使用的),在主程序里做了2件事(1,将2个数写到0x5400。2,擦除0x5000-0x5800)执行的代码全部在0x4c00以内,运行结果是0x5000-0x5400的内容擦不掉(这部分是JLINK烧写的),0x5400-0x5800的内容就擦掉了(这部分是程序操作的),由此得出的猜想:是不是JLINK对部分代码存储空间做了保护?

lbblsws 发表于 2014-10-17 09:46:22

jiang887786 发表于 2014-10-17 08:10
同意二楼,最好pe新建工程。

我这个就是新建的

lbblsws 发表于 2014-10-17 09:53:11

为了进一步验证猜想,我把主程序的写操作定为写到0x5300,IAP的代码到0x5230为止,0x5000-0x5400是一个扇区,运行结果是写操作也无法实现。

lbblsws 发表于 2014-10-17 10:57:17

来个版主冒个泡好么……

luckner 发表于 2014-10-17 11:00:25

是不是你存储空间太大了?改小一点试试看

lbblsws 发表于 2014-10-17 11:01:58

luckner 发表于 2014-10-17 11:00
是不是你存储空间太大了?改小一点试试看

太大?我128K的芯片,工程是32K的

luckner 发表于 2014-10-17 11:04:44

lbblsws 发表于 2014-10-17 11:01
太大?我128K的芯片,工程是32K的

额试试看吧 有次我分配的存储空间大了就有问题

lbblsws 发表于 2014-10-17 11:05:56

luckner 发表于 2014-10-17 11:04
额试试看吧 有次我分配的存储空间大了就有问题

试什么啊?

FSL_TICS_ZJJ 发表于 2014-10-17 11:08:02

楼主你好。请问你使用的KL16的芯片全称是什么?另外,你使用KL25,用PE生成的flash函数都是正常的是吗?只是使用KL16的时候擦除不了?请给出你说的3块地址范围。

luckner 发表于 2014-10-17 11:09:00

lbblsws 发表于 2014-10-17 11:05
试什么啊?

扇区大小

lbblsws 发表于 2014-10-17 11:12:00

KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间(详细见7,9楼)3块地址不是问题所在,我更改了3次的3块地址,3都是能顺利擦写的。

lbblsws 发表于 2014-10-17 11:15:13

luckner 发表于 2014-10-17 11:09
扇区大小

FLASH的一个扇区大小是固定的,我怎么调?目前我实际只用了20K不到。工程建立的最大许可就是32K,实际量产要用的也是32K,你要调什么?

lbblsws 发表于 2014-10-17 11:19:46

FSL_TICS_ZJJ 发表于 2014-10-17 11:08
楼主你好。请问你使用的KL16的芯片全称是什么?另外,你使用KL25,用PE生成的flash函数都是正常的是吗?只 ...

KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间(详细见7,9楼)3块地址不是问题所在,我更改了3次的3块地址,3都是能顺利擦写的。

FSL_TICS_ZJJ 发表于 2014-10-17 11:20:51

lbblsws 发表于 2014-10-17 11:12
KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间( ...

把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。

FSL_TICS_ZJJ 发表于 2014-10-17 11:21:50

lbblsws 发表于 2014-10-17 11:19
KL16Z128VFM4;KL25全部能正常擦写(openSDA调的);在工程板子上是用JLINK调的,擦除不了已写程序的空间 ...

你也可以用opensda接过去调试看看,是不是JLINK导致的。
还有,你现在用的是什么IDE?

lbblsws 发表于 2014-10-17 11:23:49

FSL_TICS_ZJJ 发表于 2014-10-17 11:21
你也可以用opensda接过去调试看看,是不是JLINK导致的。
还有,你现在用的是什么IDE? ...

我用的KDS,openSDA怎么接过去啊?

lbblsws 发表于 2014-10-17 11:24:45

FSL_TICS_ZJJ 发表于 2014-10-17 11:20
把你代码上传,我这边用KL26的试试,这个是兼容KL16的芯片的。

我的电脑加密的,工程给你没有用,我只能贴代码

lbblsws 发表于 2014-10-17 11:29:43

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生成的,现在存储在普通程序段

Samzzt 发表于 2014-10-17 11:46:03

直接用PE新建一个KL16的工程

lbblsws 发表于 2014-10-17 12:54:38

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 (;;)
        {

        }

再附上调试界面截图

FSL_TICS_ZJJ 发表于 2014-10-17 13:04:41

lbblsws 发表于 2014-10-17 12:54
我重新新建了一个16的工程,代码如下,部分省略:
/* User includes (#include below this line is not m ...

好的,我试下,待会给你回复!

lbblsws 发表于 2014-10-17 14:08:28

FSL_TICS_ZJJ 发表于 2014-10-17 13:04
好的,我试下,待会给你回复!

完全一样的代码,我在CW上也试了一下,在KL25上也试了一下,基本排除编译器的问题,只有两种可能,一个是16和25的区别,另一个就是调试器的区别,我板载的那个opensda如果外接出来是不是要把PCB上线割了引出来?然后板子就没用了吧?

FSL_TICS_ZJJ 发表于 2014-10-17 14:37:11

lbblsws 发表于 2014-10-17 14:08
完全一样的代码,我在CW上也试了一下,在KL25上也试了一下,基本排除编译器的问题,只有两种可能,一个是 ...

那不需要, KL25上不是有个J11吗?
只要跳线就可以了。

主要就是跳掉SWD_CLK,其余直接接到你KL16板子就行。
不用了,可以找个跳帽,把J11接上就行。

lbblsws 发表于 2014-10-17 14:47:21

FSL_TICS_ZJJ 发表于 2014-10-17 14:37
那不需要, KL25上不是有个J11吗?
只要跳线就可以了。



你哪里实验了能擦写么?

FSL_TICS_ZJJ 发表于 2014-10-17 15:49:50

lbblsws 发表于 2014-10-17 14:47
你哪里实验了能擦写么?

你好,目前我是这样的。

在0X00006000开始的256个字节,定义了常量。
然后,对0x5ff0写入11个字节的数据,成功。

擦除从0x5c00开始的2个sector,成功。

FSL_TICS_ZJJ 发表于 2014-10-17 15:53:24

我把我的代码给你, 你可以跑下看看结果是否和我一样。
我建立的工程就是KL16 128M的,
直接编译,下载,不要重新生成代码,否则会刷掉一些代码。

lbblsws 发表于 2014-10-17 16:21:42

FSL_TICS_ZJJ 发表于 2014-10-17 15:53
我把我的代码给你, 你可以跑下看看结果是否和我一样。
我建立的工程就是KL16 128M的,
直接编译,下载,不 ...

你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调不了……还有NMI的功能要禁止掉,否则我PCB板上的CPU不能工作,修改的话又要生成代码……

FSL_TICS_ZJJ 发表于 2014-10-17 16:29:49

lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...

我重配置下再给你啊。

FSL_TICS_ZJJ 发表于 2014-10-17 16:48:54

lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...


去掉了NMI引脚功能,并且配置了JLINK, 我自己把OPENSDA模拟成JLINK了,仿真之后结果也是正确的。
你测试下试试哦,
然后把结果贴出来我看看。

FSL_TICS_ZJJ 发表于 2014-10-17 16:50:23

lbblsws 发表于 2014-10-17 16:21
你给的工程里没有JLINK的调试文件,不知道怎么加啊……经验贴里只介绍如何加OPENSDA,我这里OPENSDA又调 ...

再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了。
我写opensda那个就是为了给个参考,大家自己发挥其他的,方法一样。

fengyunyu 发表于 2014-10-17 17:26:48

可能是一些小地方没有注意到!版主很敬业!

lbblsws 发表于 2014-10-18 08:49:36

FSL_TICS_ZJJ 发表于 2014-10-17 16:50
再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了 ...

我点击编译的时候弹出这个什么意思?

lbblsws 发表于 2014-10-18 08:57:43

本帖最后由 lbblsws 于 2014-10-18 09:47 编辑

FSL_TICS_ZJJ 发表于 2014-10-17 16:50
再加句,添加JLINK和那个opensda就是一样的。
只不过最后选择端口的时候,你选择JLINK,然后SWD就可以了 ...

忽略此楼……

lbblsws 发表于 2014-10-18 09:43:25

结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSDA模拟的?

lbblsws 发表于 2014-10-20 16:53:38

FSL_TICS_ZJJ 发表于 2014-10-17 16:48
去掉了NMI引脚功能,并且配置了JLINK, 我自己把OPENSDA模拟成JLINK了,仿真之后结果也是正确的。
你测 ...

版主……截图看到了么?

FSL_TICS_ZJJ 发表于 2014-10-20 17:30:36

lbblsws 发表于 2014-10-18 09:43
结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSD ...

楼主,不好意思,最近不在阿莫论坛,刚看到你的问题。
我是用opensda模拟的JLINK, 你用我代码,用实际的JLINK是擦除不了吗?
这样,我明天把我板子焊上SWD接口,然后用真的JLINK 烧下。

FSL_TICS_ZJJ 发表于 2014-10-20 17:32:16

lbblsws 发表于 2014-10-18 09:43
结果出来,还是不行。见截图,擦除不了JLINK烧写的那部分。你那边试验用的是实际的JLINK仿真器还是用openSD ...

另外你那边寄存器窗口,跑完刷新下看看。

lbblsws 发表于 2014-10-21 09:43:01

FSL_TICS_ZJJ 发表于 2014-10-20 17:30
楼主,不好意思,最近不在阿莫论坛,刚看到你的问题。
我是用opensda模拟的JLINK, 你用我代码,用实际的 ...

是啊,擦不了

lbblsws 发表于 2014-10-21 09:52:00

FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。

是这个寄存器么?

lbblsws 发表于 2014-10-21 10:01:27

FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。

执行完擦除函数后的寄存器

lbblsws 发表于 2014-10-27 10:20:21

FSL_TICS_ZJJ 发表于 2014-10-20 17:32
另外你那边寄存器窗口,跑完刷新下看看。

这是在FRDM-KL25Z板子上跑的程序,分别用openSDA和Jlink固件调试的,完全一样的硬件和程序,得到2个结果……求解。

FSL_TICS_ZJJ 发表于 2014-10-27 17:18:49

本帖最后由 FSL_TICS_ZJJ 于 2014-10-27 17:42 编辑

lbblsws 发表于 2014-10-27 10:20
这是在FRDM-KL25Z板子上跑的程序,分别用openSDA和Jlink固件调试的,完全一样的硬件和程序,得到2个结果 ...

我试了下,的确,我试了我的JLINK也不行,擦不掉,但是用opensda就能擦掉。
应该和仿真器有关系。

lbblsws 发表于 2014-10-27 20:37:55

FSL_TICS_ZJJ 发表于 2014-10-27 17:18
我试了下,的确,我试了我的JLINK也不行,擦不掉,但是用opensda就能擦掉。
应该和仿真器有关系。 ...

JLINK仿真不行,脱机运行可以,验证过了。

FSL_TICS_ZJJ 发表于 2014-10-28 08:58:35

lbblsws 发表于 2014-10-27 20:37
JLINK仿真不行,脱机运行可以,验证过了。

嗯,应该是Jlink仿真器禁止了仿真擦除有数据区域。
页: [1]
查看完整版本: [求助]PE生成FLASH操作函数擦除不了FLASH(已解决)