打印
[技术问题解答]

kl02 flash擦写问题

[复制链接]
1291|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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中擦写执行代码

uint32_t   FlashCommandSequence (PFLASH_SSD_CONFIG pSSDConfig )
{
    uint32_t ret;       /* return code variable */
    uint32_t temp;      /* temporary variable */

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

    /* wait for completion of this command */
    temp = pSSDConfig->ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;
    while(0x0U == (REG_BIT_GET(temp, FTFx_SSD_FSTAT_CCIF)))
    {
        /* wait till CCIF bit is set */
        /* serve callback function if counter reaches limitation */
        if(NULL_CALLBACK != pSSDConfig->CallBack)
        {
            (pSSDConfig->CallBack)();
        }
    }

    temp = pSSDConfig->ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;
    ret = ((uint32_t)(REG_READ(temp)) & FTFx_SSD_FSTAT_ERROR_BITS);
    return(ret);
}



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

我把demo里的代码移植到我的code中去,flash相关的寄存器值一样子的,只是运行完这句话并不会完成擦写操作。
有没有其他原因使flash无法擦写?

使用特权

评论回复
5
FSL_TICS_Jeremy| | 2015-10-22 10:43 | 只看该作者
你是说一直卡在那一句啊?

使用特权

评论回复
6
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不生效

使用特权

评论回复
7
cherylJI|  楼主 | 2015-10-22 13:46 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-22 10:43
你是说一直卡在那一句啊?

PE上需要中断之类的什么设置的吗?

使用特权

评论回复
8
forthlab| | 2015-10-22 14:01 | 只看该作者
为何不用PE,里面有FLASH的全套函数。

使用特权

评论回复
9
FSL_TICS_Jeremy| | 2015-10-22 14:52 | 只看该作者
cherylJI 发表于 2015-10-22 13:46
PE上需要中断之类的什么设置的吗?

不需要的,正如8楼说的那样,你要直接使用PE生成函数试试

使用特权

评论回复
10
cherylJI|  楼主 | 2015-10-22 15:39 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-22 14:52
不需要的,正如8楼说的那样,你要直接使用PE生成函数试试

PE自己生成的代码实际操作时执行一段汇编代码,刚开始用的PE生成的函数读可以,擦写操作无法执行成功,后来才试了sdk里面的flash_demo.
与芯片本身的配置有关系吗?比如时钟频率什么的?

使用特权

评论回复
11
forthlab| | 2015-10-22 16:28 | 只看该作者
PE配置时,通常会检查参数配置是否合适;
调试时,不需要单步进入子程序,直接执行子程序看结果。
注意事项:
1. FLASH区不要和代码区重合,可以在PE的CPU配置--内存配置中单独划一块flash区域
2. 先用个空程序试试FLASH的函数,就几个常用的,很简单;

使用特权

评论回复
12
西门扫雪| | 2015-10-23 08:57 | 只看该作者
学习了,也遇到了同样的问题

使用特权

评论回复
13
cherylJI|  楼主 | 2015-11-5 18:43 | 只看该作者
西门扫雪 发表于 2015-10-23 08:57
学习了,也遇到了同样的问题

最终怎么解决的?

使用特权

评论回复
14
仙女山| | 2015-11-5 20:32 | 只看该作者
使用PE生成代码就好使了

使用特权

评论回复
15
cherylJI|  楼主 | 2015-11-9 14:23 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-10-22 14:52
不需要的,正如8楼说的那样,你要直接使用PE生成函数试试

read可以读出flash的值,但是write不行,有什么可能出错的地方?

使用特权

评论回复
16
FSL_TICS_ZJJ| | 2015-11-9 14:28 | 只看该作者
cherylJI 发表于 2015-11-9 14:23
read可以读出flash的值,但是write不行,有什么可能出错的地方?

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