zoukankan      html  css  js  c++  java
  • 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);

    就写到这里吧。

  • 相关阅读:
    Python+Selenium+PhantomJS下载JavaScript异步加载网页
    Java模拟post提交表单数据
    在nltk中调用stanfordparser处理中文
    Clustering text documents using k-means
    Classification of text documents: using a MLComp dataset
    Analyzing the Meaning of Sentences
    Identifying Dialogue Act Type
    jquery $.ajax()获取服务器上的json数据
    关于ie6中存在的最小的高度
    让两个元素水平对齐
  • 原文地址:https://www.cnblogs.com/kent-hu/p/8406229.html
Copyright © 2011-2022 走看看