查看: 2362|回复: 1

[原创] MCU内部flash操作重启解决办法

[复制链接]
  • TA的每日心情
    慵懒
    2017-4-27 10:34
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    507

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1450
    最后登录
    2020-8-3
    发表于 2016-9-23 14:10:32 | 显示全部楼层 |阅读模式
    本帖最后由 流-423774 于 2016-9-23 14:13 编辑

    ## MCU单片机操作内部flash是很常用的

    ### 但是在操作内部flash的时候可能出现重启的现象,这种情况是什么问题引起的呢?
    出现这种情况的很大一部分可能是中断打断程序当前正在操作内部flash,在操作内部flash的时候是不能被打断的,可以尝试这样写
       
        /************************************************************
        *Function    :FlashOption_Erase
        *Descriptor    :
        *Input        :null
        *Return        :none
        *Hist        :
        *************************************************************/
        uint32_t FlashOption_Program(uint32_t ProgramAddress, uint32_t* ProgressBuf, uint32_t length)
        {
            /* Return code from each flash driver function */
            status_t result;
            __disable_irq();
            result = FLASH_Program(&flashDriver, ProgramAddress, ProgressBuf, length);
            __enable_irq();
            if (kStatus_FLASH_Success != result)
            {
                log_u("FLASH Program(%d) error!\r\n", result);
                return result;
            }
            return result;
       
        }

        /************************************************************
        *Function    :FlashOption_Erase
        *Descriptor    :
        *Input        :null
        *Return        :none
        *Hist        :
        *************************************************************/
        uint32_t FlashOption_Erase(uint32_t EraseAddress, uint32_t size)
        {
            /* Return code from each flash driver function */
            status_t result;
            uint32_t ector;
            EraseAddress &= 0xFFFFF000;
            if (size < 4096)
                ector = 4096;
            else
                ector = size;
            __disable_irq();
            result = FLASH_Erase(&flashDriver, EraseAddress, ector, kFLASH_apiEraseKey);
            __enable_irq();
            if (kStatus_FLASH_Success != result)
            {
                log_u("FLASH Erase(%d) error!\r\n", result);
                        
            }
       
            /* Verify sector if it's been erased. */
            __disable_irq();
            result = FLASH_VerifyErase(&flashDriver, EraseAddress, ector, kFLASH_marginValueUser);
            __enable_irq();
            if (kStatus_FLASH_Success != result)
            {
                log_u("FLASH_VerifyErase(%d) error!\r\n", result);
                   
            }
                return result;
        }

    在这两段代码中在操作flash之前,加入了关闭总中断,操作完成之后开启总中断,这样内部flash的操作就不会被打断,程序也不会重启

    ###
    ##


    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-10 15:47
  • 签到天数: 1251 天

    连续签到: 1 天

    [LV.10]以坛为家III

    6

    主题

    2396

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    7534
    最后登录
    2025-5-23
    发表于 2016-9-23 15:28:48 | 显示全部楼层
    nxp1.png
    nxp2.png
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 10:06 , Processed in 0.082058 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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