Commit 46017036 authored by 郑萍's avatar 郑萍

Merge branch 'dev' of http://tyw-server.synology.me:12345/shihao/haojin750tft into zhengping

parents 9a5930b0 e4e01dc8
...@@ -27,4 +27,4 @@ void BackLight_Process(void); ...@@ -27,4 +27,4 @@ void BackLight_Process(void);
#endif #endif
\ No newline at end of file
...@@ -37,6 +37,9 @@ s_AMT630H_FlashCheck_t AMT630H_FlashCheck; ...@@ -37,6 +37,9 @@ s_AMT630H_FlashCheck_t AMT630H_FlashCheck;
unsigned long Delay_Time = 0; unsigned long Delay_Time = 0;
unsigned long Delay_Time_Set = 0; unsigned long Delay_Time_Set = 0;
extern uint32_t Check_Upgrade;
extern uint32_t Check_Upgrade_Cnt;
/* Refresh Time */ /* Refresh Time */
unsigned long AMT630H_RefreshTime = 0; unsigned long AMT630H_RefreshTime = 0;
static uint8_t AMT630H_Animation_Start = 0; static uint8_t AMT630H_Animation_Start = 0;
...@@ -306,6 +309,8 @@ void Amt630hInit(void) ...@@ -306,6 +309,8 @@ void Amt630hInit(void)
AMT630H_FlashCheck.InquireTime = 0; AMT630H_FlashCheck.InquireTime = 0;
AMT630H_FlashCheck.CheckStateTime = 0; AMT630H_FlashCheck.CheckStateTime = 0;
AMT630H_FlashCheck.Result = 0; AMT630H_FlashCheck.Result = 0;
Check_Upgrade = 0;
Check_Upgrade_Cnt = 0;
} }
void AMT630H_Sleep(void) void AMT630H_Sleep(void)
{ {
......
...@@ -39,4 +39,4 @@ void AMT630H_Main(void); ...@@ -39,4 +39,4 @@ void AMT630H_Main(void);
unsigned char AMT630H_isInitFinish(void); unsigned char AMT630H_isInitFinish(void);
extern uint32_t Amt630hInitTimerCnts ; extern uint32_t Amt630hInitTimerCnts ;
#endif #endif
\ No newline at end of file
#include <string.h>
#include "UartProtocol.h" #include "UartProtocol.h"
#include "PicBin.h" #include "PicBin.h"
#include <stdint.h> #include <stdint.h>
#include "UDS_ISO14229_Services.h"
#include "flash.h"
#define NULL 0 #define NULL 0
extern uint8_t UartRevBuff[0x1000]; extern uint8_t UartRevBuff[0x1000];
extern uint32_t UartRevCnts; extern uint32_t UartRevCnts;
uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos) uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos)
{ {
*UartRecvBufLen = 0x1000; *UartRecvBufLen = 0x1000;
...@@ -72,7 +77,7 @@ void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal) ...@@ -72,7 +77,7 @@ void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal)
} }
/***************** Read 630 ************************/ /***************** Read 630 ************************/
#define READ_MCU_DATA_MAX 0x800 #define READ_MCU_DATA_MAX 0x40
enum { enum {
READ630_IDLE, READ630_IDLE,
READ630_WAITING_RESP, READ630_WAITING_RESP,
...@@ -82,6 +87,13 @@ enum { ...@@ -82,6 +87,13 @@ enum {
READ630_RECV_BACKUP_DATA_CRC, READ630_RECV_BACKUP_DATA_CRC,
}; };
uint8_t ReadDataBuf[READ_MCU_DATA_MAX]; /* 读取缓存 */
uint32_t NeedWriteSize; /* 需要写入文件的长度 */
uint32_t FactOffset; /* 绝对地址 */
uint32_t AppOffset;
uint32_t Check_Upgrade;
uint32_t Check_Upgrade_Cnt;
static uint8_t Read630State = READ630_IDLE; static uint8_t Read630State = READ630_IDLE;
static uint32_t ReqDataBufAddr = 0; static uint32_t ReqDataBufAddr = 0;
static uint32_t ReqDataLen = 0; static uint32_t ReqDataLen = 0;
...@@ -171,177 +183,111 @@ void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_ ...@@ -171,177 +183,111 @@ void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_
} }
/***************** Read 630 end ************************/ /***************** Read 630 end ************************/
/* Test */ void GetReadInfo(READ_ARK630_CMD type)
static uint8_t TestReadBuf[READ_MCU_DATA_MAX];
static uint32_t TestDataLen = 0;
static uint32_t TestDataCrC = 0;
static uint32_t ReadOffset = 0;
static uint32_t CalcCrcVal = 0xffffffff;
static uint32_t TestCycleNum = 0;
static uint32_t CalcCrc32(uint8_t *buf, int Len, uint32_t InitVal)
{ {
int i;
int n = 0;
uint32_t crc = InitVal; // Initial value
for (n = 0; n < Len; n++) {
crc ^= (uint32_t)buf[n] << 24; // crc ^= *data; data++;
for (i = 0; i < 8; ++i) {
if (crc & 0x80000000) {
crc = (crc << 1) ^ 0x04C11DB7; // 0xEDB88320= reverse 0x04C11DB7
} else {
crc = (crc << 1);
}
}
}
return crc;
}
void TestRead630Update(void)
{
uint32_t tmpLen;
static uint8_t readSt = 0; static uint8_t readSt = 0;
static uint16_t getStRetryCnts = 0; static uint16_t getStRetryCnts = 0;
if (TestDataLen == 0) { uint32_t tmpRet;
if (readSt == 0) {
if (NeedWriteSize == 0)
{
if (readSt == 0)
{
readSt = 1; readSt = 1;
ProcMcuOrBackupData(GET_APP_DATA_OFFSET, 0, 0, 0); ProcMcuOrBackupData(type, 0, 0, 0); /* 获取偏移地址 */
getStRetryCnts = 500; getStRetryCnts = 500;
} else {
TestDataLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
if ((TestDataLen != 0) || (--getStRetryCnts == 0)) {
if (TestDataLen != 0) {
TestDataLen = RespDataLen;
TestDataCrC = RespDataCrc;
ReadOffset = 0;
CalcCrcVal = 0xffffffff;
}
readSt = 0;
}
} }
} else { else
if (readSt == 0) { {
readSt = 1; tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
ProcMcuOrBackupData(REQ_DATA, ReadOffset, READ_MCU_DATA_MAX, TestReadBuf); if ((tmpRet != 2) || (--getStRetryCnts == 0)) /* 非零值为获得的程序地址 */
getStRetryCnts = 500; {
ReadOffset += READ_MCU_DATA_MAX; if (tmpRet != 2)
} else { {
tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); NeedWriteSize = 32; /* 此时的NeedWriteSize不重要, 只要跳出循环就行 */
if (ReadOffset == tmpLen) { if (type == GET_APP_DATA_OFFSET)
if (ReadOffset < TestDataLen) { {
CalcCrcVal = CalcCrc32(TestReadBuf, READ_MCU_DATA_MAX, CalcCrcVal); FactOffset = 0; /* USB按相对地址获取数据 */
readSt = 0;
} else {
CalcCrcVal = CalcCrc32(TestReadBuf, TestDataLen - (ReadOffset - READ_MCU_DATA_MAX), CalcCrcVal);
if (CalcCrcVal != TestDataCrC) {
while (1) {
RTE_WDT_Clear();
}
} else {
TestCycleNum++;
} }
getStRetryCnts = 500; AppOffset = 0x00;
TestDataLen = 0;
TestDataCrC = 0;
readSt = 0;
} }
}
if (--getStRetryCnts == 0) {
ReadOffset -= READ_MCU_DATA_MAX;
readSt = 0; readSt = 0;
} }
} }
} }
} }
/* Test end */
/* Test */ /**
static uint32_t TestBackupDataLen = 0; * @brief 检查Flash中的MCU程序信息, 是否与当前运行的MCU_APP信息相同, 若不同, 则进入升级模式
static uint32_t TestBackupDataOffset = 0; */
static uint32_t TestBackupDataOffsetEnd = 0; void Check_MCU_in_Flash(READ_ARK630_CMD type)
static uint32_t TestBackupDataCrc = 0;
static uint8_t *pData = (uint8_t*)0x40400;
void TestWrite630Backup(void)
{ {
static int readstep = 0;
uint32_t tmpRet;
static uint8_t readSt = 0; static uint8_t readSt = 0;
static uint16_t getStRetryCnts = 0; static uint16_t getStRetryCnts = 0;
TestBackupDataLen = 0x100000; uint32_t tmpLen;
if (TestBackupDataOffset == 0) { uint8_t saveVersion[16];
if (readSt == 0) { uint8_t readVersion[16];
readSt = 1;
ProcMcuOrBackupData(GET_BACKUP_DATA_OFFSET, 0, 0, NULL); if (NeedWriteSize != 0)
getStRetryCnts = 500; {
} else { if (readSt == 0)
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, NULL); {
if ((tmpRet != 2) || (--getStRetryCnts == 0)) {
if (tmpRet != 2) {
TestBackupDataOffset = tmpRet;
TestBackupDataOffsetEnd = TestBackupDataOffset + TestBackupDataLen;
}
readSt = 0;
}
}
} else if (TestBackupDataCrc == 0) {
if (readSt == 0) {
readSt = 1; readSt = 1;
ProcMcuOrBackupData(GET_BACKUP_DATA_CRC, TestBackupDataOffset, TestBackupDataLen, NULL); (void)memset(ReadDataBuf, 0xFFU, sizeof(ReadDataBuf)); /* 初始化buffer */
ProcMcuOrBackupData(REQ_DATA, FactOffset, READ_MCU_DATA_MAX, ReadDataBuf); // 按地址获取程序数据
getStRetryCnts = 500; getStRetryCnts = 500;
} else {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, NULL);
if ((tmpRet != 2) || (--getStRetryCnts == 0)) {
if (tmpRet != 2) {
TestBackupDataCrc = tmpRet;
}
readSt = 0;
}
} }
} else { else
#if 1 {
if (readSt == 0) { tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); /* 获取读取状态 */
readSt = 1; if (FactOffset + READ_MCU_DATA_MAX == tmpLen) /* 当返回值为目标位置时为数据获取成功 */
ProcMcuOrBackupData(REQ_DATA, TestBackupDataOffset, READ_MCU_DATA_MAX, TestReadBuf); {
getStRetryCnts = 500; if (AppOffset == 0) /* 首个数据块内解析文件信息 */
TestBackupDataOffset += READ_MCU_DATA_MAX; {
} else { if (type == GET_APP_DATA_OFFSET) /* 从 MCU_APP 升级文件 */
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); {
if (TestBackupDataOffset == tmpRet) { flash_read(FLASH_630H_UPDATE_INFO, sizeof(saveVersion), saveVersion); /* 读取630H升级记录 */
if (TestBackupDataOffset < TestBackupDataOffsetEnd) {
readSt = 0; memcpy(readVersion, &ReadDataBuf[16], 16); /* 630中读出的版本信息 */
} else { if (memcmp(readVersion, saveVersion, 16) != 0) /* 对比版本不同才更新 */
readSt = 0; {
Get_Into_630H_Update_MCU_Mode();
}
else
{
/* 信息相同, 重置状态 */
NeedWriteSize = 0;
Check_Upgrade = 0;
readSt = 0;
}
}
} }
} }
if (--getStRetryCnts == 0) { if (--getStRetryCnts == 0)
TestBackupDataOffset -= READ_MCU_DATA_MAX; {
/* 读信息超时, 重置状态 */
readSt = 0; readSt = 0;
} }
} }
#else }
if (readSt == 0) { }
readSt = 1;
ProcMcuOrBackupData(WRITE_BACKUP_DATA, TestBackupDataOffset, READ_MCU_DATA_MAX, pData); void Check_MCU_Info_in_630H(void)
getStRetryCnts = 1500; {
TestBackupDataOffset += READ_MCU_DATA_MAX;
pData += READ_MCU_DATA_MAX; if(Check_Upgrade == 1U)
} else { {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); GetReadInfo(GET_APP_DATA_OFFSET);
if (TestBackupDataOffset == tmpRet) { Check_MCU_in_Flash(GET_APP_DATA_OFFSET);
if (TestBackupDataOffset < TestBackupDataOffsetEnd) { }
readSt = 0; else
} else { {
readSt = 0; Check_Upgrade_Cnt++;
} if(Check_Upgrade_Cnt >= 2500U) /* 放在2ms任务中, 2500 = 5000ms */
} {
if (--getStRetryCnts == 0) { Check_Upgrade_Cnt = 0;
TestBackupDataOffset -= READ_MCU_DATA_MAX; Check_Upgrade = 1U;
pData -= READ_MCU_DATA_MAX;
readSt = 0;
}
} }
#endif
} }
} }
/* Test end */
#include "Key_user.h" #include "Key_user.h"
#include "Components.h" #include "Components.h"
#include "UDS_ISO14229_Services.h"
__align(4) __align(4)
...@@ -27,6 +27,8 @@ void Key_Operation_Left(Key_Event_en_t enKeyEvent)//选择 ...@@ -27,6 +27,8 @@ void Key_Operation_Left(Key_Event_en_t enKeyEvent)//选择
case KEY_EVENT_LONG_PRESS_3: //5s case KEY_EVENT_LONG_PRESS_3: //5s
break; break;
case KEY_EVENT_LONG_PRESS_4: //10s case KEY_EVENT_LONG_PRESS_4: //10s
/* 进入630H升级MCU模式 */
Get_Into_630H_Update_MCU_Mode();
break; break;
case KEY_EVENT_OFF_TO_ON: case KEY_EVENT_OFF_TO_ON:
break; break;
......
...@@ -426,4 +426,4 @@ void Menu_User_WAKEUP(void); ...@@ -426,4 +426,4 @@ void Menu_User_WAKEUP(void);
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
#endif #endif
\ No newline at end of file
...@@ -15,10 +15,10 @@ typedef enum ...@@ -15,10 +15,10 @@ typedef enum
extern uint32_t flash_protect_flag; extern uint32_t flash_protect_flag;
int EraseChip (uint32_t adr); extern int EraseChip (uint32_t adr);
int EraseSector (uint32_t adr); extern int EraseSector (uint32_t adr);
int ProgramPage (uint32_t adr, uint32_t sz, uint8_t *buf); extern int ProgramPage (uint32_t adr, uint32_t sz, uint8_t *buf);
FLASH_STATUS flash_write(uint32_t adr, uint32_t sz, uint8_t *buf); extern FLASH_STATUS flash_write(uint32_t adr, uint32_t sz, uint8_t *buf);
void flashRead(uint8_t *read_address, uint16_t size, uint8_t *readbuf); extern void flash_read(uint32_t read_address, uint16_t size, uint8_t *readbuf);
#endif #endif
...@@ -255,16 +255,15 @@ FLASH_STATUS flash_write(uint32_t adr, uint32_t sz, uint8_t *buf) ...@@ -255,16 +255,15 @@ FLASH_STATUS flash_write(uint32_t adr, uint32_t sz, uint8_t *buf)
return (status); return (status);
} }
void flashRead(uint8_t *read_address, uint16_t size, uint8_t *readbuf) void flash_read(uint32_t read_address, uint16_t size, uint8_t *readbuf)
{ {
uint8_t *w_ptr; uint8_t *w_ptr;
uint32_t i; uint32_t i;
w_ptr = (uint8_t *)read_address; w_ptr = (uint8_t *)read_address;
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
*readbuf = *w_ptr++; *readbuf = *w_ptr++;
readbuf++; readbuf++;
} }
} }
......
...@@ -20,6 +20,7 @@ void Sys_2ms_Tasks(void) ...@@ -20,6 +20,7 @@ void Sys_2ms_Tasks(void)
Sys_Status_Update_Service(); Sys_Status_Update_Service();
Analog_Signal_Conv_Service(); Analog_Signal_Conv_Service();
AMT630H_Main(); AMT630H_Main();
/* Check_MCU_Info_in_630H(); */
DoCAN_Timer_Update(2000u); DoCAN_Timer_Update(2000u);
//Can_Write_Fun(&CAN_CH0_CanMsgTxOp, 2000u);无外发 //Can_Write_Fun(&CAN_CH0_CanMsgTxOp, 2000u);无外发
CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 2u); CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 2u);
......
This diff is collapsed.
...@@ -26,15 +26,26 @@ ...@@ -26,15 +26,26 @@
#include "UDS_ISO14229_Server_Config.h" #include "UDS_ISO14229_Server_Config.h"
/******************************************************************************
program version
*******************************************************************************/
#define SWV 0x100 // 0x100 = 1.00 software version 软件版本号
#define HWV 0x100 // 0x100 = 1.00 hardware version 硬件版本号
#define BTV 0x100 // 0x100 = 1.00 bootloader version boot程序版本号
#define internal_version (105UL) /* 内部版本号 105 -> 1.05 */
#define internal_date (20240805UL) /* 内部版本日期 20240805 -> 2024.08.05 */
/** /**
*DFlash *DFlash
*/ */
#define NoNeedWait 0x00u #define NoNeedWait 0x00u
#define NeedWait 0x01u #define NeedWait 0x01u
#define APP_STATUS_ADDR (0x501000) #define FLASH_APP_STATUS_INFO (0x00501000UL) /* APP 程序有效性标识地址 */
#define APP_DATA_INFO (0x501400) #define FLASH_SECOND_BOOT_INFO (0x00501400UL) /* 二级Boot程序状态地址 */
#define APP_DATA_WRITE (0x501800) #define FLASH_630H_UPDATE_INFO (0x00501800UL) /* 630H升级信息 */
#define FLASH_APP_RODATA_INFO (0x00501C00UL) /* 存储只读DID信息 */
#define FLASH_APP_RWDATA_INFO (0x00502000UL) /* 存储可写的DID信息 */
#define Data_Flash_Addr_BootValid_OFFSET 0x00000000 #define Data_Flash_Addr_BootValid_OFFSET 0x00000000
#define Data_Flash_Addr_DiagReceive_OFFSET 0x00002000 #define Data_Flash_Addr_DiagReceive_OFFSET 0x00002000
...@@ -313,41 +324,6 @@ ...@@ -313,41 +324,6 @@
#define CheckSumErr 7 // Checksum Error #define CheckSumErr 7 // Checksum Error
#define UnknownPartID 8 // Unknown Part ID #define UnknownPartID 8 // Unknown Part ID
#define SWV 0x100 // 0x100 = 1.00 software version 软件版本号
#define HWV 0x100 // 0x100 = 1.00 hardware version 硬件版本号
#define BTV 0x100 // 0x100 = 1.00 bootloader version boot程序版本号
#define INTLV 0x100 // 0x100 = 1.00 internal version 内部版本号
#define PROG_Y 0x24 // 0x24 = 2024年, program year
#define PROG_M 0x07 // 0x03 = 3月, program month
#define PROG_D 0x16 // 0x19 = 19日, program day
typedef struct
{
uint32_t Flag;
uint8_t Attemptcnt;
uint8_t RequestSeedCnt;
uint8_t AttemptIIcnt;
uint8_t RequestSeedIICnt;
} Ser27_FlowCtrlCntUnion;
typedef struct
{
uint32_t Flag;
uint8_t DID_F180[6];
uint8_t DID_F187[16];
uint8_t DID_F193[6];
uint8_t DID_F195[6];
uint8_t Filldata[2];
}DiagDFlashData;
extern DiagDFlashData DiagDataForDFlash;
typedef struct
{
uint32_t Flag;
uint8_t DID_F184[32];
} Ser2EDFlashData;
extern Ser2EDFlashData Ser2EDataForDFlash;
typedef struct typedef struct
{ {
uint32_t Flag; uint32_t Flag;
...@@ -365,19 +341,10 @@ typedef struct ...@@ -365,19 +341,10 @@ typedef struct
void UDS_Service_10_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data); void UDS_Service_10_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_11_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data); void UDS_Service_11_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_22_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data); void UDS_Service_22_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_2E_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_27_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_28_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_3E_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data); void UDS_Service_3E_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_85_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void S3_ServerCNTT(void); void S3_ServerCNTT(void);
void Randomcnt(void);
extern void DIAG_InitParameter(void); extern void DIAG_InitParameter(void);
void GetSeed(void);
void CalculateKey(void);
void CalculateKeyLv11(void);
typedef void (*InitFunction)(void); typedef void (*InitFunction)(void);
/***********Local Functin*************/ /***********Local Functin*************/
...@@ -386,13 +353,11 @@ uint8_t SerXXNRC12Filter(uint8_t insub, const uint8_t *supportsub, uint8_t size, ...@@ -386,13 +353,11 @@ uint8_t SerXXNRC12Filter(uint8_t insub, const uint8_t *supportsub, uint8_t size,
uint8_t SerXXNRC13Filter(uint8_t type, uint8_t serlength, const uint8_t *length, uint8_t index); uint8_t SerXXNRC13Filter(uint8_t type, uint8_t serlength, const uint8_t *length, uint8_t index);
uint8_t SerXXNRC22Filter(void); uint8_t SerXXNRC22Filter(void);
uint8_t SerXXNRC31DIDFilter(uint16_t inDID, const uint16_t *DIDList, uint8_t size, uint8_t *index); uint8_t SerXXNRC31DIDFilter(uint16_t inDID, const uint16_t *DIDList, uint8_t size, uint8_t *index);
uint8_t SerXXNRC33Filter(const uint8_t *levelList, uint8_t index);
uint8_t SerXXNRC7EFilter(const uint8_t *SubSupportSession, uint8_t index); uint8_t SerXXNRC7EFilter(const uint8_t *SubSupportSession, uint8_t index);
uint8_t SerXXNRC7FFilter(uint8_t SupportSession); uint8_t SerXXNRC7FFilter(uint8_t SupportSession);
extern void Data_Set_DiagPara(void);
void Write_App_InValid(uint32_t m32); void Write_App_InValid(uint32_t m32);
void Data_Read_DiagPara(void);
void DFlash_init(void); extern void Get_Into_630H_Update_MCU_Mode(void);
void Data_Read_DiagPara(void); extern void Check_MCU_Info_in_630H(void);
#endif #endif
# 2024.08.16 (2)
中微厂家提供了新的cgc.c文件
内部版本信息更新(1.03_20240816)
# 2024.08.16
修复一级Boot计算Flash Block错误的问题
添加630H升级MCU APP的能力
内部版本号更新(1.02_20240816)
# 2024.08.08 # 2024.08.08
修复一级Boot失效的问题 修复一级Boot失效的问题
项目信息统一 项目信息统一
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment