查看: 4965|回复: 7

[求助] LPC54606 官方例程EEPROM写问题?

[复制链接]

该用户从未签到

74

主题

266

帖子

0

高级会员

Rank: 4

积分
747
最后登录
2023-5-24
发表于 2019-7-15 15:02:35 | 显示全部楼层 |阅读模式
我用的是官方的SDK,官方例程EEPROM写问题出现问题,怎么也写不进去。一些就死机。在线调试设置断点就好。然后在例程里面加个延时函数。可以不知道大家有没有遇到同样的问题。
/*!
* brief Write data from a user allocated buffer in address of EEPROM.
*
* Users can write any bytes data into EEPROM address by wBuf.
*
* param base     EEPROM peripheral base address.
* param offset   Offset from the begining address of EEPROM.
* param wBuf     Data need be write.
* param size     Number of bytes to write.
*/
void EEPROM_Write(EEPROM_Type *base, int offset, void *wBuf, int size)
{
    uint8_t *src;
    bool unalignedStart;
    uint32_t memUnit = 0;
    uint32_t alignSize = 0;

#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
    uint16_t *dst;
    alignSize = 2;
    memUnit = FSL_FEATURE_EEPROM_ROW_SIZE;
#else
    uint8_t i = 0;
    uint32_t *dst;
    uint32_t data32_Align = 0;
    alignSize = 4;
    memUnit = FSL_FEATURE_EEPROM_SIZE / FSL_FEATURE_EEPROM_PAGE_COUNT;
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */

    /* Offset and size must be positive */
    assert(offset >= 0);
    assert(size > 0);
    /* All bytes must be written to a valid EEPROM address */
    assert((offset + size) <= FSL_FEATURE_EEPROM_SIZE);

    src = wBuf;

#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
    dst = &((uint16_t *)FSL_FEATURE_EEPROM_BASE_ADDRESS)[offset / alignSize];
    unalignedStart = (offset % alignSize != 0);
#else
    dst = &((uint32_t *)FSL_FEATURE_EEPROM_BASE_ADDRESS)[offset / alignSize];
    unalignedStart = (offset % alignSize != 0);
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */

    while (size > 0)
    {
        /* If first byte is to be copied to non aligned EEPROM byte */
        if (unalignedStart)
        {
/* The first byte from the buffer is not 16-bits aligned.
* Read the LSB from EEPROM to complete it.
*/
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
            *dst = (uint16_t)(((uint16_t)src[0] << 8) | (*dst & 0x00ff));
#else
            /* The first byte from the buffer is not 32-bits aligned.
             * Read the rest of data after position offset and realign them.
             */
            for (i = 0; i < alignSize; i++)
            {
                data32_Align |= (uint32_t)(((uint32_t)(src[i] << (8 * ((offset % alignSize) + i)))));
            }
            *dst = (*dst & (0xffffffff >> (8 * (alignSize - (offset % alignSize))))) | data32_Align;
#endif                                                 /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
            src += (alignSize - (offset % alignSize)); /* Operate src to let wBuf pointer offset correct*/
            size -= (alignSize - (offset % alignSize));
            unalignedStart = false;
        }
        else if (size >= alignSize)
        {
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
            /* Combine two bytes from the buffer to a 16-bits word */
            *dst = (uint16_t)(((uint16_t)src[1] << 8) | src[0]);
#else
            /* Combine four bytes from the buffer to a 32-bits word */
            *dst = (uint32_t)(((uint32_t)(src[3] << 24 | src[2] << 16 | src[1] << 8) | src[0]));
#endif                        /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
            src += alignSize; /* Normal operate src to offset wBuf pointer by 4 bytes*/
            size -= alignSize;
        }
        else
        {
/* The last several bytes from the buffer is not 32-bit aligned.
* Read the rest of bytes of non 32-bit aligned data
* and realign them by 32-bit aligned */
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
            *dst = (uint16_t)((*dst & 0xff00) | src[0]);
#else
            data32_Align = 0; /* Clear data32_Align */
            for (i = 0; i < (size % alignSize); i++)
            {
                data32_Align |= (uint32_t)(((uint32_t)(src[i] << (8 * i))));
            }
            *dst = (*dst & (0xffffffff << (8 * (size % alignSize)))) | data32_Align;
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
            size -= (size % alignSize);
        }

        dst++; /* EEPROM mempory pointer go ahead */

        /* When memory unit size reached, have to flush. */
        if ((((uint32_t)dst % memUnit) == 0) && size > 0)
        {
            EEPROM_Flush(base);
        }
    }

    /* Normal need to flush after write data into eeprom */
    EEPROM_Flush(base);
}

