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