| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #include "main.h"
- #include "soft_flash.h"
- #include <string.h>
- #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);
- }
|