#include "FLASH.h" #include "usart.h" #include "stdio.h" #include // 包含 strlen 的头文件 /*************下面所有的数都必须是4字节对齐的******************/ extern uint32_t W25_Tempaddress; extern uint32_t wifior4G_flag; /*************************************************************** * 函数名称: Flash_GetBank * 说 明: 获得传入地址所在Bank * 参 数: faddr,Flash地址 * 返 回 值: Bank值 ***************************************************************/ uint32_t Flash_GetBank(uint32_t faddr) { if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE_Pos) == 0) { if (faddr < (FLASH_BASE + FLASH_BANK_SIZE)) return FLASH_BANK_1; else return FLASH_BANK_1; } else { if (faddr < (FLASH_BASE + FLASH_BANK_SIZE)) // bank swap return FLASH_BANK_1; else return FLASH_BANK_1; } } /*************************************************************** * 函数名称: Flash_GetPage * 说 明: 获得传入地址所在Page * 参 数: faddr,Flash地址 * 返 回 值: Bank值 ***************************************************************/ uint32_t Flash_GetPage(uint32_t faddr) { if (faddr < (FLASH_BASE + FLASH_BANK_SIZE)) return (faddr - FLASH_BASE) / FLASH_PAGE_SIZE; else return (faddr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE; } /*************************************************************** * 函数名称: Flash_ReadOneWord * 说 明: 从指定地址中读取一个32位的数据 * 参 数: faddr,Flash地址 * 返 回 值: Flash地址内的一个32位的数据 ***************************************************************/ uint32_t Flash_ReadOneWord(uint32_t faddr) { return *(__IO uint32_t *)faddr; } /*************************************************************** * 函数名称: Flash_ErasePages * 说 明: 擦除页 * 参 数: faddr,起始地址 * fdataNum,要擦除的字数,实际上也是整页擦除 * 返 回 值: 无 ***************************************************************/ void Flash_ErasePages(uint32_t faddr,uint32_t fdataNum) { if(fdataNum == 0||faddr>FLASH_ADDR_MAX) { return; } uint32_t PageError = 0; HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef FLASH_EraseInitSturcture; __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); FLASH_EraseInitSturcture.TypeErase = FLASH_TYPEERASE_PAGES; FLASH_EraseInitSturcture.Banks = Flash_GetBank(faddr); FLASH_EraseInitSturcture.Page = Flash_GetPage(faddr); FLASH_EraseInitSturcture.NbPages = Flash_GetPage(faddr + 4 * fdataNum - 1) - FLASH_EraseInitSturcture.Page + 1; if(HAL_FLASHEx_Erase(&FLASH_EraseInitSturcture,&PageError) != HAL_OK) { HAL_FLASH_Lock(); return; } } /*************************************************************** * 函数名称: Flash_WriteOneWord * 说 明: 向指定地址中写入一个32位的数据 * 参 数: faddr,Flash地址 * fdata32,Flash地址内的一个32位的数据 * 返 回 值: 写FLASH返回的状态 ***************************************************************/ uint8_t Flash_WriteOneWord(uint32_t faddr,uint32_t fdata32) { if(faddrFLASH_ADDR_MAX) //地址小于STM32L431RC的flash地址最大值 return; for(i=0;iFLASH_ADDR_MAX) //地址小于STM32L431RC的flash地址最大值 return; for(i=0;i