[技术问题解答] kl02 flash擦写问题

[复制链接]
 楼主| cherylJI 发表于 2015-10-21 19:37 | 显示全部楼层 |阅读模式
我已经将FlashCommandSequence 这个函数移入ram,但是擦写操作不生效。

在写FSTAT_CCIF这一位时,没有报错也没有使擦写操作生效,

REG_BIT_SET(temp, FLASH1_FSTAT_CCIF);

在sdk的demo中这句话执行完就应该生效了。

问题可能出现在哪里呢?
小狗爱吃骨头 发表于 2015-10-21 20:28 | 显示全部楼层
单步运行有没有问题,在哪里出现问题呢?
FSL_TICS_Jeremy 发表于 2015-10-22 09:52 | 显示全部楼层
建议楼主可以试试KSDK中的Flash_demo工程
 楼主| cherylJI 发表于 2015-10-22 10:40 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 09:52
建议楼主可以试试KSDK中的Flash_demo工程

SDK的flash_demo擦写正常,下面是demo中擦写执行代码

  1. uint32_t   FlashCommandSequence (PFLASH_SSD_CONFIG pSSDConfig )
  2. {
  3.     uint32_t ret;       /* return code variable */
  4.     uint32_t temp;      /* temporary variable */

  5.     /* clear CCIF to launch command */
  6.     temp = pSSDConfig->ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;
  7.     REG_BIT_SET(temp, FTFx_SSD_FSTAT_CCIF);

  8.     /* wait for completion of this command */
  9.     temp = pSSDConfig->ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;
  10.     while(0x0U == (REG_BIT_GET(temp, FTFx_SSD_FSTAT_CCIF)))
  11.     {
  12.         /* wait till CCIF bit is set */
  13.         /* serve callback function if counter reaches limitation */
  14.         if(NULL_CALLBACK != pSSDConfig->CallBack)
  15.         {
  16.             (pSSDConfig->CallBack)();
  17.         }
  18.     }

  19.     temp = pSSDConfig->ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;
  20.     ret = ((uint32_t)(REG_READ(temp)) & FTFx_SSD_FSTAT_ERROR_BITS);
  21.     return(ret);
  22. }



REG_BIT_SET(temp, FTFx_SSD_FSTAT_CCIF);这句话执行完擦写操作就生效了

我把demo里的代码移植到我的code中去,flash相关的寄存器值一样子的,只是运行完这句话并不会完成擦写操作。
有没有其他原因使flash无法擦写?
FSL_TICS_Jeremy 发表于 2015-10-22 10:43 | 显示全部楼层
你是说一直卡在那一句啊?
 楼主| cherylJI 发表于 2015-10-22 11:32 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 10:43
你是说一直卡在那一句啊?

    REG_BIT_SET(temp, FTFx_SSD_FSTAT_CCIF);

第八行,是在写0x40020000寄存器的一个状态位,根据datasheet,将FSAT这个寄存器的CCIF位置为1则开始执行program flash ,但是我的code不生效
 楼主| cherylJI 发表于 2015-10-22 13:46 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 10:43
你是说一直卡在那一句啊?

PE上需要中断之类的什么设置的吗?
forthlab 发表于 2015-10-22 14:01 | 显示全部楼层
为何不用PE,里面有FLASH的全套函数。
FSL_TICS_Jeremy 发表于 2015-10-22 14:52 | 显示全部楼层
cherylJI 发表于 2015-10-22 13:46
PE上需要中断之类的什么设置的吗?

不需要的,正如8楼说的那样,你要直接使用PE生成函数试试
 楼主| cherylJI 发表于 2015-10-22 15:39 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 14:52
不需要的,正如8楼说的那样,你要直接使用PE生成函数试试

PE自己生成的代码实际操作时执行一段汇编代码,刚开始用的PE生成的函数读可以,擦写操作无法执行成功,后来才试了sdk里面的flash_demo.
与芯片本身的配置有关系吗?比如时钟频率什么的?
forthlab 发表于 2015-10-22 16:28 | 显示全部楼层
PE配置时,通常会检查参数配置是否合适;
调试时,不需要单步进入子程序,直接执行子程序看结果。
注意事项:
1. FLASH区不要和代码区重合,可以在PE的CPU配置--内存配置中单独划一块flash区域
2. 先用个空程序试试FLASH的函数,就几个常用的,很简单;
西门扫雪 发表于 2015-10-23 08:57 | 显示全部楼层
学习了,也遇到了同样的问题
 楼主| cherylJI 发表于 2015-11-5 18:43 | 显示全部楼层
西门扫雪 发表于 2015-10-23 08:57
学习了,也遇到了同样的问题

最终怎么解决的?
仙女山 发表于 2015-11-5 20:32 | 显示全部楼层
使用PE生成代码就好使了
 楼主| cherylJI 发表于 2015-11-9 14:23 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-10-22 14:52
不需要的,正如8楼说的那样,你要直接使用PE生成函数试试

read可以读出flash的值,但是write不行,有什么可能出错的地方?
FSL_TICS_ZJJ 发表于 2015-11-9 14:28 | 显示全部楼层
cherylJI 发表于 2015-11-9 14:23
read可以读出flash的值,但是write不行,有什么可能出错的地方?

执行flash操作命令之前,关掉全局中断,执行完之后再开启。
你这点做了没有?
我记得如果是KDS新建的代码,可能会默认自带systick的中断的,你把它关掉试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部