查看: 1121|回复: 2

[求助] 求助万能大佬MK22FA12的FLASH到底怎么擦除呀总是失败!内含...

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
6
最后登录
2020-10-23
发表于 2020-10-23 13:37:50 | 显示全部楼层 |阅读模式
//**********定义flash配置全局变量**********//
static flash_config_t g_stflash_config;
//**********定义flash工作信息结构体**********//
stFlashWorkInfo g_stFlashWorkInfo;
unsigned int pflashBlockBase = 0;
unsigned int pflashTotalSize = 0;
unsigned int pflashSectorSize = 0;
/*******************************************************************************  
            *函数名称:void Flash_Init( void )
            *函数功能:Flash初始化函数
            *入口参数:无
            *出口参数:无
            *备注:无
*******************************************************************************/
void Flash_Init( void )
{
flash_security_state_t l_stflash_security_state = kFLASH_SecurityStateNotSecure;

memset( &g_stflash_config, 0, sizeof( flash_config_t ) );

if( kStatus_FLASH_Success != FLASH_Init( &g_stflash_config ) )
{
  printf("flash init failed !\r\n");
  g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
}
else
{
  FLASH_GetProperty(&g_stflash_config, kFLASH_PropertyPflashBlockBaseAddr, &pflashBlockBase);
    FLASH_GetProperty(&g_stflash_config, kFLASH_PropertyPflashTotalSize, &pflashTotalSize);
    FLASH_GetProperty(&g_stflash_config, kFLASH_PropertyPflashSectorSize, &pflashSectorSize);
  if( kStatus_FLASH_Success != FLASH_GetSecurityState( &g_stflash_config, &l_stflash_security_state ) )
  {
   printf("flash get security failed !\r\n");
   g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
  }
  else
  {
   if ( kFLASH_SecurityStateNotSecure != l_stflash_security_state )
   {
    printf("flash is secure !\r\n");
    g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
   }
   else
   {
    printf("flash init ok\r\n");
    g_stFlashWorkInfo.m_enFlashState = FLASH_NORMAL;
   }
  }
}

}

/*******************************************************************************  
            *函数名称:void Flash_Erase_Data( void )
            *函数功能:Flash擦除数据函数
            *入口参数:数据起始地址(l_u32StartAdd),数据缓存指针(*l_pu32DataBufferStartAdd),数据数量(l_u8DataCnt)
            *出口参数:无
            *备注:无
*******************************************************************************/
void Flash_Erase_Data( unsigned int l_u32StartAdd, unsigned int *l_pu32DataBufferStartAdd, unsigned char l_u8DataCnt )
{
flash_security_state_t l_stflash_security_state = kFLASH_SecurityStateNotSecure;

if( FLASH_NORMAL == Get_Flash_State() )
{
  if( kStatus_FLASH_Success != FLASH_GetSecurityState( &g_stflash_config, &l_stflash_security_state ) )
  {
   printf("flash get security failed !\r\n");
   g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
  }
  else
  {
   if ( kFLASH_SecurityStateNotSecure != l_stflash_security_state )
   {
    printf("flash is secure !\r\n");
    g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
   }
   else
   {
    l_u32StartAdd = pflashBlockBase + (pflashTotalSize - (1U * pflashSectorSize * 2));
    if( kStatus_FLASH_Success != FLASH_Erase(&g_stflash_config, l_u32StartAdd, l_u8DataCnt, kFLASH_ApiEraseKey) )
    {
     printf("flash eraser add 0X%x failed \r\n", l_u32StartAdd);
     g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
    }
    else
    {
     if( kStatus_FLASH_Success != FLASH_VerifyErase(&g_stflash_config, l_u32StartAdd, l_u8DataCnt, kFLASH_MarginValueUser) )
     {
      printf("flash verify eraser add 0X%x failed \r\n", l_u32StartAdd);
      g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
     }
     else
     {
      printf("flash verify eraser add 0X%x ok \r\n", l_u32StartAdd);
     }
    }
   }
  }
}
  else
{
  printf( "flash state err before eraser 0X%x \r\n", l_u32StartAdd );
}
}



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

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
6
最后登录
2020-10-23
 楼主| 发表于 2020-10-23 13:53:58 | 显示全部楼层
void Flash_Erase_Data( unsigned int l_u32StartAdd, unsigned int *l_pu32DataBufferStartAdd, unsigned char l_u8DataCnt )
{
        flash_security_state_t l_stflash_security_state;
       
        if( FLASH_NORMAL == Get_Flash_State() )
        {
                if( kStatus_FLASH_Success != FLASH_GetSecurityState( &g_stflash_config, &l_stflash_security_state ) )
                {
                        printf("flash get security failed !\r\n");
                        g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
                }
                else
                {
                        if ( kFLASH_SecurityStateNotSecure != l_stflash_security_state )
                        {
                                printf("flash is secure !\r\n");
                                g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
                        }
                        else
                        {
                                if( kStatus_FLASH_Success != FLASH_Erase(&g_stflash_config, l_u32StartAdd, l_u8DataCnt, kFLASH_ApiEraseKey) )
                                {
                                        printf("flash eraser add 0X%x failed \r\n", l_u32StartAdd);
                                        g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
                                }
                                else
                                {
                                        if( kStatus_FLASH_Success != FLASH_VerifyErase(&g_stflash_config, l_u32StartAdd, l_u8DataCnt, kFLASH_MarginValueUser) )
                                        {
                                                printf("flash verify eraser add 0X%x failed \r\n", l_u32StartAdd);
                                                g_stFlashWorkInfo.m_enFlashState = FLASH_ABNORMAL;
                                        }
                                        else
                                        {
                                                printf("flash verify eraser add 0X%x ok \r\n", l_u32StartAdd);
                                        }
                                }
                        }
                }
        }
  else
        {
                printf( "flash state err before eraser 0X%x \r\n", l_u32StartAdd );
        }
}
更正一下擦除程序,是这个 总是打印printf("flash eraser add 0X%x failed \r\n", l_u32StartAdd);
回复 支持 反对

使用道具 举报

该用户从未签到

655

主题

6311

帖子

0

超级版主

Rank: 8Rank: 8

积分
19924
最后登录
2024-4-19
发表于 2020-10-29 10:07:27 | 显示全部楼层
你试试sdk的例程,先排除芯片问题。然后debug一下,看看get_index的问题还是首地址的问题,或者是不是user key的问题。一般这个问题都是解锁没有成功导致的删除错误。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 12:07 , Processed in 0.114294 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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