From 842bb64195f958b050867c50db66fc0aa413dafb Mon Sep 17 00:00:00 2001 From: QuakeGod <quakegod@sina.com> Date: 星期六, 27 七月 2024 10:42:56 +0800 Subject: [PATCH] KBus upgrade --- C8T6_BootLoader/Src/main.c | 117 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 90 insertions(+), 27 deletions(-) diff --git a/C8T6_BootLoader/Src/main.c b/C8T6_BootLoader/Src/main.c index 77365f5..d874889 100644 --- a/C8T6_BootLoader/Src/main.c +++ b/C8T6_BootLoader/Src/main.c @@ -46,6 +46,7 @@ #include "Functions.h" #include "string.h" #include "BSP.h" +#include "stm32f0xx_ll_flash.h" /* USER CODE END Includes */ @@ -57,6 +58,57 @@ unsigned char SlowFlicker=0; unsigned char FastFlicker=0; + +typedef struct tagInfoBlockHdr { + unsigned short nBlkSign; // 寮�濮嬫爣蹇� + unsigned short nBlkTypeVer; // 绫诲瀷鍜岀増鏈� + unsigned short nBlkSize; // Block 澶у皬, 鍖呮嫭寮�濮嬪拰缁撴潫鏍囧織 + unsigned short Pad1; +}stInfoBlockHdr; + +typedef struct tagInfoBlockTail { + + unsigned short CRC16; + unsigned short EndSign; +}stInfoBlockTail; + +typedef struct tagBtLdrInfoBlock { + stInfoBlockHdr Hdr; + unsigned short nBtldrVer; + unsigned short nBtldrDevice; + unsigned short nBtldrSize; // 璁捐澶у皬 + unsigned short nBtldrDataSize; //浠g爜澶у皬 + unsigned int nBtldr_AppAddr; + unsigned int nBtldr_NewAppInfoAddr; + unsigned int nBtldr_NewAppAddr; + stInfoBlockTail tail; +}stBtLdrInfoBlock; +// /* +typedef struct { + uint32_t addr_Code_RO_Data_limit; + +}addr_data_def; +// */ +extern int Region$$Table$$Base; +addr_data_def const * paddr = (addr_data_def *)&Region$$Table$$Base; + +const stBtLdrInfoBlock theBtldrInfoBlock __attribute__((at(0x08000100))) = { + 0xAA55, // StartSign + 0x0101, // BlockType + sizeof(stBtLdrInfoBlock), //BlockSize + 0, // Pad, + 0x0100, //BtLdrVer + 0x0100, //BtLdrDevice; + 0x1000, //BtLdrSize; + 0x0C00, //BtLdrDataSize; + 0x08001000, //nBtldr_AppAddr + (int)&Region$$Table$$Base, //nBtldr_NewAppInfoAddr + 0x08009000, //nBtldr_NewAppAddr + 0xEEEE, //crc16; + 0xAA55 //EndSign; +}; + +// const int END_SIGN __attribute__((at(0x08000FD8))); // = 0x55aa; uint32_t us1,us2,us3,us4,us5,us6; @@ -73,6 +125,7 @@ /* USER CODE BEGIN 0 */ /* Table of CRC values for high-order byte */ +/* const uint8_t crctablehi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, @@ -93,7 +146,9 @@ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; +*/ /* Table of CRC values for low-order byte */ +/* const uint8_t crctablelo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, @@ -114,7 +169,8 @@ 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; - +*/ +/* uint16_t crc16table(const uint8_t *ptr, uint16_t len) { uint8_t crchi = 0xff; @@ -128,6 +184,7 @@ } return (crchi << 8 | crclo); } +*/ void HAL_SYSTICK_Callback(void) { @@ -142,8 +199,8 @@ } #define ApplicationAddress 0x08001000 //搴旂敤绋嬪簭棣栧湴鍧�瀹氫箟 -#define NewAppInfoBlockAddress 0x08008000 // 瀛樺偍鐨勬柊搴旂敤绋嬪簭淇℃伅鍧楃殑鍦板潃 -#define NewAppAddress 0x08009000 // 瀛樺偍鐨勬柊搴旂敤绋嬪簭鐨勫湴鍧� +#define NEW_APP_INFOBLOCK_ADDR 0x08008000 // 瀛樺偍鐨勬柊搴旂敤绋嬪簭淇℃伅鍧楃殑鍦板潃 +#define NEW_APP_ADDR 0x08009000 // 瀛樺偍鐨勬柊搴旂敤绋嬪簭鐨勫湴鍧� typedef struct tagNewAppInfoBlock { @@ -186,38 +243,32 @@ 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; + 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); + if (res == ERROR) return 1; return res; } @@ -268,12 +319,24 @@ 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 @@ -298,7 +361,7 @@ LL_mDelay(100); // ToggleRunLed(); -// ToggleErrLed(); + ToggleErrLed(); ToggleErr2Led(); // LL_IWDG_ReloadCounter(IWDG); -- Gitblit v1.9.1