diff --git a/checker_gen1.uvoptx b/checker_gen1.uvoptx
index 44bb1f8..911a197 100644
--- a/checker_gen1.uvoptx
+++ b/checker_gen1.uvoptx
@@ -120,7 +120,7 @@
0
DLGUARM
- ,
+ 5
0
@@ -157,11 +157,19 @@
1
- 0
- str
+ 1
+ 0x100004D8
0
+
+
+ 2
+ 1
+ m
+ 0
+
+
3
@@ -329,6 +337,7 @@
0
DLGUARM
+ 1
0
@@ -361,40 +370,7 @@
UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM))
-
-
- 0
- 0
- 99
- 1
- 134230110
- 0
- 0
- 0
- 0
- 0
- 1
- .\source\rt_thread\board.c
-
- \\checker_gen1_boot\source/rt_thread/board.c\99
-
-
- 1
- 0
- 182
- 1
- 134218452
- 0
- 0
- 0
- 0
- 0
- 1
- .\source\core\startup_stm32f40_41xxx.s
-
- \\checker_gen1_boot\source/core/startup_stm32f40_41xxx.s\182
-
-
+
0
@@ -418,6 +394,22 @@
0
+
+
+ 3
+ 1
+ 0x2000CA00
+ 0
+
+
+
+
+ 4
+ 0
+ 0x20019bb0
+ 0
+
+
0
@@ -1132,7 +1124,7 @@
rt_thread
- 1
+ 0
0
0
0
diff --git a/checker_gen1.uvprojx b/checker_gen1.uvprojx
index 40f1848..0ab2bcd 100644
--- a/checker_gen1.uvprojx
+++ b/checker_gen1.uvprojx
@@ -132,7 +132,7 @@
1
0
0
- 1
+ 0
1
4096
@@ -1481,7 +1481,7 @@
1
0
0
- 1
+ 0
1
4096
@@ -1661,7 +1661,7 @@
1
- 1
+ 4
0
0
1
diff --git a/download.jflash b/download.jflash
new file mode 100644
index 0000000..ef4b53f
--- /dev/null
+++ b/download.jflash
@@ -0,0 +1,82 @@
+ AppVersion = 76403
+ FileVersion = 2
+[GENERAL]
+ aATEModuleSel[24] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ ConnectMode = 0
+ CurrentFile = ""
+ DataFileSAddr = 0x00000000
+ GUIMode = 0
+ HostName = ""
+ TargetIF = 1
+ USBPort = 0
+ USBSerialNo = 0x00000000
+ UseATEModuleSelection = 0
+[JTAG]
+ IRLen = 0
+ MultipleTargets = 0
+ NumDevices = 0
+ Speed0 = 4000
+ Speed1 = 4000
+ TAP_Number = 0
+ UseAdaptive0 = 0
+ UseAdaptive1 = 0
+ UseMaxSpeed0 = 0
+ UseMaxSpeed1 = 0
+[CPU]
+ NumInitSteps = 1
+ InitStep0_Action = "Reset"
+ InitStep0_Value0 = 0x00000000
+ InitStep0_Value1 = 0x00000000
+ InitStep0_Comment = "Reset and halt target"
+ NumExitSteps = 0
+ UseScriptFile = 0
+ ScriptFile = ""
+ UseRAM = 1
+ RAMAddr = 0x20000000
+ RAMSize = 0x00020000
+ CheckCoreID = 1
+ CoreID = 0x4BA00477
+ CoreIDMask = 0x0F000FFF
+ UseAutoSpeed = 0x00000001
+ ClockSpeed = 0x00000000
+ EndianMode = 0
+ ChipName = "ST STM32F407VG"
+[FLASH]
+ aRangeSel[1] = 0-11
+ BankName = "Internal flash"
+ BankSelMode = 1
+ BaseAddr = 0x08000000
+ NumBanks = 1
+[PRODUCTION]
+ AutoPerformsDisconnect = 0
+ AutoPerformsErase = 1
+ AutoPerformsProgram = 1
+ AutoPerformsSecure = 0
+ AutoPerformsStartApp = 0
+ AutoPerformsUnsecure = 0
+ AutoPerformsVerify = 1
+ EnableFixedVTref = 0
+ EnableTargetPower = 0
+ EraseType = 1
+ FixedVTref = 0x00000CE4
+ MonitorVTref = 0
+ MonitorVTrefMax = 0x0000157C
+ MonitorVTrefMin = 0x000003E8
+ OverrideTimeouts = 0
+ ProgramSN = 0
+ SerialFile = ""
+ SNAddr = 0x00000000
+ SNInc = 0x00000001
+ SNLen = 0x00000004
+ SNListFile = ""
+ SNValue = 0x00000001
+ StartAppType = 0
+ TargetPowerDelay = 0x00000014
+ TimeoutErase = 0x00003A98
+ TimeoutProgram = 0x00002710
+ TimeoutVerify = 0x00002710
+ VerifyType = 1
+[PERFORMANCE]
+ DisableSkipBlankDataOnProgram = 0x00000000
+ PerfromBlankCheckPriorEraseChip = 0x00000001
+ PerfromBlankCheckPriorEraseSelectedSectors = 0x00000001
diff --git a/python/prottcp.py b/python/prottcp.py
index da6079b..dbf4a63 100644
--- a/python/prottcp.py
+++ b/python/prottcp.py
@@ -430,6 +430,8 @@ class protu(QObject):
if __name__ == "__main__":
u=protu()
- u.init("utcp:7777")
+ # u.init("utcp:7777")
# u.send_file(0xee,"file/JQ_JCXB_V54.bin")
- u.send_file(0xed,"../Objects/checker_gen1_app_20230602.bin")
+ # u.send_file(0xed,"../Objects/checker_gen1_app_20230602.bin")
+ u.cmd=0x34
+ print(u.encode(bytearray()).hex(' '))
diff --git a/source/ReadMe.txt b/source/ReadMe.txt
index 8b2d06f..3b806d0 100644
--- a/source/ReadMe.txt
+++ b/source/ReadMe.txt
@@ -105,9 +105,12 @@
log打印可以单独设置主机地址
bootloader解决打包时间始终被设置为?的bug
赋码仪相关指令全部添加通道字段
-
-
-
+2023.6.16
+ 解决hostif字段不对造成的程序死机问题
+ 通过命令0x08设置的参数如果参数错误会返回对应的错误码
+ 系统初始化不会因为参数错误而死机
+2023.6.16
+ 编译app自动生成boot.bin程序,可以用jlink或离线下载器下载到单片机
\ No newline at end of file
diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h
index bb3ed1d..7f1e293 100644
--- a/source/main/compiler_info.h
+++ b/source/main/compiler_info.h
@@ -6,7 +6,7 @@
-#define BUILD_DATE "2023-06-15 17:41:54"
+#define BUILD_DATE "2023-06-16 17:58:34"
#define SOFT_VERSION "0.01"
diff --git a/source/main/main.c b/source/main/main.c
index d9ba101..20bac76 100644
--- a/source/main/main.c
+++ b/source/main/main.c
@@ -513,6 +513,7 @@ void param_init(rom_head *h)
else{
// 填充默认配置
if(pars.local_id==0xffffffff){
+ memcpy(pars.pack_time,"initial app",12);
memcpy(pars.host_if,"uart4",6);
memcpy(pars.device_type,"coder",6);
mac_init(pars.mac);
diff --git a/source/mycopy.py b/source/mycopy.py
index ed8c063..91f2bd7 100644
--- a/source/mycopy.py
+++ b/source/mycopy.py
@@ -7,7 +7,7 @@ import prebuild as time
# 定义app和boot文件路径(没有尾缀)
APP_FILE_SRC = "./Objects/app/checker_gen1_app"
-BOOT_FILE_SRC = "./Objects/app/checker_gen1_boot"
+BOOT_FILE_SRC = "./Objects/boot/checker_gen1_boot"
# APP_FILE_DST = "./Objects/checker_gen1_app"
APP_FILE_DST = "./python/file/checker_gen1_app"
BOOT_FILE_DST = "./Objects/checker_gen1_boot"
@@ -141,9 +141,23 @@ def main():
data=head+data
with open(dst,"wb") as f:
f.write(data)
- print(dst+' File copy success.')
-
-
+ print(dst+' create app file success.')
+ boot=BOOT_FILE_SRC+".bin"
+ boot_dst=BOOT_FILE_DST+"_"+date+".bin"
+ if os.path.exists(boot):
+ d=bytearray()
+ with open(boot,"rb") as f:
+ d+=f.read()
+ d+=arr_byte_copy(0xff,0x20000-len(d))
+ with open(src,"rb") as f:
+ d+=f.read()
+ if os.path.exists(boot_dst):
+ os.remove(boot_dst)
+ with open(boot_dst,"wb") as f:
+ f.write(d)
+ print(boot_dst+" create boot file success.")
+ else:
+ print("please build bootloader to create boot file")
if __name__=="__main__":
main()
diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c
index 8afc40c..88f6c4a 100644
--- a/source/task/prot_uc.c
+++ b/source/task/prot_uc.c
@@ -199,7 +199,10 @@ static void protu_set_endecode_fun(protu_def *u)
static int protu_init(void)
{
const sys_param_def *par=sys_param();
- protu_def *protu=protu_creat(dev_get(par->host_if));
+ const char *name="uart4";
+ if(strcmp((par->host_if),"utcp")==0)
+ name="utcp";
+ protu_def *protu=protu_creat(dev_get(name));
app_variable("protu",protu,0);
// 如果通信接口不是用的串口,则增加一个串口的通信
diff --git a/source/task/tran_for_checker.c b/source/task/tran_for_checker.c
index fd3b815..196cae1 100644
--- a/source/task/tran_for_checker.c
+++ b/source/task/tran_for_checker.c
@@ -16,32 +16,64 @@
typedef struct{
ucport_def u;
- uint16_t addrs;
void (*doexert)(ucport_def *u);
uint8_t ack_num;
- uint8_t ack_size;
+ int ret_skip;
+ int ack_size;
uint8_t ack[0];
}check_def;
+
+// 判断检测数据是否超限,返回填充的字节个数
+static int in_range(const uint8_t *src_data,uint8_t *range)
+{
+ const scheme_def *s=check_scheme();
+ int temp;
+ for(int i=0;irange_num;i++)
+ {
+ temp=src_data[i*2]|(src_data[i*2+1]<<8);
+ if(temp>=s->range[i].min&&temp<=s->range[i].max){
+ range[i/8]&=~(1<<(i%8));
+ }else{
+ range[i/8]|=(1<<(i%8));
+ }
+ }
+ DBG_LOG("range_num=%d, ",s->range_num);
+ return (s->range_num+7)/8;
+}
+
+
+
+
+
+
// 检测完成
static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str)
{
check_def *w=(check_def *)u;
uint8_t addr=port_get_addr(src);
- if(addr<=0||addr>10){
+ if(addr<=0||addr>20){
DBG_WARN("addr err:%d",addr);
return;
}
- int return_size=(check_scheme()->range_num*2+8);
- uint8_t *ack_d=&w->ack[(addr-1)*return_size];
- if(return_size!=arr_length(data)){
- DBG_WARN("data err:%d",addr);
- return;
+ int return_size=w->ret_skip;
+ uint8_t *ack_d=&w->ack[(addr-1)*return_size];
+ if(ack==0)
+ {
+ // 复制流程结果
+ memcpy(ack_d,arr_data(data),8);ack_d+=8;
+ // 返回参数校验,跳过8字节的流程执行位
+ ack_d+=in_range(arr_data(data)+8+8,ack_d);
+ // 复制返回参数,跳过8字节的流程执行位
+ memcpy(ack_d,arr_data(data)+8+8,check_scheme()->range_num*2);
+ }
+ else
+ {
+ // 复制为0xff 无效数据
+ memset(ack_d,0xff,return_size);
}
- memcpy(ack_d,arr_data(data),return_size);
- // TODO: 还有4字节数据
w->ack_num++;
if(w->ack_num>=20)
{
@@ -62,25 +94,21 @@ static void check_del(ucport_def *u)
static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
{
- if(arr_length(data)<7){
- DBG_WARN("cmd format err.");
- return 0;
- }
- int return_size=(check_scheme()->range_num*2+8);
- check_def *u=calloc(1,sizeof(check_def)+return_size*10);
- u->ack_size=return_size*10;
+ int return_size=(check_scheme()->range_num*2+8+(check_scheme()->range_num+7)/8);
+ check_def *u=calloc(1,sizeof(check_def)+return_size*20);
+ u->ret_skip=return_size;
+ u->ack_size=return_size*20;
u->u.p=t;
u->u.del=check_del;
u->u.doend=check_end;
+ DBG_LOG("check: skip=%d",u->ret_skip);
tran_set_busy(t,1);
for(int i=0;i<20;i++)
{
- if(u->addrs&(1<u.p,i);
- // 这里打开检测
- if(mcu){
- port_start(mcu,check_creat(check_scheme()));
- }
+ port_mcu *mcu=tran_get_portm(u->u.p,i);
+ // 这里打开检测
+ if(mcu){
+ port_start(mcu,check_creat(check_scheme()));
}
}
@@ -319,22 +347,52 @@ static void paraminfo_fill(paraminfo_def *p)
// 保存配置项
-static void paraminfo_save(paraminfo_def *p)
+static int paraminfo_save(paraminfo_def *p)
{
+ int ret=0;
sys_param_def *spar=0;
spar=calloc(1,sizeof(sys_param_def));
memcpy(spar,sys_param(),sizeof(sys_param_def));
- memcpy(spar->device_type,p->devicetype,12);
- memcpy(spar->host_if,p->hostif,8);
- memcpy(spar->local_ip,p->localip,4);
- memcpy(spar->host_ip,p->hostip,4);
+ if(strcmp("coder",p->devicetype)==0||strcmp("checker",p->devicetype)==0)
+ memcpy(spar->device_type,p->devicetype,12);
+ else {
+ DBG_WARN("devicetype param must be \"coder\" or \"checker\"");
+ ret=1;return ret;}
+ if(strcmp("uart4",p->hostif)==0||strcmp("utcp",p->hostif)==0)
+ memcpy(spar->host_if,p->hostif,8);
+ else {
+ DBG_WARN("host_if param must be \"uart4\" or \"utcp\"");
+ ret=2;return ret;}
+ if(memcmp(p->localip,(uint8_t []){0,0,0,0},4)!=0)
+ memcpy(spar->local_ip,p->localip,4);
+ else {
+ DBG_WARN("localip param must not be all zero");
+ ret=3;return ret;}
+ if(memcmp(p->hostip,(uint8_t []){0,0,0,0},4)!=0)
+ memcpy(spar->host_ip,p->hostip,4);
+ else {
+ DBG_WARN("hostip param must not be all zero");
+ ret=4;return ret;}
spar->host_port=p->hostport;
spar->local_id=p->localid;
- spar->uartbsp=p->uartbsp;
- spar->coder_ret_mode=p->coder_return_mode;
- spar->slave_addr_start=p->slave_addr_start;
+ if(p->uartbsp==115200||p->uartbsp==9600)
+ spar->uartbsp=p->uartbsp;
+ else {
+ DBG_WARN("uartbsp param must be 115200 or 9600");
+ ret=5;return ret;}
+ if(p->coder_return_mode==0||p->coder_return_mode==1)
+ spar->coder_ret_mode=p->coder_return_mode;
+ else {
+ DBG_WARN("coder_return_mode param must be 0 or 1");
+ ret=6;return ret;}
+ if(p->slave_addr_start==0||p->slave_addr_start==1)
+ spar->slave_addr_start=p->slave_addr_start;
+ else {
+ DBG_WARN("slave_addr_start param must be 0 or 1");
+ ret=7;return ret;}
flash_save_param(spar);
+ return ret;
}
@@ -378,16 +436,15 @@ static ucport_def *param(tran_def *t, uint8_t cmd,array_def *data)
// 赋码仪添加通道数
arr_append(a,10);
}
- if(arr_length(data)<1+sizeof(paraminfo_def)){
- arr_append(a,1);
+ if(arr_length(data)<1+off+sizeof(paraminfo_def)){
+ arr_append(a,0xff);
emit tran_reply_signal(u->u.p,arr_temp(a));
}else{
memcpy(&u->par,arr_data(data)+1,sizeof(paraminfo_def));
- paraminfo_save(&u->par);
- arr_append(a,0);
+ int ret=paraminfo_save(&u->par);
+ arr_append(a,ret);
emit tran_reply_signal(u->u.p,arr_temp(a));
}
- paraminfo_save(&u->par);
}
diff --git a/source/task/tran_for_coder2.c b/source/task/tran_for_coder2.c
index 1ab35d2..ff5705f 100644
--- a/source/task/tran_for_coder2.c
+++ b/source/task/tran_for_coder2.c
@@ -10,6 +10,7 @@
#include "handle_for_checker.h"
#include "coder_lib.h"
#include "PSDGenerate.h"
+#include "mystring.h"
// 这个文件解析跟赋码仪相关的命令
@@ -389,6 +390,7 @@ static void live_send(void *p)
arr_append(d,slave_online&0xff);// 在线的小板
arr_append(d,(slave_online>>8)&0xff);
emit coder2_live_send_signal(p,0x8a,arr_temp(d));
+ //DBG_LOG("tcp liver:%s",str_temp(arr_string(d)));
}
@@ -405,6 +407,7 @@ static void init_for_tcp(void *t)
connect(tcp,tcp_connect_signal,0,live,live_connect);
connect(tcp,tcp_recv_signal,0,live,live_recv);
connect(live,coder2_live_send_signal,0,protu,protu_send_call);
+ DBG_LOG("tcp liver created");
}else{
DBG_WARN("can not fond variable \"tcp\" or/and \"protu\"");
}
@@ -421,6 +424,8 @@ static int init_live_keeper(void)
if((strcmp(par->device_type,"coder")==0)&&(strcmp(par->host_if,"utcp")==0))
{
app_valid_call("protu",init_for_tcp,0);
+ }else{
+ DBG_LOG("tcp liver not created");
}
return 0;
}