今天在看片內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);
就寫到這里吧。