diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index a666059..de880a4 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -368,6 +368,7 @@ In case of absence of `ACK` you can get message `CAN bus is off, try to restart ### canspeed N CAN bus speed (in kbps, 50 <= N <= 1500) In case of setter, store new speed value in global parameters (and if you call `saveconf` later, it will be saved in flash memory). +As getter show string like `canspeed=250kbps`. ### canstat Get CAN bus status: values of registers `CAN->MSR`, `CAN->TSR`, `CAN->RF0R` and `CAN->RF1F`. ### diagn[N] (37) G @@ -404,9 +405,10 @@ Dump motor flags' bits (for `motflagsN`) and reaction to limit switches (`eswrea bit5 - 5: [reserved] bit6 - 6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) End-switches reaction: - 0 - ignore end-switches - 1 - stop @ esw in any moving direction - 2 - stop only when moving in given direction (e.g. to minus @ESW0) + 0 - ignore both end-switches + 1 - ignore ESW1, ESW0 stops only when negative mowing + 2 - stop @ esw in any moving direction + 3 - stop only when moving in given direction (e.g. to minus @ESW0) ### dumpstates Dump motors' state codes (for getter `stateN`): @@ -484,6 +486,7 @@ external multiplexer status (<0 - disable, 0..7 - enable and set address). Motor number for next `pdn` commands (if you want to run custom commands by hands or in a batch). ### motreinit (25) Re-init motors after configuration changed. Some changes will run this automatically. +Answer - "OK" or error text. ### pdnN (43) GS Read/write TMC2209 (and other UART-based drivers) registers over uart @ motor number `motno`. For `pdnN=X` `N` is register number, `X` is data to write into it. Due to protocol's particulars @@ -498,6 +501,7 @@ Like `relpos` but with constant slowest speed (you can change it with `minspeed` Software reset. ### saveconf (13) Save current configuration into MCU flash memory. +Answer - "OK" or error text. ### screen* GS Enable (1) or disable (0) screen. ### speedlimit (20) G @@ -506,6 +510,7 @@ Get limiting speed for current microsteps setting. Get Nth motor state (`dumpstates`: 0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err). ### stopN (30) Stop Nth motor with deceleration (moving by ramp). +Answer - "OK" or error text. ### time (10) G Get time from start (ms). ### tmcbus * GS @@ -554,22 +559,20 @@ Command codes described in USB answer for `dumpcmd`: 26 - goto 27 - relpos 28 - relslow - 29 - emstop N + 29 - emstop 30 - stop - 31 - emstop all 32 - gotoz 33 - state 35 - abspos 36 - motmul 37 - diagn 38 - eraseflash - 39 - udata - 40 - usartstatus 41 - vdrive 42 - vfive 43 - pdn 44 - motno 45 - drvtype + 46 - motcurrent Error codes (`dumperr`): diff --git a/F3:F303/Multistepper/can.c b/F3:F303/Multistepper/can.c index b109441..5a1a54d 100644 --- a/F3:F303/Multistepper/can.c +++ b/F3:F303/Multistepper/can.c @@ -22,9 +22,7 @@ #include "hardware.h" #include "strfunc.h" #include "usb_dev.h" -#ifdef EBUG #include "proto.h" -#endif // PD1 - Tx, PD0 - Rx !!! @@ -304,17 +302,21 @@ CAN_status CAN_send(uint8_t *msg, uint8_t len, uint16_t target_id){ return CAN_OK; } -void CAN_flood(CAN_message *msg, int incr){ +// return: 1 - flood is ON, 0 - flood is OFF +int CAN_flood(CAN_message *msg, int incr){ if(incr){ incrmessagectr = 0; incrflood = 1; - return; + return 1; }else incrflood = 0; - if(!msg) flood_msg = NULL; - else{ + if(!msg){ + flood_msg = NULL; + return 0; + }else{ memcpy(&loc_flood_msg, msg, sizeof(CAN_message)); flood_msg = &loc_flood_msg; } + return 1; } uint32_t CAN_speed(){ diff --git a/F3:F303/Multistepper/can.h b/F3:F303/Multistepper/can.h index feb3556..4dd0a0c 100644 --- a/F3:F303/Multistepper/can.h +++ b/F3:F303/Multistepper/can.h @@ -56,5 +56,5 @@ void CAN_printerr(); CAN_message *CAN_messagebuf_pop(); -void CAN_flood(CAN_message *msg, int incr); +int CAN_flood(CAN_message *msg, int incr); uint32_t CAN_speed(); diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 1fc6c5d..1ad292d 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -275,7 +275,6 @@ errcodes cu_mcuvdd(uint8_t par, int32_t *val){ errcodes cu_microsteps(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); - USB_sendstr("===> val="); printi(*val); newline(); if(ISSETTER(par)){ #if MICROSTEPSMAX > 512 #error "Change the code anywhere!" @@ -443,7 +442,7 @@ errcodes cu_usartstatus(uint8_t _U_ par, int32_t _U_ *val){ // V*10 errcodes cu_vdrive(uint8_t par, int32_t _U_ *val){ NOPARCHK(par); - *val = getADCvoltage(ADC_VDRIVE); + *val = getADCvoltage(ADC_VDRIVE) * 11; return ERR_OK; } diff --git a/F3:F303/Multistepper/flash.c b/F3:F303/Multistepper/flash.c index d738549..f1a667a 100644 --- a/F3:F303/Multistepper/flash.c +++ b/F3:F303/Multistepper/flash.c @@ -152,9 +152,9 @@ static int write2flash(const void *start, const void *wrdata, uint32_t stor_size // erase Nth page of flash storage (flash should be prepared!) static int erase_pageN(int N){ int ret = 0; -#ifdef EBUG +//#ifdef EBUG USB_sendstr("Erase block #"); printu(N); newline(); -#endif +//#endif FLASH->AR = (uint32_t)Flash_Data + N*FLASH_blocksize; FLASH->CR |= FLASH_CR_STRT; while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; @@ -185,13 +185,16 @@ int erase_storage(int npage){ FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } - /*USB_sendstr("size/block size/nblocks/FLASH_SIZE: "); printu(flsz); +//* + USB_sendstr("size/block size/nblocks/FLASH_SIZE: "); printu(flsz); USB_putbyte('/'); printu(FLASH_blocksize); USB_putbyte('/'); - printu(nblocks); USB_putbyte('/'); printu(FLASH_SIZE); newline(); USB_sendall();*/ + printu(flsz / FLASH_blocksize); USB_putbyte('/'); printu(FLASH_SIZE); newline(); +//*/ while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; FLASH->CR |= FLASH_CR_PER; for(uint32_t i = start; i < end; ++i){ + IWDG->KR = IWDG_REFRESH; if(erase_pageN(i)){ ret = 1; break; diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 7451c88..b4e5f17 100755 Binary files a/F3:F303/Multistepper/multistepper.bin and b/F3:F303/Multistepper/multistepper.bin differ diff --git a/F3:F303/Multistepper/multistepper.creator.user b/F3:F303/Multistepper/multistepper.creator.user index 2b30f37..702d3dd 100644 --- a/F3:F303/Multistepper/multistepper.creator.user +++ b/F3:F303/Multistepper/multistepper.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -33,6 +33,7 @@ false 4 false + 0 80 true true diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index 01eff68..6035741 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -40,6 +40,15 @@ uint8_t ShowMsgs = 1; static uint16_t Ignore_IDs[IGN_SIZE]; static uint8_t IgnSz = 0; +static const char* errtxt[ERR_AMOUNT] = { + [ERR_OK] = "OK", + [ERR_BADPAR] = "BADPAR", + [ERR_BADVAL] = "BADVAL", + [ERR_WRONGLEN] = "WRONGLEN", + [ERR_BADCMD] = "BADCMD", + [ERR_CANTRUN] = "CANTRUN", +}; + // parse `txt` to CAN_message static CAN_message *parseCANmsg(const char *txt){ static CAN_message canmsg; @@ -134,7 +143,7 @@ int fn_canignore(uint32_t _U_ hash, char *args){ int fn_canreinit(uint32_t _U_ hash, char _U_ *args){ CAN_reinit(0); - USND("OK"); + USND(errtxt[ERR_OK]); return RET_GOOD; } @@ -287,8 +296,10 @@ int fn_canfilter(uint32_t _U_ hash, char *args){ } int fn_canflood(uint32_t _U_ hash, char *args){ - CAN_flood(parseCANmsg(args), 0); - USB_sendstr("Simple flooding is ON (send with empty ID to stop)\n"); + if(CAN_flood(parseCANmsg(args), 0)) + USB_sendstr("Simple flooding is ON (send with empty ID to stop)\n"); + else + USB_sendstr("CAN flooding is OFF\n"); return RET_GOOD; } @@ -343,8 +354,8 @@ int fn_canspeed(uint32_t _U_ hash, char _U_ *args){ uint32_t N; const char *n = getnum(args, &N); if(args == n){ - USB_sendstr("No speed given"); - return RET_GOOD; + USB_sendstr("canspeed="); + goto rtn; } if(N < 50){ USND("Lower speed is 50kbps"); @@ -355,9 +366,10 @@ int fn_canspeed(uint32_t _U_ hash, char _U_ *args){ } CAN_reinit((uint16_t)N); uint32_t regval = 4500 / N; - the_conf.CANspeed = 4500 * regval; + the_conf.CANspeed = 4500 / regval; USB_sendstr("Reinit CAN bus with speed "); - printu(the_conf.CANspeed); USB_sendstr("kbps"); newline(); +rtn: + printu(the_conf.CANspeed); USND("kbps"); return RET_GOOD; } @@ -422,14 +434,6 @@ int fn_dumpmotflags(uint32_t _U_ hash, char _U_ *args){ // "dumpmotflags" (3615 return RET_GOOD; } -static const char* errtxt[ERR_AMOUNT] = { - [ERR_OK] = "OK", - [ERR_BADPAR] = "BADPAR", - [ERR_BADVAL] = "BADVAL", - [ERR_WRONGLEN] = "WRONGLEN", - [ERR_BADCMD] = "BADCMD", - [ERR_CANTRUN] = "CANTRUN", -}; int fn_dumperr(uint32_t _U_ hash, char _U_ *args){ // "dumperr" (1223989764) USND("Error codes:"); for(int i = 0; i < ERR_AMOUNT; ++i){ @@ -559,7 +563,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_EMSTOP: e = cu_emstop(par, &val); - if(e == ERR_OK){ USND("OK"); return RET_GOOD;} + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_ESWREACT: e = cu_eswreact(par, &val); @@ -608,6 +612,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_MOTREINIT: e = cu_motreinit(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_PDN: e = cu_pdn(par, &val); @@ -623,6 +628,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_SAVECONF: e = cu_saveconf(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_SCREEN: e = cu_screen(par, &val); @@ -635,6 +641,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_STOP: e = cu_stop(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_TIME: e = cu_time(par, &val); diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 8027805..5630367 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "192" -#define BUILD_DATE "2025-02-05" +#define BUILD_NUMBER "200" +#define BUILD_DATE "2025-02-06"