| | |
| | | #include "Functions.h" |
| | | #include "string.h" |
| | | #include "BSP.h" |
| | | #include "stm32f0xx_ll_flash.h" |
| | | |
| | | /* USER CODE END Includes */ |
| | | |
| | |
| | | } |
| | | |
| | | #define ApplicationAddress 0x08001000 //应用程序首地址定义 |
| | | #define NewAppInfoBlockAddress 0x08020000 // 存储的新应用程序信息块的地址 |
| | | #define NewAppAddress 0x08021000 // 存储的新应用程序的地址 |
| | | #define NEW_APP_INFOBLOCK_ADDR 0x08020000 // 存储的新应用程序信息块的地址 |
| | | #define NEW_APP_ADDR 0x08021000 // 存储的新应用程序的地址 |
| | | //#define FLASH_PAGESIZE (0x00000400) //Page Size = 1K |
| | | |
| | | |
| | |
| | | |
| | | int EraseFlashMem(void * pAddrFlash, unsigned int Pages) |
| | | { |
| | | HAL_StatusTypeDef res; |
| | | res = HAL_FLASH_Unlock(); |
| | | uint32_t ErrNo; |
| | | FLASH_EraseInitTypeDef erase1; |
| | | erase1.NbPages=Pages; |
| | | erase1.PageAddress=(unsigned int)pAddrFlash; |
| | | erase1.TypeErase=FLASH_TYPEERASE_PAGES; |
| | | res = HAL_FLASHEx_Erase(&erase1,&ErrNo); |
| | | res = HAL_FLASH_Lock(); |
| | | ErrorStatus res; |
| | | res = LL_Flash_Unlock(); |
| | | // uint32_t ErrNo; |
| | | res = LL_Flash_PageErase(pAddrFlash,Pages); |
| | | LL_FLASH_Lock(FLASH); |
| | | return res; |
| | | } |
| | | |
| | | int EraseAndWriteToFlashMem(void * pBuf, void * pAddrFlash, unsigned int nByteSize) |
| | | { |
| | | |
| | | HAL_StatusTypeDef res; |
| | | res = HAL_FLASH_Unlock(); |
| | | uint32_t ErrNo; |
| | | FLASH_EraseInitTypeDef erase1; |
| | | erase1.NbPages= (nByteSize-1) / FLASH_PAGE_SIZE + 1; |
| | | erase1.PageAddress=(unsigned int)pAddrFlash; |
| | | erase1.TypeErase=FLASH_TYPEERASE_PAGES; |
| | | res = HAL_FLASHEx_Erase(&erase1,&ErrNo); |
| | | |
| | | |
| | | ErrorStatus res; |
| | | res = LL_Flash_Unlock(); |
| | | // __disable_irq(); |
| | | int NbPages = (nByteSize-1) / FLASH_PAGE_SIZE + 1; |
| | | // FLASH_EraseInitTypeDef erase1; |
| | | // erase1.NbPages=(nByteSize-1) / FLASH_PAGE_SIZE + 1;; |
| | | // erase1.PageAddress=(unsigned int)pAddrFlash; |
| | | // erase1.TypeErase=FLASH_TYPEERASE_PAGES; |
| | | res = LL_Flash_PageErase(pAddrFlash,NbPages); |
| | | for (int i=0;i<(nByteSize+1)/2;i++) |
| | | { |
| | | res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)pAddrFlash + i*2, ((uint16_t *)pBuf)[i]); |
| | | if ((i&0x7ff) == 0) {ToggleRunLed(); ToggleErrLed();} |
| | | unsigned short value = ((uint8_t *)pBuf)[i*2] + (((uint8_t *)pBuf)[i*2 +1] << 8); |
| | | res = LL_FLASH_Program(ProgaraType_DATA16, (uint32_t)pAddrFlash + i*2, value); |
| | | if (res == ERROR) break; |
| | | } |
| | | |
| | | res = HAL_FLASH_Lock(); |
| | | // __enable_irq(); |
| | | LL_FLASH_Lock(FLASH); |
| | | |
| | | return res; |
| | | } |
| | |
| | | SetErrLed(0); //Turn Off Err Led |
| | | // check for app update |
| | | ///* |
| | | int FlashSize = *(unsigned short *)FLASHSIZE_BASE; |
| | | int NewAppAddress ; |
| | | int NewAppInfoBlockAddress ; |
| | | if (FlashSize == 64) { |
| | | NewAppInfoBlockAddress = 0x08008000; |
| | | NewAppAddress = 0x08009000U; |
| | | }else if (FlashSize == 256) { |
| | | NewAppInfoBlockAddress = 0x08020000; |
| | | NewAppAddress = 0x08021000U; |
| | | } |
| | | |
| | | pNewAppInfoBlock ptheNewAppInfoBlock = (pNewAppInfoBlock) NewAppInfoBlockAddress; |
| | | if (ptheNewAppInfoBlock->Sign == 0x55AA) |
| | | { |
| | | //check length and CRC; |
| | | int length = ptheNewAppInfoBlock->Length; |
| | | int nCRC = crc16table((uint8_t *)NewAppAddress,length); |
| | | int nCRC; // = crc16table((uint8_t *)NewAppAddress,length); |
| | | nCRC = crc16bitbybit((uint8_t *)NewAppAddress,length); |
| | | if (nCRC == ptheNewAppInfoBlock->nCRC) |
| | | { |
| | | // copy program |