查看: 1715|回复: 5

[求助] 请教K10 EEP分区产生复位的问题。

[复制链接]

该用户从未签到

7

主题

25

帖子

0

注册会员

Rank: 2

积分
110
最后登录
1970-1-1
发表于 2015-3-28 17:44:20 | 显示全部楼层 |阅读模式
问题背景:MCU为MK10DX128VLL7,使用J-Link V8调试器,Keil开发环境。
问题:使用增强型EEP的功能,将FlexNvm 32K全部分配给EEPROM,EEPROM大小为2K(最大),如下分区函数,在调试时,如果全速运行,一直会产生复位,如果在语句“ FTFL->FSTAT |= FTFL_FSTAT_CCIF_MASK;"设断点,再单步运行,则可运行通过,后续也可以正常写入和读取。请问这是什么问题导致的?如何解决呢?是不是有那些特殊寄存器要配置?谢谢!
注:我也试过下载后,不接调试器,直接上电运行,问题是一样会出现的。


EEP分区函数的调用语句:
(void)partition_flash(EEPROM_2K,DFLASH_SIZE_0);
常量定义:
#define EEPROM_0           0x0F
#define EEPROM_32          0x09
#define EEPROM_64          0x08
#define EEPROM_128         0x07
#define EEPROM_256         0x06
#define EEPROM_512         0x05
#define EEPROM_1K          0x04
#define EEPROM_2K          0x03
/* Defines for the dflash_size parameter */
#define DFLASH_SIZE_32K   0x00
#define DFLASH_SIZE_24K   0x01
#define DFLASH_SIZE_16K   0x02
#define DFLASH_SIZE_0     0x03
#define DFLASH_SIZE_8K    0x0B

#define EEP_BaseAddr                0x14000000

函数体:
uchar partition_flash(uint8_t eeprom_size, uint8_t dflash_size)
{
        //uint8_t waitCnt = 0;
    /* Test to make sure the device is not already partitioned. If it
    * is already partitioned, then return with no action performed.
    */
    if ((SIM->FCFG1 & SIM_FCFG1_DEPART(0xF)) != 0x00000F00)
    {
        return ERROR;
    }
          
        /* Wait for the command to complete */
       
        while(!(FTFL->FSTAT & FTFL_FSTAT_CCIF_MASK))
        {
        }
       
    /* Write the FCCOB registers */
    FTFL->FCCOB0 = FTFL_FCCOB0_CCOBn(0x80); // Selects the PGMPART command
    FTFL->FCCOB1 = 0x00;
    FTFL->FCCOB2 = 0x00;
    FTFL->FCCOB3 = 0x00;


    /* FCCOB4 is written with the code for the subsystem sizes (eeprom_size define) */
    FTFL->FCCOB4 = 0x30|eeprom_size;


    /* FFCOB5 is written with the code for the Dflash size (dflash_size define) */
    FTFL->FCCOB5 = dflash_size;
       
        //while(--waitCnt);
    /* All required FCCOBx registers are written, so launch the command */
    FTFL->FSTAT |= FTFL_FSTAT_CCIF_MASK;
        //while(--waitCnt);
    /* Wait for the command to complete */
    while(!(FTFL->FSTAT & FTFL_FSTAT_CCIF_MASK));
       
    return SUCCESS;
}

我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

7

主题

25

帖子

0

注册会员

Rank: 2

积分
110
最后登录
1970-1-1
 楼主| 发表于 2015-3-28 19:35:18 来自手机 | 显示全部楼层
那位高手有碰到类似问题,帮忙整个思路解决
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-30 09:39:34 | 显示全部楼层
楼主分区代码是在FLASH中运行还是RAM中运行?
如果debug的话,你可以放到RAM中运行,如果在flash中分区,会出错的。
如果一定要把代码放flash中,那么你需要自己把你的分区代码copy到RAM中运行。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-4-2 14:20:24 | 显示全部楼层
另外,楼主在运行flash的分区命令之前,需要关闭全局中断,等执行之后再打开中断。
因为如果flash分区过程中遇到中断,会导致flash操作失败。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-4-2 14:20:36 | 显示全部楼层
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决.
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

25

帖子

0

注册会员

Rank: 2

积分
110
最后登录
1970-1-1
 楼主| 发表于 2015-4-3 18:05:44 | 显示全部楼层
非常感谢!你说的很有道理,主要应该是放FLASH执行的原因,虽然还没实际验证过,看到你的回复,让我想起之前8bit和16bit的DataFlash或PFLASH的操作过程是需要放在RAM中的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 04:53 , Processed in 0.095478 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表