From 87683a12e68b740a7f6a7efd9750f8ed4d24e784 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 20 Jan 2026 16:35:21 +0300 Subject: [PATCH] fixed some bugs --- F3:F303/Multistepper/commonproto.c | 9 ++- F3:F303/Multistepper/esprif.conf | 66 ++++++++++++++++++ F3:F303/Multistepper/hardware.c | 17 +++-- F3:F303/Multistepper/multistepper.bin | Bin 27808 -> 28032 bytes .../Multistepper/multistepper.creator.user | 2 +- F3:F303/Multistepper/pdnuart.c | 34 +++++++-- F3:F303/Multistepper/steppers.c | 36 ++++++++-- F3:F303/Multistepper/stty | 4 ++ F3:F303/Multistepper/version.inc | 4 +- F3:F303/inc/Fx/common_macros.h | 4 -- 10 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 F3:F303/Multistepper/esprif.conf create mode 100755 F3:F303/Multistepper/stty diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 7674ab8..5e1e756 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -359,9 +359,14 @@ errcodes cu_motmul(uint8_t _U_ par, int32_t _U_ *val){ return ERR_BADCMD; } +// witout parameter - reinit all steppers; with parameter - just update current errcodes cu_motreinit(uint8_t _U_ par, int32_t _U_ *val){ - NOPARCHK(par); - init_steppers(); + uint8_t n = PARBASE(par); + if(n == CANMESG_NOPAR) init_steppers(); + else{ + if(n > MOTORSNO - 1) return ERR_BADPAR; + if(!update_stepper(n)) return ERR_CANTRUN; + } return ERR_OK; } diff --git a/F3:F303/Multistepper/esprif.conf b/F3:F303/Multistepper/esprif.conf new file mode 100644 index 0000000..661e342 --- /dev/null +++ b/F3:F303/Multistepper/esprif.conf @@ -0,0 +1,66 @@ +canspeed=100 +canid=1 +microsteps0=32 +accel0=3000 +maxspeed0=2000 +minspeed0=20 +maxsteps0=500000 +motcurrent0=31 +motflags0=0x69 +eswreact0=1 +microsteps1=32 +accel1=3000 +maxspeed1=2000 +minspeed1=20 +maxsteps1=500000 +motcurrent1=31 +motflags1=0x69 +eswreact1=1 +microsteps2=32 +accel2=2000 +maxspeed2=1000 +minspeed2=20 +maxsteps2=500000 +motcurrent2=31 +motflags2=0x69 +eswreact2=1 +microsteps3=32 +accel3=2000 +maxspeed3=1000 +minspeed3=20 +maxsteps3=500000 +motcurrent3=31 +motflags3=0x78 +eswreact3=0 +microsteps4=32 +accel4=2000 +maxspeed4=2000 +minspeed4=20 +maxsteps4=500000 +motcurrent4=31 +motflags4=0x68 +eswreact4=0 +microsteps5=32 +accel5=500 +maxspeed5=2000 +minspeed5=20 +maxsteps5=500000 +motcurrent5=31 +motflags5=0x68 +eswreact5=0 +microsteps6=32 +accel6=500 +maxspeed6=2000 +minspeed6=20 +maxsteps6=500000 +motcurrent6=31 +motflags6=0x68 +eswreact6=0 +microsteps7=32 +accel7=500 +maxspeed7=2000 +minspeed7=20 +maxsteps7=500000 +motcurrent7=31 +motflags7=0x68 +eswreact7=0 diff --git a/F3:F303/Multistepper/hardware.c b/F3:F303/Multistepper/hardware.c index 7244b1c..3ea5645 100644 --- a/F3:F303/Multistepper/hardware.c +++ b/F3:F303/Multistepper/hardware.c @@ -103,8 +103,8 @@ TRUE_INLINE void gpio_setup(){ RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOEEN | RCC_AHBENR_GPIOFEN; // enable timers: 1,2,3,4,8,15,16,17 - RCC->APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN; - RCC->APB2ENR |= RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM8EN | RCC_APB2ENR_TIM15EN | RCC_APB2ENR_TIM16EN | RCC_APB2ENR_TIM17EN; + RCC->APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN; // 36MHz + RCC->APB2ENR |= RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM8EN | RCC_APB2ENR_TIM15EN | RCC_APB2ENR_TIM16EN | RCC_APB2ENR_TIM17EN; // 72MHz for(int i = 0; i < 10000; ++i) nop(); GPIOA->ODR = 0; GPIOA->AFR[0] = AFRf(5, 5) | AFRf(5, 6) | AFRf(5, 7); @@ -194,28 +194,33 @@ TRUE_INLINE void iwdg_setup(){ static void setup_mpwm(int i){ volatile TIM_TypeDef *TIM = mottimers[i]; TIM->CR1 = TIM_CR1_ARPE; // buffered ARR - TIM->PSC = MOTORTIM_PSC; // 26MHz + TIM->PSC = MOTORTIM_PSC; // 24MHz // PWM mode 1 (active -> inactive) uint8_t n = mottchannels[i]; + volatile uint32_t *CCRx = &TIM->CCR1; switch(n){ case 1: TIM->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; + //CCRx = &TIM->CCR1; break; case 2: TIM->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; + //CCRx = &TIM->CCR2; break; case 3: TIM->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; + //CCRx = &TIM->CCR3; break; default: TIM->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; + //CCRx = &TIM->CCR4; } #if MOTORTIM_ARRMIN < 5 #error "change the code!" #endif - TIM->CCR1 = MOTORTIM_ARRMIN - 3; // ~10us for pulse duration - TIM->ARR = 0xffff; -// TIM->EGR = TIM_EGR_UG; // generate update to refresh ARR + CCRx[n-1] = MOTORTIM_ARRMIN - 3; // ~10us for pulse duration + TIM->ARR = MOTORTIM_ARRMIN * 2; + TIM->EGR = TIM_EGR_UG; // generate update to refresh ARR TIM->BDTR |= TIM_BDTR_MOE; // enable main output TIM->CCER = 1<<((n-1)*4); // turn it on, active high TIM->DIER = 1<o6~Bb>RSh_J&T!`O{r4H{I=|n4_S$Q$z4qE`ueHxU zGy7T@{Vk?1A&g=}43Qt%p5(JVa8+bdIFW|{En!4nD7l@nze)lEvwP=?Dvw(yb zwojTQ8}Y(+`||A>E)7M@eVKb@0g>dKc*OMehg~&Znj!^LT`pwjmI>Lj9DKS1ZSI;p$t#R-l*xgKCZbS)v zmE1rgn9=bDW_bP+mfZ>tvx|;#@Ne16l$d}tk_e@SJ#1<^dDOvw<~ZAlsGGdVCF2bQ zf7An0(zx_^ZtcKe-_paZ$Uc#48pN(A3%oB0dC?AD&(#hbGTWt@feqQ=ru(LnBXHNP zRiSn8%dFJ0ldFJRD;-4H)%>w=!khLg?5-Ml15-^DJB93$jY4*kga6u&w!~F)`3TqF z$8WA{ZqphcmG()JP3Z%evU?dO^jCvrE(Ga94}|8L7|oXdzdle?sb8EThu=HaYll;M7{&F~Vfw)PCv#n=MKx zdV*ahu`hAk{g%1sV0}bI)SG5E^zlEz3|J;8HFjQackr(YbZ|BIL%=fMQ9{3IK80Z> zhV{vHRR~R#SJRK1)0;MaMPDCGuMsZYWk{F@?`aAN}Fn7!Pxz^%;7oFy=q zA>4wX1jdcq6*OA*tA+b6=pyrvhV4Urqyqgscw~sD=&H$R?5kz{nb7q@d59vF3DXO6 zVw9TrCK|{9?n!VW^ItAjF^(Emq>X;hqR63AVvrwq`sdbiuCH6OyuiWF5wjYJLf*sx zGffVagHPky6(hV&qPIrgL_(X7GBI}kfyfOF87Vs7)kbg1f8bU%1%+!CM z4%gcGGor%N&ZqR)`9?7W{S)H(CvIvxKLMP>Vh}jB;K+QKiG89zF$7E-qLn>b&t4U7 zFm`^Q=m+_y+=%cYv#*~X0D6n~#ORH7llYt4AJ@B$o}f#`18yDHpBRaOCNRk(>dV-K zYrtbbp6NUe&w~yGt)+b+JhNeE_yJZrI*N~%9`3h>gt}yJsaTPfT9T4vl|h75YA zp@%(0dAp_hF5CHb3fp~`WuH!g4lzA0Rd8L=6TJ=x_v+sRtv0=1qKlx*vGeQUmd?Di zKKgD|Xa6Nt-7g}>6X69h%_v>kx=PY6c53SoMg^)wXP!|XaCf<6G!{np=!+z^g}p`{ ze7BuyO{{mjn=ffC!5XtxvfYnk+3uF!CHl5FM1p?-oSZr6{;1S15x zAw>cW{7So>50NI!6No}~xVR|>n$Agn?A=md$+_CPwQX$Ya^%oEVeHePODdA*HM5;< zNZ$>y|M!<;$9l)KBI{nznYp?}ZN%{Ly^@l#trd&2zPPmlhxCV0FX-lb6v|_~-cppI zsIq}A!1wWem@zMgGfRe!%h@!?YiF&h^6*J^dDD+?-FqC?mDAMru%llE^wxd!OV%aF zKM&`DK9ie38kGBql_d&~gTLiF)5O95hWT~ow7S7<&l2Z5X^)fZJSj&f)!0`ysx-dN zwe3P$WwN>XJigOfTunNcb6Ok!p+h$^(Y&}`p|SDab{oIZvB2noaZI(1KX2WDj0-7Y zK7DT#>3XT;_oE3RG85aQKB5U!VMlHJEZfFpKf`2`-t`Eq5>skP;d7^g?ww4^j4si( zekqCNC1YBvB`Tig9->MQh05ea^KZ2W!A~^D)K_UkjL+7$P1^X|wTHmjo5l&*(S)Op zANWgSuB7pO?I++klk5+P^G)rAjw;=AwL=}L(a&z(DoyiB-S@^Vk|QVdlUhHJs6x2( zzlx{Mm}@sk+PmwH8P`iX=k!x^d-I@t* zL-bhKiwsLN@2@M=&|ZS%XJUOt#~V=3Z`M7Hu76!JV5wbaTrN?b_5Ujh>d=b1Vq*a$ zlbZcn^Cb1~hf3LY`wMo@aB|F=g=acTWn_*})B&a&z#o%y{wT9S4Iw5DZKyRUXv z`!nZt<~8+?`ntAwrG=$(7_q1CUL)DVMm@gmJ}oqrHL-aA_}qKRllO-WC6QYB0l8a|@&2r?<%`?b=kEUW|+l(R0^p4oVMb=}l=(%cKyalga_zqqnjV;l3l zMp4@Qf>0AHOE$@5^K$~0k&tAQw=7^uLttzm!%S`%KjwXgDQx)nSW(7wb4~F&W_&}! zcz5Nw>siMec+fYxb(B)3}xb| z{IY|~eo4u^#%*}%Pi7alI$@UU6+DT0xbG7p2Fwz*?F??xVU`K)1Z^uJakuo` z9$FUGS|L#fHhhBCTatex&NNnaR^##$6I<0Chx>`nysVy%JkI@~9*lf#R}W`C<~)-8 zb(=(A;~I?And9nn(%*!;KDL4aE3Xu-yr*p?`u%K&&{v?}$5xC!YrBuWANqFdYv_ws zWucY#M*pdmZrylWS$lzG(W5?JTQKvEaCZM4;b4iC@4zc(2Ey}yRwcgkG2+)$D~;Dp zD>L?G!3BwQ-Rd^#_m*sJcKX7ZR{lrH-~b!Vl?kCYD_wVPkCp#Lr0c#WV%>;Qv*=v+K<-jX7&DA}l;Y3$bFQhu34MEZwpVo) zVcoCd)|=%+*L}2>uKT`~gfe0KwdaLnVP(SMSS$a&=y#7^*mdUpwKN2exZKpi%pGoR zYH-97u~A4RR{kxEm0u|NvQKpIk52zX(qAd*H#Ib+u49-R+(galNox>+$Gs8Ao#Xf> zA!hnxdTMX@aooDE7ZW)>$tU(?80P=_(^)_C>1lp7eX%!*Th8Fz{6iDSlym*21pAla zd4qSH_1BSDgLB0!8t)OhY=y33xPBURUwVQ=&Duh59@SVlM`<|lmN06_9=0`Z| z+PT-XLzr}Kvo=aM*Wywk@;4nwLd!dFCf%aai2Q%h*Gd-t0SiAjQVTV(Fdi0G!ougE zV^4c@hRYrN!bXqILH*`w)EKwIuAfXyV@q!dghVUVUCZ&taXS-f&~>9kf7Hgu+4HoJ zDU!O%eeh#WSA!0}=u`{IaCm^FQAj2t|1qZSXUT>ua>;=-IIy$PwVIkwfq6fJ>z=t< zKf|}e6^wc+vTQfN;VN&%yOx804-Tip%}lu2CM|yks9T`uQLhDk{SA<&eWvuY6R^+GQS)~##p+5@oJd1d)1!uT$9-MHYQBZ?(2%Mq9 zS#U-S0gGD;U|AKe>5{HUib4t~o?5>_u|r^r8% z9+Yv&-jb6_ivP8v! zIww)lpw39tNKlR5jW+%i5*xdQHQiy;qll?r$y9vzEqMbj=X2Yq`{))rXhPiV zGq~Bg**f!Ybp?>l0zVb}ilfA|SHDzyrDG|$8Z1-fH{-4Unqd+8lcdo!orr0ZegQaR zCC;-18Pl8vUX-KR_%hD8Lt!Exfw3nH<-+BaiH(_BQO5^KCUe04%8;R*m3~LaDG~XB z5_c}HBO+gJ6M1(BU8%{{WHmrTJU3$!OEuymyAi6@QJ;xU5)ln z+^$7F2DaB363{o=X|+V6zuMp|OI@f{KiQ?(b&vX~eFc~7(mEDu*AV=o(=<`4g;bS| zzlS}@J3ShbOLpppyCVT+-5jnsel&39YiSyXec!#|&^a#k1YC-tmet z1hOx{jW-a38M#b~k=Ht$(1U<*Kn3)NfW9jSd=fXE-nDxk{4kIH>PU;?AovQ%52C`> zpa{xqtp)Bw=7(_^;1!|ugFZ8yQALP+k(DMsv-3;M zD;ie~TTMe$A#O-s-OTRR2rf|~zks_i`PMV{ElVJ$YBo&WGm94NuY70*nb z@G}_sXUOO+&5Is>_r~Vyp%7gGZ{ZmQs7s)-&dfA1^0ba1^bNQ^h0OB1RPxH%b*fDn`{XDf91x1|Gy^ zbqkOOWC1S~HJr*{&gd$!u?K+~;4p9&Xa=qUgpslR@e}zVAP}INPhY0!drUa`^i7Ta zU;;Nut*5hXXJGA}_>%#-aGP z3G^Eft_DqIErCS-tAfb)quq~o9@@UZb{OB@YcL)BsZN9BF6>mpnG29F1gH)A*$hVt z0cY>ow{w0%9|X@>+I*xh`qR;709il|PykS!Vzg^|Y1*fMYd!y$RvBdUZ!Icw{;h@d z2d@%12-E<_fbv(NL+Ae*9r|>l1I~lK0$c-b1C&QU_d%Ng0k8rt1R)(uT-oZ!-T6RUg|c delta 7026 zcmZ8m3s_Xu_TOg?j{!w6B=G?Z49KXEBlw_e%78GAB7&kfBOf3bcr`V#^j@<|KC1f_kRERzTfP%)?Rz5RsFV@;@gO4K1r!5*&l0&6Z5z-K zw0+VfS#8jE*YfR|9>!(NJ(=%?0wT`@@(YX$Jf8K9D9mo7p^9L=umE+ayVGfh|q~-f;(@Yj4iTc9IDb&jT+~$s)$o;uD@qIh@ z2HSykboC#>Q6J5xpPgP>?WygjU8Z1;?-b{~RwmAy=@zowXkXiQ@=Uj$>)${W2Sjf* z?a6t}vhRUrK42o2Dcr&bE~>{?n`^6U+(NzkQYS)X_9yKfr0ynSW@HEU-d%e6*(*W;H1u88@g-NHxiUE5X|MwN;?zm%C61)cIF7AI>W60Oi;F>ay~OuNK00hFtE5tZ4*94Ct1 zSolV9UXok5=R!M^sP32!h*Lb&RG4Q@ghw9m=r39Vk4C#lLU0|Upo-Vv1>Je-N$l@p z28mQ?nK5p`&n=I!HU!VOBNlEO$TtKkm-wf7iOfP}3NId2_W>1XmiuSiXC{vjWedH* z_pK|sh+#JVM6jlRomBx3FKNgYWRq4_O+NC-#{ZxI}4Y*uY#*g;?7UOL&PtH$*x7 zEXHf#r;;g1{cQ7pzP}3oCbjwhd~V}ChwkG|L&q^^c<+$+WGn3ab78@}AwVf+e37!${DRU|S`_#YMHsg3ZoQM;{*9F;Z! zk(8gtd@MK8yWwjeZx`3!n=r52Va8#zh@wrBh(#>5}R`Ye|HMmh2!SHD+1KwY2hNVm6kJzFE;ZC##}+ zjI!d%x-2ToE6r*8M(Q0?s_ClHe=X62OW4l2d2F{|yl;GYvb>Iq(wMV~muP7oU9%Du zG1nKLPh%hGiAnU3xrAfLD>!T=oI+N;vi6i@B(^lT$tY2ei#1)}=ub+tt(fh8HEZ0T zW`ET8n7wNwsv8aEzpe52Ni_%&)zpX5oxD-?09- z1Cqv%CCc?p`y}#0Nq*B_P#W{4VlJv@ickmH%Z)h5KOP>%X;2d`q0~AN>(*NppvPM` zBm83|`5H;S+Dgiug3;{~hD-h}vvM89lJyNGny$loPO`86uYD|rv*cF|`>mq0Z(c?B zbBOYUBI?8n=-231OZtUW{}m~ep>{f8dR4#QmZMAFz(uLFOAz8nk;*kyo-IqHAsNLk zVWXo!H=(1Vn`Kv6suu;OlqbJv%BQ2SIU^hBIG0c;Eg-V$_l^bVA?7K3!-zmm+0f&@ z3>(K;`c;`)X7`TMn1}Rksz&M~RbREt__NQiw=W+jFK6j8oNCei+2`(!{}b#QXK6JY zZAnI-#{3v^4k5KbPRs*JCh1(9P$tqSUlD0Ee{lV)o$XwXEncT&pM>U>C;#2VcD5kb zHpKt?&!jN*nzu{lPaD>>#Qr(;SG|4FQjk6|ENO{GU%H9yZfDu<1Ctm2X{A!qV9UoBGY8&^C0!GW zAJt3@mzh0noaUrlY{G0&3exoX)4xGbhBEbvJEqCR!P)3Lqby}s2I8c zPcAmma>4Ma&f4}VWP?qbu5$fxN$+RFG2I_+Pu?M7u&3l`Q{{(T`%|TC zNy${Xqhl{j+-V^Dyhm!f78IB3zH2L&jP5aTPu5rM25pj()+Ic2(gZtGxwd1wq_M!D z>Ds8@D$z~@+c^rELzHY+TKxXx!iFI8T7Me1qYV#yH0Ce$8`GmwIJ`lq37_3jCJi!G zKGReRikK%A?`kRr^&wJ+o=7zKM=RfwwAL85byRd_6jgMOi?8T@tBCgb7^0ijNF)7l zhJ^>R-JfPXi&1ZzD!O9=E4nXd`ApcK%vn}f_0-$TlDjW)l|x|a9?pZ~@t;9~n78T+ zq)BoO3py4{)Vqe!P5GcW%U^p3XE>>BV-(9vj1fU1r#r0shy zUxiaJx$gS5k`Ka$CqC&{70EAD2XVg|=xJLcRqu$ZXx-)3r}^=|6tMFr-t5g7m++EQ z8z)Z`wUatpT1M3&Ld$AV^L#xm&!=TrhBBljnElI-m$rbW<-5PPG-)~0l0_*N;Ju7f z&>DYQ^R#AZt$QdJ~STQNLlJyk>py4VS5L`Yc(y~dc@z{u(^Y#=LD+CS!NnAsG(0<&pYNmpJVN0 zA3HKpSZ(l{7Lmf5S==X%2IM_{yMGDV58CNsi18QoK!*8*?;ia&eMx*PZdUBorFiQ? z-_^eKomQ`_?21X>n?}NA+p`NJ%&aUshf>d&`}+4W?c$wr17ChWZEzt8k1*?34MyMK z!X1q7jd!N9Eu?O6;cmv`hHNhr_fE2G$CK-2l4i0+AJ?O~hxKjL_iFBBJsSV3xo+y; z(|ilp@hjrPnAiBN@j(H9OY50G*({Th@a!Dph4`Tiv&+~t=52;qYRnyHmoWlA|9Otd zGXC=XAZFk^w^R6+I2D=mqj+AN#X5w$IPAXV{U(HmyTl-o@plN-8+IO@5%c|<;Y36Te&EnGQE^{G&D{=6oA_uExRivw6BU6zjD$M&5iToqrJ>cyZ zi2TR2mkXP{NoV#(4ZPXy_S6!U#;n=+9i|@d;^Q=G<^?`aqhv<#Z)?JX>`qzBPVt_4 z$jL@=`e-szyzLMw_*zX8^9S$N1if_EzP#fg9-hQpvw`id!{c*BRw5psfelH><3{^J z9MrTov`pDlE>VX!>_HnK_1D`oa8?}0SrLabavWZCILp#1I`VV=)ue&UXZ(hwXl4&z znKX!d#~#$N79%;!xT>7=H?Z71XJMg3SZj9(3!FvZUv?e?zY_dkoh!j-Iq!il1V6+1 zD)=;~YKcS00k3uXDjdRQXIWdJWYMpxKv$S?N4#|Cj(DWlA&hg9s7!<>&Z)xp=NJ*2 z;-v8!;bg|XD0(1~qMY8bj~eFb=B3Zia0sE2!CWWJm4i@!)=6_E(AkqK{!W@J4q+z0 zIa$dJ($b-ldn( zPHFf?cRBqs{2t|?eyws)zfam6LbQYW9qEAIh>^n4p3x**o8JX%F;RyOPMPzU>_E+`<&--YMzJr;5yHJ zb9BLV--_2TN^5NruVK`87^RW)OQHW37MzY{&cQNUB=<8xHG`r@{WQ=w&eJ<;YB4`+ zntEhET)$u(CVZ?kc{sZdbbz`s?hZv7TyYnr{7 z1|+m?IC@$nS)fG>%eWt?p>m~733(&rDRE6+~i%sGs#PeH7)`<0xtQOCS8c0M)mW!7l z8NL)Ex>f&yXt7ue(IQAvAZd5eTyO~4_%R2$#CN6za$kxGu}>P@!j`i{S=F1Jlcj$8 zD^u}V6>`hd`6;X|`knYA?f?a6BBfqh3A^7*D(KMZid6WKSNH$24 zrwKB~G#9dUZd1pLIOC2f?ZWFAd!}xuc(o|;T$awx39m{ft0DfZE>kx%{f?MZY!?Wl8NqO6ZySPIEZ>6L`${>9`64K86zokQToD;-IgaI(9lO@lU3 zvQh%u>+2?hAMd8s@(=K@*Y%Vox5}YU^)Pwv(>!sl;*&j^#zHL;v0e5BO_bweiW)ac z>_Pq)qtG)@T1GZ*lyotk<%kHD(pQ=$!+o$d8akd5r^6(Zv7~9@>JEo6MO@Gkjy}QV z5)$f2-2mh=S&6*nK#T!WfJ`6;#X#@KgZGS^PVdh2-J1SrNQ9=@c*m-jD@1Eq8E0h!5v83sYY zMKWrOY2p3vUfX;l0$oEPn}1OOY9Oe&7ccS#xpY4k-JgcLYA7kCp+n1KPHPoXUb^l)-ZuF;hl!5DL9c`yT$ zlTtF1W)XsRa(W6Olapr5o;7C%zbhJ!}0`B z2CN09-HNXV40A|1f5Jtwv;HQx>zzYD~K6<~R_o)={^nOLJMYv0m z%6>g9rTeRhe0w;NA5!3dnP?*aW*Cug9zx_kgL-t%g%bJV!4l0;eG(Evp-1^sQQ<2{GVsgLt_0QsdSDYkb+(}`@1-eE|3&)We~^x#kN%59`+ELG zLIOi}fy#kvKqGK!F?8tsx53co3mwo3`XOKe8~~Nkj~w9+0D^&`KqNr_rc%L3Ch#V( o1-JlMfMASWoloT3fO_B_AO`{f1)u^nfLA8ImgO6Lm%YLKAMkS22mk;8 diff --git a/F3:F303/Multistepper/multistepper.creator.user b/F3:F303/Multistepper/multistepper.creator.user index 96a4cd7..6e3f9ac 100644 --- a/F3:F303/Multistepper/multistepper.creator.user +++ b/F3:F303/Multistepper/multistepper.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F3:F303/Multistepper/pdnuart.c b/F3:F303/Multistepper/pdnuart.c index 105a7fb..fbb50fe 100644 --- a/F3:F303/Multistepper/pdnuart.c +++ b/F3:F303/Multistepper/pdnuart.c @@ -184,25 +184,47 @@ int pdnuart_setcurrent(uint8_t no, uint8_t val){ return writeregister(no, TMC2209Reg_IHOLD_IRUN, regval.value); } -// set microsteps over UART +// set microsteps over UART && clear error flags int pdnuart_microsteps(uint8_t no, uint32_t val){ if(val > 256) return FALSE; TMC2209_chopconf_reg_t regval; if(!readregister(no, TMC2209Reg_CHOPCONF, ®val.value)) return FALSE; if(val == 256) regval.mres = 0; else regval.mres = 8 - MSB(val); - return writeregister(no, TMC2209Reg_CHOPCONF, regval.value); + uint32_t toff = regval.toff; + if(toff == 0) toff = 1; + regval.toff = 0; // disable drive to clear errors + int e = writeregister(no, TMC2209Reg_CHOPCONF, regval.value); + TMC2209_gstat_reg_t stat = {.value = 0}; + stat.drv_err = 1; + // clear error flags + if(!writeregister(no, TMC2209Reg_GSTAT, stat.value)) e = FALSE; + regval.toff = toff; // now enable drive + if(!writeregister(no, TMC2209Reg_CHOPCONF, regval.value)) e = FALSE; + return e; } // init driver number `no`, return FALSE if failed int pdnuart_init(uint8_t no){ TMC2209_gconf_reg_t gconf; - if(!pdnuart_microsteps(no, the_conf.microsteps[no])) return FALSE; - if(!pdnuart_setcurrent(no, the_conf.motcurrent[no])) return FALSE; - if(!readregister(no, TMC2209Reg_GCONF, &gconf.value)) return FALSE; + if(!pdnuart_microsteps(no, the_conf.microsteps[no])){ + USB_sendstr("No usteps\n"); + return FALSE; + } + if(!pdnuart_setcurrent(no, the_conf.motcurrent[no])){ + USB_sendstr("No current\n"); + return FALSE; + } + if(!readregister(no, TMC2209Reg_GCONF, &gconf.value)){ + USB_sendstr("Can't read GCONF\n"); + return FALSE; + } gconf.pdn_disable = 1; // PDN now is UART gconf.mstep_reg_select = 1; // microsteps are by MSTEP - if(!writeregister(no, TMC2209Reg_GCONF, gconf.value)) return FALSE; + if(!writeregister(no, TMC2209Reg_GCONF, gconf.value)){ + USB_sendstr("Can't write GCONF\n"); + return FALSE; + } return TRUE; } diff --git a/F3:F303/Multistepper/steppers.c b/F3:F303/Multistepper/steppers.c index bbd530f..13df5ec 100644 --- a/F3:F303/Multistepper/steppers.c +++ b/F3:F303/Multistepper/steppers.c @@ -75,8 +75,21 @@ TRUE_INLINE void recalcARR(int i){ uint32_t ARR = (((PCLK/(MOTORTIM_PSC+1)) / curspeed[i]) >> ustepsshift[i]) - 1; if(ARR < MOTORTIM_ARRMIN) ARR = MOTORTIM_ARRMIN; else if(ARR > 0xffff) ARR = 0xffff; +/* +#ifdef EBUG + USB_sendstr("motor"); USB_putbyte('0'+i); USB_sendstr(", ARR="); + USB_sendstr(u2str(ARR)); USB_sendstr(", curspeed="); + USB_sendstr(u2str(curspeed[i])); +#endif +*/ mottimers[i]->ARR = ARR; curspeed[i] = (((PCLK/(MOTORTIM_PSC+1)) / (ARR+1)) >> ustepsshift[i]); // recalculate speed due to new val +/* +#ifdef EBUG + USB_sendstr(", curspeedNEW="); + USB_sendstr(u2str(curspeed[i])); newline(); +#endif +*/ } // update stepper's settings @@ -103,10 +116,9 @@ void init_steppers(){ stopflag[i] = 0; motdir[i] = 0; curspeed[i] = 0; - state[i] = STP_RELAX; if(!the_conf.motflags[i].donthold) MOTOR_EN(i); else MOTOR_DIS(i); - update_stepper(i); + state[i] = update_stepper(i) ? STP_RELAX : STP_ERR; } } @@ -148,8 +160,13 @@ static void calcacceleration(uint8_t i){ }else{ // triangle speed profile decelstartpos[i] = stppos[i] + delta/2; } - if(the_conf.motflags[i].reverse) MOTOR_CCW(i); - else MOTOR_CW(i); + if(the_conf.motflags[i].reverse){ + DBG("positive - CCW (r)"); + MOTOR_CCW(i); + }else{ + DBG("positive - CW"); + MOTOR_CW(i); + } }else{ // negative direction delta = -delta; if(delta > 2*(int32_t)accdecsteps[i]){ // can move by trapezoid @@ -157,8 +174,13 @@ static void calcacceleration(uint8_t i){ }else{ // triangle speed profile decelstartpos[i] = stppos[i] - delta/2; } - if(the_conf.motflags[i].reverse) MOTOR_CW(i); - else MOTOR_CCW(i); + if(the_conf.motflags[i].reverse){ + DBG("negative - CW (r)"); + MOTOR_CW(i); + }else{ + DBG("negative - CCW"); + MOTOR_CCW(i); + } } if(state[i] != STP_MVSLOW){ DBG("->accel"); @@ -365,7 +387,7 @@ static void chkstepper(int i){ if(stp[i]){ stp[i] = 0; // motor state could be changed outside of interrupt, so return it to relax - state[i] = STP_RELAX; + //state[i] = STP_RELAX; 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(); diff --git a/F3:F303/Multistepper/stty b/F3:F303/Multistepper/stty new file mode 100755 index 0000000..298cfa1 --- /dev/null +++ b/F3:F303/Multistepper/stty @@ -0,0 +1,4 @@ +#!/bin/bash + +stty -F /dev/multistepper0 -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke min 0 time 5 +while read x; do echo $x > /dev/multistepper0; cat /dev/multistepper0; done < esprif.conf diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 592d71c..c5f29b2 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "205" -#define BUILD_DATE "2026-01-16" +#define BUILD_NUMBER "212" +#define BUILD_DATE "2026-01-20" diff --git a/F3:F303/inc/Fx/common_macros.h b/F3:F303/inc/Fx/common_macros.h index 670e534..f36145b 100644 --- a/F3:F303/inc/Fx/common_macros.h +++ b/F3:F303/inc/Fx/common_macros.h @@ -44,10 +44,6 @@ #define NULL (0) #endif -#ifndef _U_ -#define _U_ __attribute__((__unused__)) -#endif - // some good things from CMSIS #define nop() __NOP()