#include "main.h" #include "soft_flash.h" #include #include "soft_crc.h" #include "stm32f3xx_hal.h" extern UART_HandleTypeDef huart2; //FLASH 擦除 void flash_erase(uint32_t addr) { HAL_StatusTypeDef erase_status; FLASH_EraseInitTypeDef f; f.TypeErase = FLASH_TYPEERASE_PAGES; f.PageAddress = addr; f.NbPages = 1; uint32_t PageError = 0; erase_status = HAL_FLASHEx_Erase(&f, &PageError); if (erase_status != HAL_OK) { } } //FLASH写 uint32_t Flash_WriteData(uint32_t addr, uint16_t *data, uint16_t Size) { static uint32_t flash_count = 0; __disable_irq(); HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);//清除一些错误标志 //一页2kb if(flash_count == 0 || flash_count == 17) { flash_erase(addr);//擦除指定的闪存扇区(0~11) flash_count = 1; } uint16_t TempBuf = 0; for (uint16_t i = 0; i < Size; i++) { TempBuf = *(data + i); HAL_StatusTypeDef a = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i * 2, TempBuf); if (a != HAL_OK) { HAL_FLASH_Lock(); __enable_irq(); return WRITE_FAIL; } } HAL_FLASH_Lock(); __enable_irq(); flash_count++; return WRITE_SUCCESS; } bool wirte_update_flag() { HAL_StatusTypeDef status; __disable_irq(); HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); flash_erase(FLASH_UPDATE_ADDR); status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_UPDATE_ADDR, 0XF); HAL_FLASH_Lock(); __enable_irq(); if(status == HAL_OK) return true; else return false; } //FLASH读地址 uint16_t ReadFlashNBtye(uint32_t ReadAddress, uint16_t *ReadBuf, int32_t ReadNum) { int DataNum = 0; uint16_t up_flag = 0; *ReadBuf = *(__IO uint16_t *)ReadAddress; up_flag = *ReadBuf; DataNum++; return up_flag; } //读取标志位 uint32_t flash_read_updata_flag(void) { uint16_t temp_buff = 0; uint32_t Address = 0; temp_buff = ReadFlashNBtye(FLASH_UPDATE_ADDR, (uint16_t *)&Address, 1); return temp_buff; } int pmu_sn = 0; int pmu_hardversion = 0; void flash_ready_SN_and_VERSION(void) { uint16_t temp_buff = 0,temp_buff2 = 0; uint32_t Address = 0; temp_buff = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 10, (uint16_t *)&Address, 1); temp_buff2 = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 12, (uint16_t *)&Address, 1); pmu_sn = temp_buff + (temp_buff2 << 16); temp_buff = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 14, (uint16_t *)&Address, 1); temp_buff2 = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 16, (uint16_t *)&Address, 1); pmu_hardversion = temp_buff + (temp_buff2 << 16); }