我就在dst++; /* EEPROM mempory pointer go ahead */下面加个延时函数就可以了。很郁闷。
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25448
最后登录
2025-9-4
发表于 2019-7-16 11:25:34 | 显示全部楼层
你的意思是EEPROM的例程运行结果与read.me描述的不相符,你是什么平台上测试的,我在LPC54608评估板上测试,EEPROM例程运行正常,并没有你说的那种情况
回复 支持 反对

使用道具 举报

该用户从未签到

74

主题

266

帖子

0

高级会员

Rank: 4

积分
747
最后登录
2023-5-24
 楼主| 发表于 2019-7-16 13:42:09 | 显示全部楼层
小恩GG 发表于 2019-7-16 11:25
你的意思是EEPROM的例程运行结果与read.me描述的不相符,你是什么平台上测试的,我在LPC54608评估板上测试 ...

我用的是LPC54606,MDK编译环境。我测试EEPROM_WritePage这个按页写没问题,只要用的EEPROM_Write全速运行就会进入HardFault_Handler。我调试设断点就可以继续运行。是不是因为我用了系统所以会出现这个问题。无法解释的现象。我继续找找原因。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    18

    主题

    447

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2321
    最后登录
    2025-9-1
    发表于 2019-7-16 14:06:06 | 显示全部楼层
    xiaoming1021 发表于 2019-7-16 13:42
    我用的是LPC54606,MDK编译环境。我测试EEPROM_WritePage这个按页写没问题,只要用的EEPROM_Write全速运 ...

    碰到HardFault_Handler时,多是调用了野指针
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-20 09:11
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    30

    主题

    104

    帖子

    0

    高级会员

    Rank: 4

    积分
    642
    最后登录
    2019-12-2
    发表于 2019-7-16 14:08:50 | 显示全部楼层
    帮顶啊
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    74

    主题

    266

    帖子

    0

    高级会员

    Rank: 4

    积分
    747
    最后登录
    2023-5-24
     楼主| 发表于 2019-7-17 10:34:13 | 显示全部楼层
    小恩GG 发表于 2019-7-16 11:25
    你的意思是EEPROM的例程运行结果与read.me描述的不相符,你是什么平台上测试的,我在LPC54608评估板上测试 ...

    开始我怀疑是不是我上系统的缘故,后来我测试官方给的eeprom例程。还是EEPROM_WritePage这个按页写没问题,只要用的EEPROM_Write全速运行就会进入HardFault_Handler。我调试设断点就可以继续运行。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    74

    主题

    266

    帖子

    0

    高级会员

    Rank: 4

    积分
    747
    最后登录
    2023-5-24
     楼主| 发表于 2019-7-17 10:40:54 | 显示全部楼层
    小恩GG 发表于 2019-7-16 11:25
    你的意思是EEPROM的例程运行结果与read.me描述的不相符,你是什么平台上测试的,我在LPC54608评估板上测试 ...

    就添加这句话就不行。
    QQ图片20190717103948.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    74

    主题

    266

    帖子

    0

    高级会员

    Rank: 4

    积分
    747
    最后登录
    2023-5-24
     楼主| 发表于 2019-7-17 15:40:54 | 显示全部楼层
    小恩GG 发表于 2019-7-16 11:25
    你的意思是EEPROM的例程运行结果与read.me描述的不相符,你是什么平台上测试的,我在LPC54608评估板上测试 ...

    您好版主,知道原因了。把官方库文件
    void EEPROM_GetDefaultConfig(eeprom_config_t *config)
    {
        /* Initializes the configure structure to zero. */
        memset(config, 0, sizeof(*config));

        config->autoProgram = kEEPROM_AutoProgramWriteWord;
        config->writeWaitPhase1 = 0x5U;
        config->writeWaitPhase2 = 0x9U;
        config->writeWaitPhase3 = 0x3U;
        config->readWaitPhase1 = 0xFU;
        config->readWaitPhase2 = 0x8U;
        config->lockTimingParam = false;
    }
        config->autoProgram = kEEPROM_AutoProgramWriteWord;更改成kEEPROM_AutoProgramDisable;
    不让它自动写,就可以了。不知道我这样改对不对。不然我每写一个word就会自动写。这样就会死机。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-6 14:29 , Processed in 0.101288 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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