diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx
index a38ef89..d1f11e4 100644
--- a/checher_slave.uvoptx
+++ b/checher_slave.uvoptx
@@ -103,7 +103,7 @@
1
0
0
- 0
+ 4
@@ -114,7 +114,7 @@
- BIN\UL2CM3.DLL
+ Segger\JL2CM3.dll
@@ -125,12 +125,12 @@
0
JL2CM3
- -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)
+ -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)
0
DLGUARM
- d
+ ?
0
@@ -230,12 +230,6 @@
-
-
- System Viewer\USART1
- 35905
-
-
1
1
@@ -345,12 +339,12 @@
0
UL2CM3
- UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)
+ UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F30x_HD -FL040000 -FS08000000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM)
0
JL2CM3
- -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)
+ -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)
0
@@ -1154,11 +1148,35 @@
0
0
0
+ .\source\elec_det\interface\EWChecker.c
+ EWChecker.c
+ 0
+ 0
+
+
+ 6
+ 54
+ 1
+ 0
+ 0
+ 0
.\source\elec_det\elec_det.c
elec_det.c
0
0
+
+ 6
+ 55
+ 1
+ 0
+ 0
+ 0
+ .\source\elec_det\elec_cmd.c
+ elec_cmd.c
+ 0
+ 0
+
@@ -1169,7 +1187,7 @@
0
7
- 54
+ 56
1
0
0
@@ -1181,7 +1199,7 @@
7
- 55
+ 57
1
0
0
@@ -1201,7 +1219,7 @@
0
8
- 56
+ 58
1
0
0
@@ -1213,7 +1231,7 @@
8
- 57
+ 59
1
0
0
@@ -1225,7 +1243,7 @@
8
- 58
+ 60
1
0
0
@@ -1237,7 +1255,7 @@
8
- 59
+ 61
1
0
0
@@ -1249,7 +1267,7 @@
8
- 60
+ 62
1
0
0
@@ -1261,7 +1279,7 @@
8
- 61
+ 63
1
0
0
@@ -1273,7 +1291,7 @@
8
- 62
+ 64
1
0
0
@@ -1285,7 +1303,7 @@
8
- 63
+ 65
1
0
0
@@ -1297,7 +1315,7 @@
8
- 64
+ 66
1
0
0
@@ -1309,7 +1327,7 @@
8
- 65
+ 67
1
0
0
@@ -1321,7 +1339,7 @@
8
- 66
+ 68
1
0
0
@@ -1333,7 +1351,7 @@
8
- 67
+ 69
1
0
0
@@ -1345,7 +1363,7 @@
8
- 68
+ 70
1
0
0
@@ -1357,7 +1375,7 @@
8
- 69
+ 71
1
0
0
@@ -1369,7 +1387,7 @@
8
- 70
+ 72
1
0
0
@@ -1381,7 +1399,7 @@
8
- 71
+ 73
1
0
0
@@ -1393,7 +1411,7 @@
8
- 72
+ 74
1
0
0
@@ -1405,7 +1423,7 @@
8
- 73
+ 75
1
0
0
@@ -1417,7 +1435,7 @@
8
- 74
+ 76
2
0
0
@@ -1431,13 +1449,13 @@
soft
- 0
+ 1
0
0
0
9
- 75
+ 77
1
0
0
@@ -1449,7 +1467,7 @@
9
- 76
+ 78
1
0
0
@@ -1461,7 +1479,7 @@
9
- 77
+ 79
1
0
0
@@ -1473,7 +1491,7 @@
9
- 78
+ 80
1
0
0
@@ -1485,7 +1503,7 @@
9
- 79
+ 81
1
0
0
@@ -1497,7 +1515,7 @@
9
- 80
+ 82
1
0
0
@@ -1509,7 +1527,7 @@
9
- 81
+ 83
1
0
0
@@ -1521,7 +1539,7 @@
9
- 82
+ 84
1
0
0
@@ -1533,7 +1551,7 @@
9
- 83
+ 85
1
0
0
@@ -1545,7 +1563,7 @@
9
- 84
+ 86
1
0
0
@@ -1557,7 +1575,7 @@
9
- 85
+ 87
1
0
0
@@ -1577,7 +1595,7 @@
0
10
- 86
+ 88
1
0
0
@@ -1589,7 +1607,7 @@
10
- 87
+ 89
1
0
0
@@ -1601,7 +1619,7 @@
10
- 88
+ 90
1
0
0
@@ -1613,7 +1631,7 @@
10
- 89
+ 91
1
0
0
@@ -1625,7 +1643,7 @@
10
- 90
+ 92
1
0
0
@@ -1637,7 +1655,7 @@
10
- 91
+ 93
1
0
0
@@ -1657,7 +1675,7 @@
0
11
- 92
+ 94
1
0
0
@@ -1677,7 +1695,7 @@
0
12
- 93
+ 95
1
0
0
@@ -1689,7 +1707,7 @@
12
- 94
+ 96
1
0
0
@@ -1701,7 +1719,7 @@
12
- 95
+ 97
1
0
0
@@ -1713,7 +1731,7 @@
12
- 96
+ 98
1
0
0
@@ -1725,7 +1743,7 @@
12
- 97
+ 99
1
0
0
@@ -1737,7 +1755,7 @@
12
- 98
+ 100
1
0
0
@@ -1757,7 +1775,7 @@
0
13
- 99
+ 101
5
0
0
@@ -1777,7 +1795,7 @@
0
14
- 100
+ 102
5
0
0
@@ -1789,7 +1807,7 @@
14
- 101
+ 103
5
0
0
diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx
index e8a35b5..1253d31 100644
--- a/checher_slave.uvprojx
+++ b/checher_slave.uvprojx
@@ -10,7 +10,7 @@
app
0x4
ARM-ADS
- 5060960::V5.06 update 7 (build 960)::.\ARMCC
+ 5060750::V5.06 update 6 (build 750)::ARMCC
0
@@ -138,7 +138,7 @@
1
BIN\UL2CM3.DLL
-
+ "" ()
@@ -185,7 +185,6 @@
0
0
0
- 0
0
0
8
@@ -352,7 +351,7 @@
0
0
0
- 4
+ 0
@@ -719,11 +718,21 @@
1
.\source\elec_det\interface\XTChecker.c
+
+ EWChecker.c
+ 1
+ .\source\elec_det\interface\EWChecker.c
+
elec_det.c
1
.\source\elec_det\elec_det.c
+
+ elec_cmd.c
+ 1
+ .\source\elec_det\elec_cmd.c
+
@@ -1238,7 +1247,6 @@
0
0
0
- 0
0
0
8
@@ -1405,7 +1413,7 @@
0
0
0
- 4
+ 0
@@ -1852,7 +1860,7 @@
2
2
2
- 0
+ 2
@@ -1943,11 +1951,21 @@
1
.\source\elec_det\interface\XTChecker.c
+
+ EWChecker.c
+ 1
+ .\source\elec_det\interface\EWChecker.c
+
elec_det.c
1
.\source\elec_det\elec_det.c
+
+ elec_cmd.c
+ 1
+ .\source\elec_det\elec_cmd.c
+
@@ -2906,7 +2924,7 @@
2
2
2
- 0
+ 2
@@ -3448,7 +3466,7 @@
2
2
2
- 0
+ 2
@@ -3552,7 +3570,7 @@
2
2
2
- 0
+ 2
@@ -3631,7 +3649,7 @@
2
2
2
- 0
+ 2
@@ -3709,13 +3727,4 @@
-
-
-
- checher_slave
- 1
-
-
-
-
diff --git a/doc/mhzz3_Main_v0_00.pdf b/doc/mhzz3_Main_v0_00.pdf
deleted file mode 100644
index e042cc1..0000000
Binary files a/doc/mhzz3_Main_v0_00.pdf and /dev/null differ
diff --git a/source/ReadMe.txt b/source/ReadMe.txt
index ce794f3..6e27929 100644
--- a/source/ReadMe.txt
+++ b/source/ReadMe.txt
@@ -179,5 +179,6 @@
str_is_print_str 函数中,len为0时返回0
2023.10.6
移植与雷管通信相关代码,编译通过
-
+2023.10.7
+ 实现大部分小板命令
\ No newline at end of file
diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c
index e060b43..ddfdd17 100644
--- a/source/dev/dev_flash.c
+++ b/source/dev/dev_flash.c
@@ -41,6 +41,8 @@ scheme 109~110
#define FLASH_PARAM_SECTOR_NUM (1)
#define FLASH_SCHEME_SECTOR (109)
#define FLASH_SCHEME_SECTOR_NUM (3)
+#define FLASH_JWTCODE_SECTOR (112)
+#define FLASH_JWTCODE_SECTOR_NUM (9)
@@ -78,7 +80,7 @@ typedef struct{
// 擦除指定扇区,返回0成功,-1失败
-static int flash_erase(uint32_t FLASH_Sector)
+static int flash_erase(uint32_t sector)
{
self_def *s=&g_self;
FLASH_Status ret;
@@ -89,7 +91,7 @@ static int flash_erase(uint32_t FLASH_Sector)
FLASH_Unlock();
FLASH_CLEAR_FLAG();
// 对于f103 2048byte为一个扇区,这里把扇区地址转化为flash地址
- ret=FLASH_ErasePage(FLASH_Sector*2048);
+ ret=FLASH_ErasePage(sector*2048);
rt_mutex_release(s->mutex);
if(ret!=FLASH_COMPLETE)
{
@@ -102,6 +104,24 @@ static int flash_erase(uint32_t FLASH_Sector)
}
+
+// 操作开始
+int flash_operate_start(void)
+{
+ FLASH_Status state;
+ int ret=0;
+ self_def *s=&g_self;
+ #ifdef RT_THREAD
+ param_check(s->mutex);
+ #endif
+ rt_mutex_take(s->mutex,RT_WAITING_FOREVER);
+ FLASH_Unlock();
+ FLASH_CLEAR_FLAG();
+ rt_mutex_release(s->mutex);
+ return 0;
+}
+
+
// 操作结束
int flash_operate_end(void)
{
@@ -159,7 +179,7 @@ int flash_erase_slave(void)
}
return 0;
}
-//方案区 4K
+//方案区 6K
int flash_erase_scheme(void)
{
int ret;
@@ -176,6 +196,17 @@ int flash_erase_lua(void)
return -1;
}
+// 模块程序区 16K
+int flash_erase_jwtcode(void)
+{
+ int ret;
+ for(int i=0;i ad_line)
{
@@ -427,7 +428,7 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t
ul_l_count++;
}
}
- if(uc_step == 0 && ul_h_count > 5)//启动周期计数
+ if(uc_step == 0 && ul_h_count >(DMOD_READ_AD_FILTER_COUNT-1))//启动周期计数
{
(*plus_h)++;
(*plus_t)++;
@@ -437,18 +438,18 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t
}
if(uc_step == 1)
{
- if(ul_h_count > 5)
+ if(ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1))
{
PBout(I2IC_SCL_Pin_Nu) = 1 ;
(*plus_h)++;
uc_step = 1;
- }else if(ul_l_count > 5) //由高变低
+ }else if(ul_l_count > (DMOD_READ_AD_FILTER_COUNT-1)) //由高变低
{
PBout(I2IC_SCL_Pin_Nu) = 0;
uc_step = 2;
}
}
- else if(uc_step == 2 && ul_h_count > 5)//由低变高
+ else if(uc_step == 2 && ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1))//由低变高
{
PBout(I2IC_SCL_Pin_Nu) = 1 ;
break;
@@ -483,7 +484,7 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out)
uint16_t ad_max = 0,ad_max_temp = 0;
CurrentSample_Range_eu range = buscurrent_range;//档位保存
Power_SetSampleCurrentRange(R10_2mA_30mA_MC);
- ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HIGH);
+ ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HFAST);
delay_us(2000);
//总线跳转到中电平
EW_DIFF_MOD_M;
@@ -816,7 +817,14 @@ static void EW_TrimPlusCallback(uint8_t flag)
}
EW_Trim_Flag = flag;
}
-static void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count)
+/*
+@brief 发送校准脉冲
+@param cycle 周期
+@param duty 总线高电平时间
+@param count 脉冲个数
+
+*/
+void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count)
{
FireBus_ClkAmend(cycle,duty,count,EW_TrimPlusCallback);
EW_Trim_Flag = 0;
@@ -907,7 +915,7 @@ uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len)
len = 10;
}
EW_CommBuf[3] = len;
- memcpy((void*)(EW_CommBuf+4),buf,len);
+ memcpy((void*)EW_CommBuf+4,buf,len);
DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag);
if(uc_readflag == 0)
{
@@ -947,7 +955,7 @@ uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len)
len = 10;
}
EW_CommBuf[3] = len;
- memcpy((void*)(EW_CommBuf+4),buf,len);
+ memcpy((void*)EW_CommBuf+4,buf,len);
DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag);
if(uc_readflag == 0)
{
@@ -978,7 +986,7 @@ uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot)
{
ul_bootflag = 0x9966AA55;
}
- memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4);
+ memcpy((void*)EW_CommBuf+2,&ul_bootflag,4);
DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0);
return 0;
}
@@ -1000,7 +1008,7 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg)
addr = (addr & 0xFFC0) | 20;
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
- memcpy((void*)(EW_CommBuf+2),&runcfg,3);
+ memcpy((void*)EW_CommBuf+2,&runcfg,3);
DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag);
if(uc_readflag == 0)
{
@@ -1036,7 +1044,7 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_
addr = (addr & 0xFFC0) | 21;
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
- memcpy((void*)(EW_CommBuf+2),uid,uid_len);
+ memcpy((void*)EW_CommBuf+2,uid,uid_len);
DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag);
if(uc_readflag == 0)
{
@@ -1075,7 +1083,7 @@ uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t*
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
EW_CommBuf[2] = pwd_flag;
- memcpy(((void*)(EW_CommBuf+3)),&delay,2);
+ memcpy(((void*)(EW_CommBuf)+3),&delay,2);
memcpy((void*)(EW_CommBuf+5),uid,uid_len);
uid_len +=5;
DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag);
@@ -1106,7 +1114,7 @@ uint8_t EW_SetDelay(uint16_t addr,uint16_t delay)
addr = (addr & 0xFFC0) | 23;
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
- memcpy((void*)(EW_CommBuf+2),&delay,2);
+ memcpy((void*)EW_CommBuf+2,&delay,2);
DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0);
uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout);
if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3])
@@ -1130,7 +1138,7 @@ uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len)
addr = (addr & 0xFFC0) | 24;
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
- memcpy((void*)(EW_CommBuf+2),pwd,pwd_len);
+ memcpy((void*)EW_CommBuf+2,pwd,pwd_len);
pwd_len += 2;
DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0);
return 0;
@@ -1282,7 +1290,7 @@ uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint16_t cfg_state,uint8
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
memcpy((uint8_t*)&EW_CommBuf[2],&cfg_mask,3);
- memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,2);
+ memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,3);
EW_CommBuf[8] = *rtv;
DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,1);
delay_ms(5);
@@ -1388,7 +1396,6 @@ uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur)
EW_CommBuf[2] = speed;
EW_CommBuf[3] = cur;
DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0);
- return 0;
}
/*
@@ -1408,7 +1415,7 @@ uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr)
addr = (addr & 0xFFC0) | 36;
EW_CommBuf[0] = addr&0xFF;
EW_CommBuf[1] = (addr >> 8)&0xFF;
- memcpy((void*)(EW_CommBuf+2),&new_addr,2);
+ memcpy((void*)EW_CommBuf+2,&new_addr,2);
DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag);
if(uc_readflag == 0)
{
@@ -1525,6 +1532,4 @@ uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len)
uc_ack = 1;
}
return uc_ack;
-}
-
-
+}
\ No newline at end of file
diff --git a/source/elec_det/driver/EWDriver.h b/source/elec_det/driver/EWDriver.h
index 0049cb6..1cb42cc 100644
--- a/source/elec_det/driver/EWDriver.h
+++ b/source/elec_det/driver/EWDriver.h
@@ -122,7 +122,14 @@ volatile struct
#define EW_BOOTLOADER_RUN 61 //运行bootloader
#define EW_RA_REGISTER 62 //读MTP
#define EW_WA_REGISTER 63 //写MTP
+/*
+@brief 发送校准脉冲
+@param cycle 周期
+@param duty 总线高电平时间
+@param count 脉冲个数
+*/
+void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count);
/*
@brief 单端第二版,差分接收数据
@param *buf 数据缓存指针
diff --git a/source/elec_det/elec_cmd.c b/source/elec_det/elec_cmd.c
new file mode 100644
index 0000000..d8d863f
--- /dev/null
+++ b/source/elec_det/elec_cmd.c
@@ -0,0 +1,30 @@
+#include "elec_det.h"
+#include "commend.h"
+#include "mystring.h"
+
+
+
+
+// 电子模块相关调试命令
+
+
+
+static int cmd_check(list_def *argv)
+{
+ array_def *data=arr_creat();
+ cmd_print("start check.");
+ elec_check_with_scheme(data);
+ arr_delete(data);
+ return 0;
+}
+commend_export(check,cmd_check,"start check")
+
+
+
+
+
+
+
+
+
+
diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c
index c65add8..ce08c16 100644
--- a/source/elec_det/elec_det.c
+++ b/source/elec_det/elec_det.c
@@ -1,6 +1,7 @@
#include "board.h"
#include "bytearray.h"
#include "mystdlib.h"
+#include "debug.h"
#include "elec_det.h"
#include "base/delay.h"
@@ -23,15 +24,42 @@
typedef struct{
- CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//ṹָ
-
+ CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针
+ int scheme_inited;
}self_def;
static self_def g_self;
-// ȡַ
+
+
+// 初始化
+int elec_init(void)
+{
+ self_def *s=&g_self;
+ void Ye_BoardInit(void);
+ void Ye_BoardCheck(void);
+ int elec_check_scheme(void);
+ void elec_load_scheme(void);
+ Ye_BoardInit();
+ Ye_BoardCheck();
+ if(elec_check_scheme()!=0){
+ // 方案校验失败
+ DBG_WARN("scheme check failed.");
+ s->scheme_inited=0;
+ return 1;
+ }
+ s->scheme_inited=1;
+ elec_load_scheme();
+ return 0;
+}
+
+
+
+
+
+// 获取本机地址
uint8_t elec_local_addr(void)
{
static uint8_t addr=0;
@@ -41,13 +69,13 @@ uint8_t elec_local_addr(void)
}
-// led1״̬
+// 设置led1状态
void elec_led1_power(int power)
{
LED1_Out=power?1:0;
}
-// led2״̬
+// 设置led2状态
void elec_led2_power(int power)
{
LED2_Out=power?1:0;
@@ -55,40 +83,44 @@ void elec_led2_power(int power)
-// ȡ
+// 获取检测结果
array_def *elec_check_result(void)
{
array_def *r=arr_creat();
-
+ arr_append(r,3);
return arr_temp(r);
}
-// дӲ汾
-int elec_write_hardversion(int version)
+// 写硬件版本号
+array_def *elec_write_hardversion(int version)
{
+ array_def *r=arr_creat();
board_st.hard_v=version;
- return 0;
+ arr_append(r,0);
+ return arr_temp(r);
}
-// дУֵ
-int elec_write_resistor_cbv(int cbv)
+// 写电阻校准值
+array_def *elec_write_resistor_cbv(int cbv)
{
+ array_def *r=arr_creat();
board_st.resistor_diff=cbv;
+ arr_append(r,0);
return 0;
}
-// ˿ֵ
+// 测量桥丝阻值
array_def *elec_check_resistor(void)
{
/*
- 1 ͨ1-4ͨ˿
- 2 ͨ2-3ͨ˿
- 3 ͨ1-3ͨ迹
- 4 ͨ2-4ͨ迹
+ 1 通道1-4通,过桥丝
+ 2 通道2-3通,过桥丝
+ 3 通道1-3通,测阻抗
+ 4 通道2-4通,测阻抗
*/
uint16_t aus_sample[5];
uint16_t us_resistor;
@@ -98,7 +130,7 @@ array_def *elec_check_resistor(void)
{
aus_sample[uc_index] -= board_st.resistor_diff;
}
- // ȡвģʽ
+ // 读取方案中测量电阻的模式
switch(0)
{
case 0: us_resistor = aus_sample[0];break;
@@ -117,7 +149,7 @@ array_def *elec_check_resistor(void)
-// У鷽,0ɹ
+// 校验方案,返0成功
static int elec_check_scheme(void)
{
uint32_t ul_crc32;
@@ -135,7 +167,7 @@ static int elec_check_scheme(void)
-// ط
+// 加载方案
static void elec_load_scheme(void)
{
self_def *s=&g_self;
@@ -159,7 +191,7 @@ static void elec_load_scheme(void)
}
-// м
+// 进行检测
array_def *elec_check_with_scheme(array_def *uid_psw)
{
self_def *s=&g_self;
@@ -172,10 +204,14 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
uint8_t res=0;
array_def *r=arr_creat();
chip_type=(board_st.plan_id >> 12 ) & 0x0F;
- if(chip_type>=LENGTH(tasks_fun_table)){
+ if(s->scheme_inited==0){
arr_append(r,1);
return arr_temp(r);
}
+ if(chip_type>=LENGTH(tasks_fun_table)){
+ arr_append(r,2);
+ return arr_temp(r);
+ }
memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st));
int task_index=0;
int err_flag=0;
@@ -184,8 +220,8 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st));
taskid=ptaskindex[task_index];
memset(checker_runcfg.params,0,20);
- checker_runcfg.param_count = 0;//
- checker_runcfg.rtv_count = 0;//ֵ
+ checker_runcfg.param_count = 0;//参数个数
+ checker_runcfg.rtv_count = 0;//返回值个数
checker_runcfg.excue_rtv = 0;
checker_runcfg.task_info.retry_time = 0;
if(taskid>=CHECKER_MAXID_COUNT){
@@ -200,13 +236,13 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
break;
}
- // װز
+ // 装载参数
rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st));
checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F;
checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F;
rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2);
- // ִ
+ // 执行任务
for(int i=0;i<1+task_par->retry_time;i++)
{
checker_runcfg.excue_rtv=1;
@@ -216,23 +252,23 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
break;
}
- // Ѱһ
+ // 找寻下一个任务
if((checker_runcfg.excue_rtv != 0)
&& (checker_runcfg.task_info.error_jumpto != 0)
&& (checker_runcfg.task_info.error_jumpto != 0xFF)
)
{
- uint8_t uc_index = task_index+1;//ʱһֱ˳ִ
+ uint8_t uc_index = task_index+1;//如果时跳至下一个,直接顺序执行
task_index = checker_runcfg.task_info.error_jumpto;
while(uc_index < task_index)
{
- Checker_MaskResult(1,uc_index);//IJδִ
- //ֵ±꣬IJķֵ洢ռ䱣
+ Checker_MaskResult(1,uc_index);//将跳过的步骤标记未执行
+ //调整参数返回值下标,将跳过的步骤里面的返回值存储空间保留
checker_runcfg.rtv_index += (s->task_info_array[uc_index]->param_rtv_count >> 4) & 0x0F;
uc_index++;
}
}else{
- task_index++;//ֱ˳ִ
+ task_index++;//正常情况直接顺序执行
}
}
@@ -246,3 +282,5 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
+
+
diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h
index 1d3b448..d415c36 100644
--- a/source/elec_det/elec_det.h
+++ b/source/elec_det/elec_det.h
@@ -3,10 +3,10 @@
#include "stdint.h"
+#include "bytearray.h"
-
-
+int elec_init(void);
uint8_t elec_local_addr(void);
@@ -14,10 +14,15 @@ void elec_led1_power(int power);
void elec_led2_power(int power);
+array_def *elec_check_result(void);
+array_def *elec_write_hardversion(int version);
+array_def *elec_write_resistor_cbv(int cbv);
+array_def *elec_check_resistor(void);
+array_def *elec_check_with_scheme(array_def *uid_psw);
diff --git a/source/elec_det/hardware/gpio_cfg.h b/source/elec_det/hardware/gpio_cfg.h
index 1d69c26..e760ac5 100644
--- a/source/elec_det/hardware/gpio_cfg.h
+++ b/source/elec_det/hardware/gpio_cfg.h
@@ -273,7 +273,8 @@
#define EW_SINGLE_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;}
#define EW_SINGLE_MOD_H HMOS_SWITCH_W_1
-#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;}
+#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;}
+
#define EW_DIFF_MOD_H HMOS_SWITCH_W_1
#define EW_DIFF_MOD_L HMOS_SWITCH_W_0
#define EW_BUS_OFF HMOS_SWITCH_OFF
diff --git a/source/elec_det/hardware/jw3425iic.c b/source/elec_det/hardware/jw3425iic.c
index 509a449..8404066 100644
--- a/source/elec_det/hardware/jw3425iic.c
+++ b/source/elec_det/hardware/jw3425iic.c
@@ -625,9 +625,14 @@ void MC_IICUpdateMTP(void)
if(checker_runcfg.params[0] == 0x1000)
{
auc_setMTPOperReg_cmd[2] = 0x04;
+ auc_earse_cmd[0]= 0x27;
+ auc_earse_cmd[1]= 0xD8;
+
}else{
auc_setMTPOperReg_cmd[2] = 0x00;
}
+ auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF;
+ auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF;
uc_ack = 0;
uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0);
delay_ms(5);
@@ -645,8 +650,7 @@ void MC_IICUpdateMTP(void)
return;
}
- auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF;
- auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF;
+
uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPOperReg_cmd,sizeof(auc_setMTPOperReg_cmd),&ul_sendlen,0);
//设置MTP操作范围
if(uc_ack != 0)
diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c
new file mode 100644
index 0000000..e6d846d
--- /dev/null
+++ b/source/elec_det/interface/EWChecker.c
@@ -0,0 +1,259 @@
+
+#include "EWChecker.h"
+#include "driver/EWDriver.h"
+#include "base/delay.h"
+#include "hardware/adc_cfg.h"
+#include "base/utility.h"
+#include "hardware/power.h"
+#include "hardware/timer_cfg.h"
+
+
+#define UPDATA_PACK_LEN 58
+#define UPDATA_BASE_ADDR 0x1000
+#define UPDATA_DATA_LEN (12*1024)
+#define UPDATA_FLAG_ADDR (0x3c7c)
+//#define UPDATA_FLAG ((uint8_t []){0x99,0x66,0xaa,0x55})
+#define UPDATA_FLAG ((uint8_t []){0xaa,0xbb,0xcc,0xdd})
+
+// 擦除
+static uint8_t EW_Erease(void)
+{
+ uint8_t data[3]={0xfe,0x00,0x00};
+ uint8_t read[4]={0};
+ uint8_t ret=0;
+ DMod_SendBytesXor(data,2,1);
+ ret=DMod_ReadBytesXor(read,4,100);
+ delay_ms(50);
+ return ret;
+}
+
+
+// 跳转
+static uint8_t EW_Jump(void)
+{
+ uint8_t data[3]={0xf9,0x00,0x00};
+ uint8_t read[4]={0};
+ uint8_t ret=0;
+ DMod_SendBytesXor(data,2,1);
+ ret=DMod_ReadBytesXor(read,4,100);
+ delay_ms(50);
+ return ret;
+}
+
+
+// 充电
+static uint8_t EW_Charg(void)
+{
+ uint8_t data[4]={0xf8,0x01,0x04,0x00};
+ uint8_t read[4]={0};
+ uint8_t ret=0;
+ delay_ms(2000);
+ DMod_SendBytesXor(data,3,1);
+ ret=DMod_ReadBytesXor(read,4,100);
+ delay_ms(5000);
+ return ret;
+}
+
+// 发送数据
+// len 最长为58字节
+static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len)
+{
+ uint8_t ret=0;
+ uint8_t read[4]={0};
+ uint8_t *buf=rt_malloc(len+2+2+1);
+ if(buf==RT_NULL) return 1;
+ buf[0]=0xfc;
+ buf[1]=2+len;
+ buf[2]=addr&0xff;
+ buf[3]=addr>>8;
+ rt_memcpy(&buf[4],d,len);
+ DMod_SendBytesXor(buf,len+2+2,1);
+ ret=DMod_ReadBytesXor(read,4,100);
+ rt_free(buf);
+ delay_ms(50);
+ return ret;
+}
+
+
+
+// 校验
+static uint8_t EW_CheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc)
+{
+ uint8_t ret=0;
+ uint8_t cmd[7]={0xfb,0x04,adr_start&0xff,adr_start>>8,adr_end&0xff,adr_end>>8};
+ uint8_t read[4+4]={0};
+ DMod_SendBytesXor(cmd,6,1);
+ ret=DMod_ReadBytesXor(read,8,100);
+ if(ret==0){
+ if(crc){
+ *crc=(read[3])|(read[4]<<8)|(read[5]<<16)|(read[6]<<24);
+ }
+ }
+ delay_ms(50);
+ return ret;
+}
+
+
+
+// 读取
+static uint8_t EW_Read(uint16_t adr,uint8_t *buf,uint16_t len)
+{
+ uint8_t ret=0;
+ uint8_t cmd[7]={0xfa,0x03,adr&0xff,adr>>8,len};
+ uint16_t read_len=2+len+1+1;
+ uint8_t *read=rt_malloc(read_len);
+ if(read==RT_NULL) return 1;
+ DMod_SendBytesXor(cmd,6,1);
+ ret=DMod_ReadBytesXor(read,read_len,100);
+ rt_memset(buf,0,len);
+ if(ret==0)
+ {
+ rt_memcpy(buf,&read[3],len);
+ }
+ delay_ms(50);
+ rt_free(read);
+ return ret;
+}
+
+
+// 升级
+void EW_Updata(void)
+{
+ Checker_RunCfg_st *cfg=&checker_runcfg;
+ uint8_t ret=0;
+ uint8_t *data=(uint8_t *)MC_CODE_ADDR;
+ uint16_t len=UPDATA_DATA_LEN;
+ uint16_t addr=UPDATA_BASE_ADDR;
+ uint8_t pack_len=UPDATA_PACK_LEN;
+ uint32_t crc=0;
+ uint32_t crc_module=0;
+ ret=EW_Charg();
+ if(ret) {ret=1;goto err;}
+ ret=EW_Erease();
+ if(ret) {ret=2;goto err;}
+ while(len>0){
+ pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len;
+ ret=EW_Write(addr,data,pack_len);
+ addr+=pack_len;
+ data+=pack_len;
+ len-=pack_len;
+ if(ret) {ret=3;goto err;}
+ }
+ crc=Crc32Calu((uint32_t *)MC_CODE_ADDR,UPDATA_DATA_LEN/4);
+ ret=EW_CheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc_module);
+ if(ret) {ret=4;goto err;}
+ if(crc!=crc_module)
+ {ret=5;goto err;}
+ ret=EW_Jump();
+ if(ret) {ret=6;goto err;}
+ delay_ms(100);
+ ret=EW_EnWriteMTP(0,1);
+ if(ret) {ret=7;goto err;}
+ delay_ms(100);
+ // 数据溢出
+// ret=EW_WriteMTP(0,(uint8_t)(UPDATA_FLAG_ADDR/4),UPDATA_FLAG,4);
+ if(ret) {ret=8;goto err;}
+ delay_ms(100);
+
+ err:
+ Checker_MaskResult(ret,checker_runcfg.task_info.runindex);
+}
+
+
+
+void EW_Test_PowerOFF(void)
+{
+ uint8_t uc_rtv = 0;
+ delay_os_ms(100);
+ XTBUS_OFF;
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
+}
+
+
+
+
+void EW_Empty(void)
+{
+ Checker_RunCfg_st *cfg=&checker_runcfg;
+ int count=cfg->rtv_count;
+ while(count > 0)
+ {
+ cfg->Test_Rtv[cfg->rtv_index++] = 0;
+ count--;
+ }
+ Checker_MaskResult(0,cfg->task_info.runindex);
+}
+
+
+
+void EW_Test_SetBusV(void)
+{
+ Checker_RunCfg_st *cfg=&checker_runcfg;
+ uint8_t uc_rtv = 0;
+ uint16_t us_h_v,us_m_v;
+ //us_h_v = cfg->params[0];
+ us_h_v = 240;
+ if(us_h_v < 55)
+ {
+ uc_rtv = 1;
+
+ }else{
+ us_m_v = 50;
+ uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
+ XTBUS_ON
+
+ us_m_v = ((us_h_v/80)+2)*60;
+ delay_ms(us_m_v);
+ us_h_v = Power_GetBousV();
+ Checker_SetRtv(&us_h_v,cfg->rtv_count);
+ }
+ Checker_MaskResult(uc_rtv,cfg->task_info.runindex);
+
+}
+
+
+
+CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={
+Checker_PowerPrapare, //0 电源准备
+EW_Empty, //1 上电充能
+EW_Test_SetBusV, //2 设置总线电压
+EW_Empty, //3 获取总线电流
+EW_Empty, //4 扫描UID
+EW_Empty, //5 写配置参数
+EW_Empty, //6 验证配置
+EW_Empty, //7 模拟注码
+EW_Empty, //8 充能统计
+EW_Empty, //9 写现场值 网络id 延时
+EW_Empty, //10比对现场值
+EW_Empty, //11 桥丝通断检测
+EW_Empty, //12 电容容量统计
+EW_Empty, //13 延时等待
+EW_Empty, //14 写管壳号/工厂信息
+EW_Empty, //15 写UID
+EW_Empty, //16 写密码
+EW_Empty, //17 写入/检测备份区标志
+EW_Empty, //18 读取备份区数据
+EW_Empty, //19 校准
+EW_Empty, //20 使能通讯末电流采集
+EW_Empty, //21 获取通讯末电流
+EW_Empty, //22 放电
+EW_Empty, //23 在线检测
+EW_Empty, //24 状态检测
+EW_Empty, //25 起爆
+EW_Empty, //26 复位
+EW_Test_PowerOFF, //27 关总线
+EW_Empty, //28 芯片锁存
+EW_Empty, //29 使能赋码设备
+EW_Empty, //30 在线检测
+EW_Empty, //31 密码验证
+EW_Empty, //32 加载芯片配置
+EW_Empty, //33 电容压差测试
+Checker_ResistorSample,//34 桥丝电阻测试
+EW_Empty, //35 检测过程中注码
+EW_Empty, //36 验证注码
+EW_Empty, //37 模块在线检测
+EW_Updata, //38 升级
+(void*)0 //数组结束
+};
+
+
diff --git a/source/elec_det/interface/EWChecker.h b/source/elec_det/interface/EWChecker.h
new file mode 100644
index 0000000..47b80c3
--- /dev/null
+++ b/source/elec_det/interface/EWChecker.h
@@ -0,0 +1,22 @@
+#ifndef EWChecker_h__
+#define EWChecker_h__
+#include "base/define.h"
+#include "basechecker.h"
+#include "stdint.h"
+
+
+
+
+
+extern CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ;
+
+
+
+
+
+
+
+
+
+#endif
+
diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h
index 254cf00..aef8df8 100644
--- a/source/main/compiler_info.h
+++ b/source/main/compiler_info.h
@@ -6,7 +6,7 @@
-#define BUILD_DATE "2023-10-06 18:40:44"
+#define BUILD_DATE "2023-10-07 18:12:30"
#define SOFT_VERSION "0.03"
diff --git a/source/main/main.c b/source/main/main.c
index 72d8d64..4681c0a 100644
--- a/source/main/main.c
+++ b/source/main/main.c
@@ -19,7 +19,7 @@
#include "mymisc.h"
#include "dev_backup.h"
#include "compiler_info.h"
-
+#include "elec_det.h"
@@ -31,6 +31,7 @@ int main()
{
const sys_param_def *par=sys_param();
debug_init();
+ elec_init();
app_init();
protu_def *protu=app_variable("protu",0,0);
@@ -52,7 +53,10 @@ int main()
while(1)
{
- rt_thread_mdelay(5000);
+ elec_led2_power(1);
+ rt_thread_mdelay(300);
+ elec_led2_power(0);
+ rt_thread_mdelay(300);
}
}
diff --git a/source/soft/debug.c b/source/soft/debug.c
index 984c950..f39c7ea 100644
--- a/source/soft/debug.c
+++ b/source/soft/debug.c
@@ -1,5 +1,5 @@
-
+#include "board.h"
#include "if_rtt.h"
#include "stdio.h"
#include "stdarg.h"
@@ -8,19 +8,44 @@
#ifdef RT_THREAD
#include "rtthread.h"
#endif
-#define DBG_DEV rtt()
+#if 0
+
+
+#define DBG_DEV_INIT() rtt()->init()
+#define DBG_DEV_WRITE(d,len) rtt()->write(d,len)
+
+#else
+
+#define DBG_DEV_INIT()\
+ {\
+ g_data.uart=dev_get("uart1");\
+ if(g_data.uart){\
+ g_data.uart->init(g_data.uart,0);\
+ }\
+ }
+#define DBG_DEV_WRITE(d,len)\
+ {\
+ if(g_data.uart){\
+ g_data.uart->write(g_data.uart,d,len);\
+ }\
+ }
+
+#endif
+
#define CONSOLEBUF_SIZE 1024
+
typedef struct{
int inited;
#ifdef RT_THREAD
struct rt_mutex mutex;
#endif
+ uart_def *uart;
}self_def;
static self_def g_data;
@@ -32,8 +57,8 @@ int debug_init(void)
#ifdef RT_THREAD
rt_mutex_init(&g_data.mutex,"debug_mutex",RT_IPC_FLAG_FIFO);
#endif
- DBG_DEV->init();
- DBG_DEV->write((const uint8_t *)"\r\n",2);
+ DBG_DEV_INIT();
+ DBG_DEV_WRITE((const uint8_t *)"\r\n",2);
g_data.inited=1;
DBG_LOG("debug inited.\r\n");
}
@@ -64,7 +89,7 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f
va_end(args);
memcpy(&log_buf[length],"\r\n",2);
length+=2;
- DBG_DEV->write((const uint8_t *)log_buf,length);
+ DBG_DEV_WRITE((const uint8_t *)log_buf,length);
#ifdef RT_THREAD
rt_mutex_release(&g_data.mutex);
#endif
diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c
index f5b6369..a2e6f27 100644
--- a/source/task/prot_uc.c
+++ b/source/task/prot_uc.c
@@ -199,7 +199,7 @@ static void protu_set_endecode_fun(protu_def *u)
static int protu_init(void)
{
const sys_param_def *par=sys_param();
- const char *name="uart1";
+ const char *name="host";
protu_def *protu=protu_creat(dev_get(name));
app_variable("protu",protu,0);
diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c
index 86c5f9f..23c7055 100644
--- a/source/task/tran_for_slave.c
+++ b/source/task/tran_for_slave.c
@@ -11,14 +11,356 @@
#include "coder_judge.h"
#include "JQ_UIDGenerate.h"
#include "transmit.h"
-
-
-
-
-
-
-
-
+#include "elec_det.h"
+#include "crc.h"
+#include "dev_backup.h"
+
+
+typedef struct{
+ ucport_def u;
+ rt_timer_t timer;
+}slave_def;
+
+
+
+
+static void slave_del(ucport_def *u)
+{
+ slave_def *s=(slave_def *)u;
+ CHECK_DO(s->timer,rt_timer_delete);
+ free(u);
+}
+
+
+
+// 获取检测结果
+static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ emit tran_reply_signal(u->p,arr_temp(elec_check_result()));
+ return 0;
+}
+static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=check_result_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x02,check_result)
+
+
+
+// 设置硬件版本号
+static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ int value=arr_get(data,0)|(arr_get(data,1)<<8);
+ emit tran_reply_signal(u->p,arr_temp(elec_write_hardversion(value)));
+ return 0;
+}
+static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=write_hw_version_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x03,write_hw_version)
+
+
+
+
+
+// 设置电阻校准值
+static int write_resistor_cbv_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ int value=arr_get(data,0)|(arr_get(data,1)<<8);
+ emit tran_reply_signal(u->p,arr_temp(elec_write_resistor_cbv(value)));
+ return 0;
+}
+static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ int value=arr_get(data,0)|(arr_get(data,1)<<8);
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=write_resistor_cbv_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x04,write_resistor_cbv)
+
+
+
+
+// 测量桥丝阻值
+static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ emit tran_reply_signal(u->p,arr_temp(elec_check_resistor()));
+ return 0;
+}
+static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=check_resistor_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x05,check_resistor)
+
+
+
+
+
+
+// 根据方案检测
+static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data)));
+ return 0;
+}
+static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=check_with_scheme_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x0b,check_with_scheme)
+transmit_export(ym_slave,0x0c,check_with_scheme)
+
+
+
+
+
+// 停止上报
+static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ array_def *r=arr_creat();
+ arr_append(r,0);
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=stop_submit_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x14,stop_submit)
+
+
+
+
+
+
+
+// 定义地址宏
+// 本程序中程序下载地址不是这个地址,在此用来计算偏移量
+#define MCU_APP_ADDR_BASE 0x8004000
+#define MCU_TASKID_ADDR_BASE 0x803f000
+
+// 定义升级结构体
+typedef struct{
+ uint8_t device_state;
+ uint32_t flash_addr;
+}updata_def;
+static updata_def g_updata;
+
+
+// 查询设备状态,第一次返回在app,如果设置了跳转指令则返回在bootloader
+// 1:app;2:bootleader
+static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ array_def *r=arr_creat();
+ arr_append(r,g_updata.device_state+1);
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=device_state_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0xf9,device_state)
+
+// 跳转至bootloader,这里只是改变标志,实际还是在app中
+static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ g_updata.device_state=1;
+ array_def *r=arr_creat();
+ arr_append(r,0);
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=turn_to_bootloader_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0xf8,turn_to_bootloader)
+
+
+
+
+// 生成文件头
+static uint32_t creat_file_head(uint32_t addr,const char *name)
+{
+ uint8_t *td=calloc(FLASH_FILE_HEAD_SIZE,sizeof(uint8_t));
+ // 文件大小和文件名
+ memcpy(td,name,strlen(name));
+ // used字段
+ ((flash_file *)td)->used=0xffffffff;
+ flash_write((uint8_t *)addr,td,FLASH_FILE_HEAD_SIZE);
+ free(td);
+ return addr+FLASH_FILE_HEAD_SIZE;
+}
+
+
+// 擦除app空间
+static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ flash_erase_app2();
+ g_updata.flash_addr=creat_file_head((uint32_t)flash_get_app2(),"slave_app.pkt");
+ array_def *r=arr_creat();
+ arr_append(r,0);
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=erase_app_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0xfe,erase_app)
+
+
+
+
+// 写入数据
+// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度
+static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
+ int len=arr_length(data)-4;
+ int ret=0;
+ uint32_t offset=addr-MCU_APP_ADDR_BASE;
+ addr=g_updata.flash_addr+offset;
+ ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
+ array_def *r=arr_creat();
+ arr_append(r,(ret!=0));
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=write_data_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0xfc,write_data)
+
+
+
+
+// 校验并跳转
+static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
+ uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24);
+ uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24);
+ int len=addr_end-addr_start;
+ addr_start+=FLASH_FILE_HEAD_SIZE;
+ int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len));
+ array_def *r=arr_creat();
+ arr_append(r,ret);
+ emit tran_reply_signal(u->p,arr_temp(r));
+ if(ret==0){
+ later_execute((void (*)(void *))bk_reboot_app,0,100);
+ }
+ return 0;
+}
+static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=ceck_crc_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0xfb,ceck_crc)
+
+
+
+
+
+// 写入数据,这个命令会自动擦除
+// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度
+static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
+{
+ uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
+ int len=arr_length(data)-4;
+ int ret=0;
+ if((addr)==MCU_TASKID_ADDR_BASE){
+ flash_erase_scheme();
+ g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin");
+ }
+ uint32_t offset=addr-MCU_TASKID_ADDR_BASE;
+ addr=g_updata.flash_addr+offset;
+ ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
+ array_def *r=arr_creat();
+ arr_append(r,(ret!=0));
+ emit tran_reply_signal(u->p,arr_temp(r));
+ return 0;
+}
+static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data)
+{
+ int ret=0;
+ slave_def *u=calloc(1,sizeof(slave_def));
+ u->u.p=t;
+ u->u.del=slave_del;
+ u->u.dolater=write_data2_dolater;
+ u->u.dolater(&u->u,cmd,data,"ok");
+ return (ucport_def *)u;
+}
+transmit_export(ym_slave,0x11,write_data2)