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; }