From 3697adba415df3afc225e156806a23e0dfa817d8 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 16 Jan 2026 15:04:03 +0300 Subject: [PATCH] add nocheck flags --- F3:F303/Multistepper/Readme.md | 4 +- F3:F303/Multistepper/commonproto.c | 3 + F3:F303/Multistepper/flash.c | 2 +- F3:F303/Multistepper/flash.h | 4 +- F3:F303/Multistepper/hardware.h | 1 + F3:F303/Multistepper/multistepper.bin | Bin 27392 -> 27808 bytes .../Multistepper/multistepper.creator.user | 58 +++++++++++++---- F3:F303/Multistepper/proto.c | 4 +- F3:F303/Multistepper/steppers.c | 61 +++++++++++------- F3:F303/Multistepper/version.inc | 4 +- 10 files changed, 97 insertions(+), 44 deletions(-) diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index de880a4..282129a 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -398,11 +398,11 @@ Dump motor flags' bits (for `motflagsN`) and reaction to limit switches (`eswrea Motor flags: bit0 - 0: reverse - invert motor's rotation - bit1 - 1: [reserved] + bit1 - 1: nocheck - don't check driver for errors bit2 - 2: [reserved] bit3 - 3: donthold - clear motor's power after stop bit4 - 4: eswinv - inverse end-switches (1->0 instead of 0->1) - bit5 - 5: [reserved] + bit5 - 5: nodiag - don't check DIAG output bit6 - 6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) End-switches reaction: 0 - ignore both end-switches diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 1ad292d..7674ab8 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -89,6 +89,7 @@ errcodes cu_button(uint8_t par, int32_t *val){ errcodes cu_diagn(uint8_t par, int32_t *val){ uint8_t n = PARBASE(par); + uint8_t oldstate = DIAGMULCUR(); #if MOTORSNO > 8 #error "Change this code!" #endif @@ -99,10 +100,12 @@ errcodes cu_diagn(uint8_t par, int32_t *val){ n |= motdiagn(i); } *val = n; + DIAGMUL(oldstate); return ERR_OK; } CHECKN(n, par); *val = motdiagn(n); + DIAGMUL(oldstate); return ERR_OK; } diff --git a/F3:F303/Multistepper/flash.c b/F3:F303/Multistepper/flash.c index f1a667a..22f2f5d 100644 --- a/F3:F303/Multistepper/flash.c +++ b/F3:F303/Multistepper/flash.c @@ -32,7 +32,7 @@ static const uint32_t FLASH_blocksize = (uint32_t)&_BLOCKSIZE; // max amount of Config records stored (will be recalculate in flashstorage_init() static uint32_t maxCnum = 1024 / sizeof(user_conf); // can't use blocksize here -#define DEFMF {.donthold = 1, .drvtype = DRVTYPE_UART} +#define DEFMF {.donthold = 1, .nodiag = 1, .drvtype = DRVTYPE_UART} #define USERCONF_INITIALIZER { \ .userconf_sz = sizeof(user_conf) \ diff --git a/F3:F303/Multistepper/flash.h b/F3:F303/Multistepper/flash.h index b60a7a7..6b87eee 100644 --- a/F3:F303/Multistepper/flash.h +++ b/F3:F303/Multistepper/flash.h @@ -51,11 +51,11 @@ enum{ // motor flags typedef struct{ uint8_t reverse : 1; // bit0 - reversing motor rotation - uint8_t encreverse : 1; // bit1 - reversing encoder rotation - NOT USED HERE!!! + uint8_t nocheck : 1; // bit1 - don't check drivers for error state uint8_t haveencoder : 1; // bit2 - have encoder - NOT USED HERE!!! uint8_t donthold : 1; // bit3 - clear power @ stop (don't hold motor when stopped) uint8_t eswinv : 1; // bit4 - inverse end-switches - uint8_t keeppos : 1; // bit5 - keep current position (as servo motor) - NOT USED HERE!!! + uint8_t nodiag : 1; // bit5 - don't check DIAG output uint8_t drvtype : 2; // bits 6,7 - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) } motflags_t; diff --git a/F3:F303/Multistepper/hardware.h b/F3:F303/Multistepper/hardware.h index c0456eb..aa81743 100644 --- a/F3:F303/Multistepper/hardware.h +++ b/F3:F303/Multistepper/hardware.h @@ -87,6 +87,7 @@ extern const uint32_t EXTpins[EXTNO]; // DIAG output of motors (PE2) & its multiplexer (PE3 - 0, PE4 - 1, PE5 - 2) #define DIAG() (GPIOE->IDR & (1<<2) ? 0 : 1) #define DIAGMUL(x) do{ register uint32_t v = x&7; GPIOE->BSRR = (v | (((~v)&7)<<16))<<3; }while(0) +#define DIAGMULCUR() ((GPIOE->ODR >> 3) & 7) extern volatile TIM_TypeDef *mottimers[MOTORSNO]; diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 1d82208bdb212a59e07ae1f386fd144f0fd72706..3c06885df9231208a019be87ecbfceb9f24d3e5c 100755 GIT binary patch delta 8185 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 A-T(jq diff --git a/F3:F303/Multistepper/multistepper.creator.user b/F3:F303/Multistepper/multistepper.creator.user index 702d3dd..96a4cd7 100644 --- a/F3:F303/Multistepper/multistepper.creator.user +++ b/F3:F303/Multistepper/multistepper.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -13,8 +13,8 @@ ProjectExplorer.Project.EditorSettings + true true - false true Cpp @@ -86,12 +86,14 @@ true + 0 ProjectExplorer.Project.Target.0 Desktop + true Desktop Desktop {91347f2c-5221-46a7-80b1-0a054ca02f79} @@ -109,8 +111,8 @@ GenericProjectManager.GenericMakeStep 1 - Сборка - Сборка + Build + Build ProjectExplorer.BuildSteps.Build @@ -122,8 +124,8 @@ GenericProjectManager.GenericMakeStep 1 - Очистка - Очистка + Clean + Clean ProjectExplorer.BuildSteps.Clean 2 @@ -133,13 +135,48 @@ По умолчанию GenericProjectManager.GenericBuildConfiguration + 0 + 0 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + + true + true + + 1 1 0 - Развёртывание - Развёртывание + Deploy + Deploy ProjectExplorer.BuildSteps.Deploy 1 @@ -163,6 +200,7 @@ ProjectExplorer.CustomExecutableRunConfiguration false + true true @@ -173,10 +211,6 @@ ProjectExplorer.Project.TargetCount 1 - - ProjectExplorer.Project.Updater.FileVersion - 22 - Version 22 diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index 6035741..68385ed 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -407,11 +407,11 @@ int fn_reset(uint32_t _U_ hash, char _U_ *args){ // "reset" (1907803304) static const char* motfl[MOTFLAGS_AMOUNT] = { "0: reverse - invert motor's rotation", - "1: [reserved]", + "1: nocheck - don't check driver for errors", "2: [reserved]", "3: donthold - clear motor's power after stop", "4: eswinv - inverse end-switches (1->0 instead of 0->1)", - "5: [reserved]", + "5: nodiag - don't check DIAG output", "6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved)" }; static const char *eswfl[ESW_AMOUNT] = { diff --git a/F3:F303/Multistepper/steppers.c b/F3:F303/Multistepper/steppers.c index fda2a9f..bbd530f 100644 --- a/F3:F303/Multistepper/steppers.c +++ b/F3:F303/Multistepper/steppers.c @@ -325,38 +325,48 @@ void addmicrostep(uint8_t i){ static void chkstepper(int i){ int32_t i32; static uint8_t stopctr[MOTORSNO] = {0}; // counters for encoders/position zeroing after stopping @ esw - // check DIAGN only for UART/SPI - if(the_conf.motflags[i].drvtype == DRVTYPE_UART || the_conf.motflags[i].drvtype == DRVTYPE_SPI){ - if(motdiagn(i) && state[i] != STP_ERR){ // error occured - DIAGN is low - //DBG("Oldstate: "); USB_putbyte('0' + state[i]); newline(); - /*char Nm = '0'+i; - USB_sendstr(STR_STATE); USB_putbyte(Nm); USB_sendstr("=6\n"); + char Nch = '0' + i; + // check driver status only for UART/SPI + if(!the_conf.motflags[i].nocheck){ + if(state[i] != STP_ERR && (the_conf.motflags[i].drvtype == DRVTYPE_UART || the_conf.motflags[i].drvtype == DRVTYPE_SPI)){ + if(the_conf.motflags[i].nodiag){ // check by pdn-uart + uint32_t u32; switch(the_conf.motflags[i].drvtype){ case DRVTYPE_UART: pdnuart_setmotno(i); if(pdnuart_readreg(TMC2209Reg_GSTAT, &u32)){ - USB_sendstr("GSTAT"); USB_putbyte(Nm); USB_putbyte('='); - USB_sendstr(u2str(u32)); newline(); - } - if(pdnuart_readreg(TMC2209Reg_DRV_STATUS, &u32)){ - USB_sendstr("DRV_STATUS"); USB_putbyte(Nm); USB_putbyte('='); - USB_sendstr(u2str(u32)); newline(); + TMC2209_gstat_reg_t s; + s.value = u32; + if(s.drv_err || s.uv_cp){ + if(pdnuart_readreg(TMC2209Reg_DRV_STATUS, &u32)){ + //TMC2209_drv_status_reg_t d; + //d.value = u32; + USB_sendstr("DRV_STATUS"); USB_putbyte(Nch); + USB_putbyte('='); USB_sendstr(u2str(u32)); + newline(); + } + USB_sendstr("state"); USB_putbyte(Nch); + USB_sendstr("=6\n"); + emstopmotor(i); + state[i] = STP_ERR; + } } break; default: break; - }*/ + } + }else if(DIAG()){ // error occured - DIAGN is low emstopmotor(i); state[i] = STP_ERR; return; } - } + }} #ifdef EBUG if(stp[i]){ stp[i] = 0; // motor state could be changed outside of interrupt, so return it to relax state[i] = STP_RELAX; - USB_sendstr("MOTOR"); USB_putbyte('0'+i); USB_sendstr(" stop @"); printi(stppos[i]); + USB_sendstr("MOTOR"); USB_putbyte(Nch); USB_sendstr(" stop @"); printi(stppos[i]); USB_sendstr(", V="); printu(curspeed[i]); USB_sendstr(", curstate="); printu(state[i]); newline(); } @@ -368,7 +378,7 @@ static void chkstepper(int i){ curspeed[i] = the_conf.maxspd[i]; state[i] = STP_MOVE; #ifdef EBUG - USB_sendstr("MOTOR"); USB_putbyte('0'+i); + USB_sendstr("MOTOR"); USB_putbyte(Nch); USB_sendstr(" -> MOVE@"); printi(stppos[i]); USB_sendstr(", V="); printu(curspeed[i]); newline(); #endif }else{ // increase speed @@ -407,7 +417,7 @@ static void chkstepper(int i){ curspeed[i] = the_conf.minspd[i]; state[i] = STP_MVSLOW; #ifdef EBUG - USB_sendstr("MOTOR"); USB_putbyte('0'+i); + USB_sendstr("MOTOR"); USB_putbyte(Nch); USB_sendstr(" -> MVSLOW@"); printi(stppos[i]); newline(); #endif } @@ -420,7 +430,7 @@ static void chkstepper(int i){ case M0FAST: if(state[i] == STP_RELAX || state[i] == STP_STALL){ // stopped -> move to + #ifdef EBUG - USB_putbyte('M'); USB_putbyte('0'+i); USB_sendstr("FAST: motor stopped\n"); + USB_putbyte('M'); USB_putbyte(Nch); USB_sendstr("FAST: motor stopped\n"); #endif if(ERR_OK != motor_relslow(i, 1000)){ #ifdef EBUG @@ -443,7 +453,7 @@ static void chkstepper(int i){ } if((state[i] == STP_RELAX || state[i] == STP_STALL) && ++stopctr[i] > 5){ // wait at least 50ms #ifdef EBUG - USB_putbyte('M'); USB_putbyte('0'+i); USND("SLOW: motor stopped"); + USB_putbyte('M'); USB_putbyte(Nch); USND("SLOW: motor stopped"); #endif ESW_reaction[i] = the_conf.ESW_reaction[i]; prevstppos[i] = targstppos[i] = stppos[i] = 0; @@ -489,15 +499,20 @@ void stopmotor(uint8_t i){ TODECEL(); } +// process only one stepper per run void process_steppers(){ static uint32_t Tlast = 0; - if(Tms - Tlast < MOTCHKINTERVAL) return; // hit every 10ms + if(Tms - Tlast < MOTCHKINTERVAL / MOTORSNO) return; // hit every ~10ms for full circle Tlast = Tms; static int firstrun = 1; - if(firstrun){ firstrun = 0; init_steppers(); return; } - for(int i = 0; i < MOTORSNO; ++i){ + if(firstrun){ firstrun = 0; init_steppers(); DIAGMUL(0); return; } + static int curmotno = 0; + chkstepper(curmotno++); + if(curmotno == MOTORSNO) curmotno = 0; + DIAGMUL(curmotno); + /*for(int i = 0; i < MOTORSNO; ++i){ chkstepper(i); - } + }*/ } uint8_t geteswreact(uint8_t i){ diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 1ccd19b..592d71c 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "202" -#define BUILD_DATE "2025-04-16" +#define BUILD_NUMBER "205" +#define BUILD_DATE "2026-01-16"