在线时间250 小时
UID423774
注册时间2014-10-22
NXP金币0
TA的每日心情 | 慵懒 2017-4-27 10:34 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
金牌会员
 
- 积分
- 1450
- 最后登录
- 2020-8-3
|
本帖最后由 流-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的操作就不会被打断,程序也不会重启
###
##
|
|