stm32l071cbt6片内flash操作

今天在看片内flash的操作,发现按照下面的操作并没有写成功:

    unsigned long temp = 0x12345678;

    HAL_FLASH_Unlock();
    FLASH_PageErase(APPLICATION_B_ADDRESS)
    status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,APPLICATION_B_ADDRESS,temp);
    HAL_FLASH_Lock();
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)
{
  HAL_StatusTypeDef status = HAL_ERROR;
  
  /* Process Locked */
  __HAL_LOCK(&pFlash);

  /* Check the parameters */
  assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
  assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));

  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
  
  if(status == HAL_OK)
  {
    /* Clean the error context */
    pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

    /*Program word (32-bit) at a specified address.*/
    *(__IO uint32_t *)Address = Data;

    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
  }

  /* Process Unlocked */
  __HAL_UNLOCK(&pFlash);

  return status;
}

但是下面这个函数的返回值是HAL_OK的,误导性太大了,让我一时不知道怎么去查。

status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,APPLICATION_B_ADDRESS,temp);

 

我花了一下午时间对着手册寄存器去查问题,直接说结果吧:

    FLASH_EraseInitTypeDef f;
    HAL_StatusTypeDef status = HAL_OK;
    uint32_t PageError = 0;
    
    f.TypeErase = FLASH_TYPEERASE_PAGES;
    f.PageAddress = address;
    f.NbPages = page_cnt;                                
    status = HAL_FLASHEx_Erase(&f, &PageError);

erase用这个函数就没问题了,唯一的区别就是多了两个清除标志位的操作:

      FLASH_PageErase(address);

      /* Wait for last operation to be completed */
      status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

      /* If the erase operation is completed, disable the ERASE Bit */
      CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
      CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);

就写到这里吧。

 

转载于:https://www.cnblogs.com/kent-hu/p/8406229.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值