From 2ecd2d188eeb431b217050e16fee9c737076809f Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 7 Feb 2023 01:15:28 +0300 Subject: [PATCH] Fixed USB, problems with CAN --- F3:F303/Multistepper/Makefile | 3 ++- F3:F303/Multistepper/Readme.md | 8 +++--- F3:F303/Multistepper/can.c | 24 ++++++++++------- F3:F303/Multistepper/can.h | 9 ++++--- F3:F303/Multistepper/canusb.bin | Bin 14864 -> 0 bytes F3:F303/Multistepper/hardware.c | 14 +++++----- F3:F303/Multistepper/hardware.h | 12 ++++++--- F3:F303/Multistepper/hashgen/helpcmds.in | 8 +++--- F3:F303/Multistepper/main.c | 13 ++++----- F3:F303/Multistepper/multistepper.config | 1 + F3:F303/Multistepper/openocd.cfg | 13 ++------- F3:F303/Multistepper/proto.c | 12 +++++---- F3:F303/Multistepper/usb.c | 2 +- F3:F303/Multistepper/usb.h | 3 +++ F3:F303/Multistepper/usb_lib.c | 33 ++++++++++++++++------- F3:F303/Multistepper/usb_lib.h | 5 ++-- F3:F303/Multistepper/usbhw.c | 10 +++---- F3:F303/Multistepper/usbhw.h | 15 +++++++++++ F3:F303/Multistepper/version.inc | 4 +-- F3:F303/makefile.f3 | 2 +- 20 files changed, 111 insertions(+), 80 deletions(-) delete mode 100755 F3:F303/Multistepper/canusb.bin diff --git a/F3:F303/Multistepper/Makefile b/F3:F303/Multistepper/Makefile index 9499cc5..e17542c 100644 --- a/F3:F303/Multistepper/Makefile +++ b/F3:F303/Multistepper/Makefile @@ -1,8 +1,9 @@ -BINARY := canusb +BINARY := multistepper # MCU code MCU := F303xd # change this linking script depending on particular MCU model, LDSCRIPT := stm32f303xD.ld +DEFINES := -DUSB2_16 include ../makefile.f3 include ../../makefile.stm32 diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index 3e16bf2..07a30e8 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -77,12 +77,12 @@ Eighth stepper could be changed to 8 dependent multiplexed. Based on STM32F303VD | 64 | PC7 | M4 L0 | slow in PU | | | 65 | PC8 | M4 DIR | slow out | | | 66 | PC9 | M4 EN | slow out | | -| 67 | PA8 | BTN0 | slow in PU | Buttons/joystick | -| 68 | PA9 | BTN1 | slow in PU | to operate with | -| 69 | PA10 | BTN2 (SDA) | slow in PU/AF | screen | +| 67 | PA8 | USBpu | slow out PP | USB DP pullup | +| 68 | PA9 | BTN1 | slow in PU | buttons to operate | +| 69 | PA10 | BTN2 (SDA) | slow in PU/AF | with screen | | 70 | PA11 | USB DM | AF | USB | | 71 | PA12 | USB DP | AF | | -| 72 | PA13 | SWDIO/USBpu | dflt/slow out | USB pullup or dbg | +| 72 | PA13 | SWDIO | dflt | dbg/flash | | 73 | PF6 | BTN3 (SCL) | slow in PU/AF | (possible I2C2) | | 74 | (VSS) | | | | | 75 | (VDD) | | | | diff --git a/F3:F303/Multistepper/can.c b/F3:F303/Multistepper/can.c index 38f903b..bd259ac 100644 --- a/F3:F303/Multistepper/can.c +++ b/F3:F303/Multistepper/can.c @@ -116,7 +116,7 @@ void CAN_setup(uint16_t speed){ else if(speed < 50) speed = 50; else if(speed > 3000) speed = 3000; oldspeed = speed; - uint32_t tmout = 16000000; + uint32_t tmout = 10000; /* Enable the peripheral clock CAN */ RCC->APB1ENR |= RCC_APB1ENR_CANEN; /* Configure CAN */ @@ -135,14 +135,16 @@ void CAN_setup(uint16_t speed){ CAN->MCR |= CAN_MCR_INRQ; /* (1) */ while((CAN->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) /* (2) */ if(--tmout == 0) break; + if(tmout==0){ DBG("timeout!\n");} CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */ CAN->MCR |= CAN_MCR_ABOM; /* allow automatically bus-off */ CAN->BTR = 2 << 20 | 3 << 16 | (4500/speed - 1); //| CAN_BTR_SILM | CAN_BTR_LBKM; /* (4) */ CAN->MCR &= ~CAN_MCR_INRQ; /* (5) */ - tmout = 16000000; + tmout = 10000; while((CAN->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) /* (6) */ if(--tmout == 0) break; + if(tmout==0){ DBG("timeout!\n");} // accept ALL CAN->FMR = CAN_FMR_FINIT; /* (7) */ CAN->FA1R = CAN_FA1R_FACT0 | CAN_FA1R_FACT1; /* (8) */ @@ -164,7 +166,7 @@ void CAN_setup(uint16_t speed){ can_status = CAN_READY; } -void printCANerr(){ +void CAN_printerr(){ if(!last_err_code) last_err_code = CAN->ESR; if(!last_err_code){ USB_sendstr("No errors\n"); @@ -194,7 +196,7 @@ void printCANerr(){ USB_putbyte('\n'); } -void can_proc(){ +void CAN_proc(){ #ifdef EBUG if(last_err_code){ USB_sendstr("Error, ESR="); @@ -213,7 +215,7 @@ void can_proc(){ IWDG->KR = IWDG_REFRESH; if(CAN->ESR & (CAN_ESR_BOFF | CAN_ESR_EPVF | CAN_ESR_EWGF)){ // much errors - restart CAN BUS USB_sendstr("\nToo much errors, restarting CAN!\n"); - printCANerr(); + CAN_printerr(); // request abort for all mailboxes CAN->TSR |= CAN_TSR_ABRQ0 | CAN_TSR_ABRQ1 | CAN_TSR_ABRQ2; // reset CAN bus @@ -225,14 +227,14 @@ void can_proc(){ static uint32_t incrmessagectr = 0; if(flood_msg && (Tms - lastFloodTime) >= floodT){ // flood every ~5ms lastFloodTime = Tms; - can_send(flood_msg->data, flood_msg->length, flood_msg->ID); + CAN_send(flood_msg->data, flood_msg->length, flood_msg->ID); }else if(incrflood && (Tms - lastFloodTime) >= floodT){ lastFloodTime = Tms; - if(CAN_OK == can_send((uint8_t*)&incrmessagectr, 4, flood_msg->ID)) ++incrmessagectr; + if(CAN_OK == CAN_send((uint8_t*)&incrmessagectr, 4, flood_msg->ID)) ++incrmessagectr; } } -CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){ +CAN_status CAN_send(uint8_t *msg, uint8_t len, uint16_t target_id){ uint8_t mailbox = 0; // check first free mailbox if(CAN->TSR & (CAN_TSR_TME)){ @@ -286,7 +288,7 @@ CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){ return CAN_OK; } -void set_flood(CAN_message *msg, int incr){ +void CAN_flood(CAN_message *msg, int incr){ if(incr){ incrflood = 1; return; } incrflood = 0; if(!msg) flood_msg = NULL; @@ -296,6 +298,10 @@ void set_flood(CAN_message *msg, int incr){ } } +uint32_t CAN_speed(){ + return oldspeed; +} + static void can_process_fifo(uint8_t fifo_num){ if(fifo_num > 1) return; CAN_FIFOMailBox_TypeDef *box = &CAN->sFIFOMailBox[fifo_num]; diff --git a/F3:F303/Multistepper/can.h b/F3:F303/Multistepper/can.h index 9a508c9..fa09df4 100644 --- a/F3:F303/Multistepper/can.h +++ b/F3:F303/Multistepper/can.h @@ -50,10 +50,11 @@ CAN_status CAN_get_status(); void CAN_reinit(uint16_t speed); void CAN_setup(uint16_t speed); -CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id); -void can_proc(); -void printCANerr(); +CAN_status CAN_send(uint8_t *msg, uint8_t len, uint16_t target_id); +void CAN_proc(); +void CAN_printerr(); CAN_message *CAN_messagebuf_pop(); -void set_flood(CAN_message *msg, int incr); +void CAN_flood(CAN_message *msg, int incr); +uint32_t CAN_speed(); diff --git a/F3:F303/Multistepper/canusb.bin b/F3:F303/Multistepper/canusb.bin deleted file mode 100755 index bf8b403903cc2e5b336f3a87292e1296d3039e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14864 zcmd6Odt6&pw*NloBqRh10ovM9Y7Yr5k3b2~*1j78O@Z(#wA$yGKthudNKBwoy>lC= zI{0p<>g~h1(`nVIUdI+%yjBOP*6}){&Ln-@p;kZQ9c{EYdT61fg^>H*C!y-hXMUg0 z{qM);v(8z2?Y-7sd#$zCew;uE!+)7h6erzV@qmN*g-u@20MtNY;(6-i5Xy) zvEDMVl+>IHki=AhVbCgZqrGrgQdlUI zFdNN;uNw9wbOfey9f4_p>0E*d6lR(!!L-4&!0G&*bB*r$>-oF&8GTAaeg<2#)G0UPf&-Nvk%_^x0s4)j#49-OD5!7y!O*?-;7JL4ZEb2T_t4#_%EZ@Hn*Vtm6iRx*iv24Dd|hq3@D0p0@G z0;mS8Fk*JDdCoRf7`S_d_n_?&gUqm`WVhkWHRh*`uqjw#V1%{Me|>Nvda4QPP%cHe zBAAbIS@6^liI4MYE0-Ih2W3(%YIVV>0VW2#Xtgx>f_~Vi;29x4San5_#0`0hUK(Oq zZsdcasH`QJx2%wvotsynSV(xtQw3R!SNJ(edt*oO6}I?(`cy67F}3JsTVm9yHvJVw zzk@ziOWLZglx#>SDnWehH*x$YrZWM_?qpM#TV)vZlQfm#OFTdK6V<19_xs0pq(z+- z>7V(jjb4X6-UplqXkm*_@Lt@r82%-iYTq5kOSb*865m4OEc*eO&bPprUtV_oWmU52 zh<&q+_vIO9*mPamvb^%V(j?nlTeNNStjF}RXLF6S+KRfe$~2{#@+8|7TN>y`^o!0e z?oG0(P5MWe`+L7ytP73m`{rWAFO7#rFH9V8Qt0+0aK0c@}XohMuH-hlEWr(()DLxQuqOM5c9e537vjo9QBYJ==dwn>ZG zCM{E%oNHJkqYCFFD#HSxvZcn4ZD*sRE_`g0l&SAtx}^OQQ|w}lmTs){KlRmBq~Rk^ytX!^*+r>ZLI&1A$=ZLXV3`BLXp z{MuA+`qHGGTQz)oYLR($orLDM^;j9#wVR4ezc)Q?ra2B{fsY8OUQY(%l;o)AMY8Vn zpNWK&u+Bq-kyWpMcBbkjE|yydZZ!>@Iz65cjwnfqZhf_G z^)$Iusaspk&~+h$2v<6|HliWI9KHvxxAY?UDeqET&DT zksH_{hGm8r=4!v9UfUMw)nPPch&ECUgZC4J3DfjWk-Ig zzgrx~Gwr_u{n1G8+R)Ga&x!3u!Skx;fQY}*zF&N|w(rAx=Wxq0I%*=U2|4}jP?eq? zc{7o{o?b__xzRrR;!|Sl@7f=@_@sz^i9WLv*^&2ZqQyST+YgUu6AzCh)M%GddF7(K z(CE-a3FNgx-hZl|7F!-`FS+=yqKp^X*&(Nk9XXiKjvN+8mDb)SYLgS;K0A?#kvm<7 zN9N@p9(h@8^HBSYi%yaM0r2;Mzg|B_luX(W5B&jc=jv-j9TX8M$0nlu7LntMhaFi9 zFFlh;b-ej%*weq7xPE!7SbqWavtY?L^?FF$IsA2`#gh|XUS@}E7)2_4G%Q->4bNIp z*S|#C{L93-%ax*(qn-+}=8usY$HaS=OU0UJJ?xODh8%>C3!k)%Chpl>ufI zuNk|zdwnV#cQ4b_T9yQz04RgNq760YJT&#Ki&7mHy5_7{o9KC@^4mt@jz(9{eSt^F>ScSY*)pVsCxM~_up9F`^=5y zH^2U9ZUyZ*KKiM?b`OUr~b0x<1@<24;Du;o2J<116MA`ESR6hJUub($hzgf zJYIKctLLFV-SM+!H>>;9S53X|>?Aun*Tp~kmU#s^k@0JCEpJ|&G*p{EIYeh^dvyBpYh!P&sJqBeDG2Cyxl{VtdUjLzKu48}#U?qGBT`)yDX!Hxz) zUxwQq3Eqrg{~jEPVEcoDh!KGu8;oGPf|nz;j|M-FU=Ia9iPUBV{}Q1+5Ih^fwg*1~ zb_cY&H~4;p))+hktN^ra!MA|r1FH+35^ITYZ}23r`JinG9usMy(c0k4z_LKA489Pd zl?D$1n}?Cd-aHtgtqML1Ooet!gL_085talWkJM^|KL<7owVGf@r1q2XpGB~$@it)7 zP@58Ti?q<_ZNcUUmKd~uN%N(14fPB4QRi&_G3qnwI~o_%$23-`-)Rg`zfvF5_@Mq~ z%aX8*NWywg`n*^}>DlhLBizrPHIh`ahpx{Y)@O<(3bFA@FWJARjLF-hCwrt9qX)?T zFfQpQeH(2FXffjJG$z|fs!H&30@=Uo7MJ`M7YDAHwkMhE=N}Mx^uwO~ zFwZkw{CTo}`#aw-QwIwyB38tEgttOHx zQweFFfLgcTlxzx(zBYzKvQcT9X(M*IUgE2!5dD6D99m{OG8oOB7`eGKqwg;PvKwpPO(MJ%3XT3xK$=nN z4UJw7NDQ4POpg$uew<`n_ZDECzvhJuHTboQZFBD@!ks}PYzl3_8gf^NwsfIf6Kd^Z zR;;`E&Fz7Z#tEK!oWbgoOpnk#8}>Onzg>iA!+u9Hn^a2) zuN)u)k-O#0NFYTdj5GLp=5!J zJ?`vf4xShx4(=?ZrAcwxn1b5V6VMZNF~Hx5;L*TOMsOMMSAl=y{|0(W<`enjIYj;n z;C;YX0C|rt8ocAZU&(bu*!PyuqpOH*%Wd0rJnc=ATj5;+2~SKYV1LVm2A(VPF0EWz z#Y5YF87G2gVll9vO)LtqF+}(`Q0^1kR-!Gl;E4XpCk)RW7kU-BdEPh!PHZn>2Nrx- zzuL$yvz$a&Kf&xHLOG;WPo$#%iiwOi_#EXDQTm*T zu+&+oTP0GaM<_EuStRN-B|@RT&Jo*4A{3%lmT1t6N~GQhelA*amRPzP{1`EC9=7^K zL*)H<7sJoGY$7iQybIblfHdGrfCM1#p(muN0S^7#2vR$FgA6b4J%l=X+MUw&@Ntr( z6CU!MF`f&g=t=el?`MIMBY?g849q;~fJH7HVx(193{gh!fNb<>)MFVIiz>n=Hgp56_1N}g-x1l6XN_#+{WZS@y(jn=+--Qe-;OeP zUq<=2VwuFg6Sd6yBFZnIT#WiNQCja|lz%CfN$i;@#upmBE?S}~_`O~yd<-8&Z;yWd zeLv5Dubs-xzZj+SLLT1#o3ZdY;1y3EP6OvWT8&OP>_N7XGg`zaYB}LEt^#%M zdrCDL?{@UKBKWG`h4&Jw561OQ)HJUHD?P}%r^Xjy46lu+`zeoPzy3-g+83+112xi5{aVx=9iQpX#ryejI)e{_=U3yi zahArtmkQCDcvzQug~hE{3Q9yp@6%{a=y2rn`EJeR>`st`w4Lgo~E898Jcq|ch*75(oOwYz1%%ukb zoq*i{dN1-k-p2ta0bbOioE@|3NAIZEw!!R-W`UIOH_c6<_`*_3RUMcjNInMBldnq7O zYZv!Y9bcz&y{F@NtU)ejFZ0a@^-^!NkvWiTVvu{4y)?&;k4bPtLxih0h;V(3W`U2! zzVp*Nj^9ByWlvH$&E;Q@nb1Z8tA8=3MEUcvLnx1f=aVs-%`c7(pgfH7`7s5`zA@fT zgl|y(P?ULOjNz3S7uBm6xw{&$1z;2N_{6AR%sjYz>|s&~KQX#7#6rre;F9;6{%#z> z8xQK|d6|8A8M80q2D4zFKB?c+Ju!MLNHu$UjAr1+(DPHGW{->g*FzE=FuIkg$cW0ZzH3!aMU~2of3&f~19eG7ADAeG^aYW-ThJ$6t0m;7RNh0i zn?DvM`X&vd$q*%nZieH-gSK=Hm-kGJ_J)d5WL_qN^Rim0S5kubfz>#?IdIE+Er_>9 zKrGrTj5FKpT?%7zXNNw<%MBJXYyme=5MVVOdd~Zp{s!_T_N)}dwS=xC!b$JfY}#Rc zws-oc23xm2@ne~-cgquc*&xfMc~=%QEB|YVk#Pe_0p{)}^s~GtP{XmKKB9VBpZKZN zc63XpUW&GH-t1y#`R}n}h;8FR^&UYDZHuVQR~iKIzDDfN@S^_Bz9QSKS&L>}pRwqK z_iM87S^W!x66w*t>4sEG|Gw-Maw{CZHzzTbCtMz>!2$r1x^ z=>0073ytpU%Qw(cXmoE#rw_n4fIe=vaB{;3FX~_GOPRG`*7GyB-kv?{Fvg=YT+lixN)tg1f!HCy0Z6K^D{k6rw!83wJI1Qe^BYqTd>LreuX6hp{Bvf+g> zHtCX_8{8#fhqM?`F%z9d0?h28etLsR`T~fDk3RhHL*Zn{@#&S!?kPhu36qMOE*?AF zC6`WdSux(VT}=MDZi!}7_b|TR6s(IaVUJVK&NQq}(dKbNJQuBbyzj08Z9(2TTZ(%< zNxkf!lMtPIqZ?L~{_WGd^1ksa(GSKLANDKMo>O&qwmC``e7z-yEEaD)g3UyJ@^N*lKdjFexwqNiq z%>MSGL)clAVTdtN9krS{zIAO9tkWAbE4);eOhfPN3i_!mb|6VGRbBQ;2G87*Cllpe zy|`N+WBSyWVYuY4)09C5RMZyTGRbOOE3Qw~UTj|`b5Q!h%hr}p2KHeGO59T}8xhke{&)O2bcV;9CG ziOxPUR4DtZUz_$f{~c+A{tkVd>9vSVI=(0Udd<$^=3~c^YxeKoKU3)8uveBE;t|iY zP9+Y&gR36s;$i0;O^lE3>}k{*LJ!j2{~`s(M)$*E>N1haL=B6(;h{@WW8C$XCR$JW zVz6=@>`v}h4SVz|LC2CT*(F(7l5WlQo%c%0Vsy1Q6{`d-w`*8ed$9YOpKKwzr=ALh zv^`4WLEE0=>S0fjTF`NJ1Is_xjT}Ax`|cH|@FA*5UPgKLni7s{d+mlSgB0iYO%o64 z1urMws(&NO;t@L%205%Jp#L{^*ca?NKCA7CfQ%gMno>Tcf*H`X)t+Kh zn28Ma*V!P+7y%Cl8)Z1LKMVw%|VOdlz4L=^3)X$r}Q_67akhq^Id`ean#>1HF?z)Arm}k=@2*?>avFBAc!D zO*N9eausHADg%G~2|Kz3P!bF}HQfci7l=cNsAn29BC?{*iXq+U+^{ullVh@Nkc8=4c>hgj9Y zuj??T8AjYF)G1G%33T#whtYS<@f7Z0ag)pDCzkB7CzdA}3-Q%>kD0L*Vl<4&XJ`1r zVZ!*#ye0gFC%Q~lnq;XOKC}+9Oi9*rmRieHOQ$Ik3w`vvFd>YN#=j1C3$l#Z{%+V# zds5ne0&f;;MrgFUkKyUsArbc!LeG-&`o;~?UB`>hFEVawOpwgIu%&Tfg+z##sF)WC z)iH0Tbg-RaM^5W&18GkAqi1cK8|$t`laHh19g+(vrKH$HNa;$S>rEOlPuzNezt-PLK@054`pDmP7t2#;ixDlqMsd ziI9Esb$?7L#nNxej4948F%MBc(Da2DE|FK_9RMtj!iU_lQsdc9dNa63eY< zz7=a>nO88}Yj}A`!V>kC6m1|$s}D$4{k8j-`qBPB1SCpb@$YbsiTAy?8aqDmmlVd7 z&B|YP6HUIiljf?}0i1tGY=Lbu^B(M04{MQwJ=`wj=>n6xF-4*{k9)7wC8jw>7Qb#- zVq(3n#ze`D3+~35l5-c{TTOpGVK&J7(4&@Q{)g`meqaO6V!?2hVoG^&r=iz>@9K=c zdks%?+fz!F$+pM4OS>dXiF)HLtv~2~4qD5MTd|fPQ$9uQMD0jpjNVbL)ZiRkEF zWD<7YK#hjGq{QB46V{fZ&XTJS>i6oWc}uQ7jBgh4-XlXE?!?Vq*EUDXOCRlwwvqf9 zeT<6jiZO9U%JH)Ls-IO0m_JlD?Qcif;+`biOi9Z5Sy3?;?khRhSlG!4JGsa75^tg4 zVHmZ~!a1GBSrMB#xr5zB*H^icb@v!MhIKW`rp3L<(##9?a#b4(K2}rhRbEWh%=hXv z$vCxzMxPIvZgK0tO)dSYzy8$O==!!bKB>m!jn+tgo60sA&7BDz7I|!gIKIF7?=sGM z^vtzrj%Ysht~G9M<24t3waBQgp$q={HkD?XSFM@tP1RiX;d@MHqAg0ZvVSA&J=@UP zy|$~YJZ$j=kvRFFdzXInTp=v}8n_wF3Ev<6di0cxwWB&z-$r4YG5tmu8RIczSm39LBjjbq+>nn`rRsu5x0# zndeT7oObLS{>d>#>P*yan%DsUz2VPKosLrN#9F^3mEP@FPL%u8Qg7z66W&cli>WR{IbvCvP zyXP1VK+g~gqXOUCBxgw~C^(6X`6fmWjZrz`Ju+-k4tN)1r*9qX)``21-GF_7=K!w& zeg`-WSnYB-T-p5U+L{$avCiS(n_BB_yp>Yj*}Ti@ZZW%B?9JQwqQc5ldSGs{y4~h& zRyS{N<_)EWD$ty*ZW~^tv{Jv`z*pV5y2h}+yj($Qt<4tRVs0_d=gY0lD@ZoqV%}!A ztUy!Xv|tCepu+Z*c~ZB{n~RXQj{lt8)0T5q*)w}uIPy`#0c#p+thLtmG< z+1+Gs`G*=p6y;|3_jHRD%}KbKg6Lb_yrZE36#VMI>~?=IyU|XiQMzcC$-a1zPHJ0P z8yZk&aJZUio5K2gh#u`-&`*>C8ZBEKP4;GUa|>-#R8vGU+}0MpZU^snG_>4jc3CrN z1p{CKxX97rMSl>d1n>a-mE3}-|DhjME|Iv zdreJM%~F1StsYGq8mum{VMC+iKHlNt-7PNa&-=`7z6JhnbTn^+jSYpR@E9R?xlqQq zo0`mUp403yH(6nA>K5vgI&$KnKcOSSi%`XQ+F3Sax@lw)B94I4P%JH`u}&!~2(0d~ ztXn}!w>3Ll)=7V0@YW`0%MQ#Lk!}$MQ91w6uA#ND5p>wTv^Zk;NSj7G>`)JL!1d^J z(oA($J})n)4sqDr+EizCrAEe!7LcO=^Q0DT`~Bj)C~dBHS(~iQE#^jE)R)EwRIIAx zGtv#|2opM8GHD24zO=fnG#T7V1cX$?9CYNWOt%R!$JuOb7LMB zR^DAflN_}HEvyR{M7+kJr8N;ekK(nMt5j1flw4C?o83Q|J2T+eX1(UH}Z?c z{5I$C?6WO7z)!t}P=kYo|Uz=Z$qs`CJE>O@UXKq=_*Ed=C&6QjE z9DbX%1tPLl+u^+mB1ZNIxLXw%@%8$A`7I+T!OLi?p7xqIR>!9+LFz$ z`GM5hTapwCbDi7ia92|9HMKlSj>c9b7SQaX)iN*bK_lnE=+M(%WIhAgP4H#Z|W*CQji=`eUFvM!Pr&0RE5C+ldt zaKa1^7RAW~noU!q=!0;g4X06>V=^joOEc;8*7BS2%oCsa;bXg6!pbO6@q2rDgN@}U^c{TQbUJ7|T~ec!E=f?&^aW8tdDA{R*@sCLm!)nunXY9iKP zG<=2@U4%WI&F2B9R@9lBcVzSVlcoEuE=Q(f8~i*es|h>Dh^a9F!-?!4(yYjFzsS;n zbk0*Tw+zqEgH5q>$Dkq`a<^ie)9#?2p6q2!b!io9f8hGCy4CCL&0%G$s~xRa2dJi1 z#Xyl6#GIQi%KDKUF_|ObN9y4|agt27p`MS-8ZoPjUUysTGZnNYT`PXnk`nlg2A88L zJgn8VccEo{t2lqw@D)Yt`E|6s-4f1qBIQntMbTuhcR7A6?-oUzrN||aoc|N79Qi+4 z0-^Ti?-k`y`e$l7S`Z`K!fJ}Mpppj7Hn#$Wrq)IpN>~i7ZCGpR0t-@$9qW4=qC1=g z_>AQ=7?9JqExVxt35bUDiH6(I~4d)js*=5ZUQ=Zr{_9PAH4e!orlUsW~@L(8Jfyv_(1cIV)o3~qOu!&W`Z*2p96oCpi@`bgTHi9+7 zg-H`-1)s2*`5U3n&V8{bF9WE?2Ooj`bSk=Z6vAUTKH zr45rHN8FuY3gl1&W%C6&P21^sv-t%%;w~kdUzh`~#>Q-ZQ4Z2Fbixc5h5jI6ihEwM zJ<^Ss=32064eLxX9I_GWkmG6*ce09>rg|JBBW74vQAC~H;&L>?>Ih#NN9$_~Yu1IQ zX>E0BrlM6`(nPa~7}nTUH@qLhy?A1v2`#*HjifW$k9ZJ?X4477kVE;=I6!kD?CNFGc20r+7m%{7 zj+S=O7fEE4^rWqOAc|8Hj$!G!TM-qe(FzF{Ey?GqiHkT$Be9bPKs`?3>xdO^8)+8l z4zi8x0JRk5dNLn;+1z?kOY|fMPb;|X#0-9(6rp`HX^F^d6ze3MmQW3)01FhDf#1q$ f+fa!7Q9b1N9wy!gL};=2j`hQ`j?&)|Tay0;`Egg} diff --git a/F3:F303/Multistepper/hardware.c b/F3:F303/Multistepper/hardware.c index e91b77a..14edb49 100644 --- a/F3:F303/Multistepper/hardware.c +++ b/F3:F303/Multistepper/hardware.c @@ -18,9 +18,9 @@ #include "hardware.h" -// Buttons: PA8, PA9, PA10, PF6, PD3, PD4, PD5, pullup (active - 0) -volatile GPIO_TypeDef* const BTNports[BTNSNO] = {GPIOA, GPIOA, GPIOA, GPIOF, GPIOD, GPIOD, GPIOD}; -const uint32_t BTNpins[BTNSNO] = {1<<8, 1<<9, 1<<10, 1<<6, 1<<3, 1<<4, 1<<5}; +// Buttons: PA9, PA10, PF6, PD3, PD4, PD5, pullup (active - 0) +volatile GPIO_TypeDef* const BTNports[BTNSNO] = {GPIOA, GPIOA, GPIOF, GPIOD, GPIOD, GPIOD}; +const uint32_t BTNpins[BTNSNO] = {1<<9, 1<<10, 1<<6, 1<<3, 1<<4, 1<<5}; // setup here ALL GPIO pins (due to table in Readme.md) // leave SWD as default AF; high speed for CLK and some other AF; med speed for some another AF @@ -30,9 +30,9 @@ TRUE_INLINE void gpio_setup(){ for(int i = 0; i < 10000; ++i) nop(); GPIOA->ODR = 0; GPIOA->AFR[0] = AFRf(5, 5) | AFRf(5, 6) | AFRf(5, 7); - GPIOA->AFR[1] = /*AFRf(4, 10) |*/ AFRf(14, 11) | AFRf(14,12) | AFRf(1, 15); - GPIOA->MODER = MODER_AF(5) | MODER_AF(6) | MODER_AF(7) | MODER_I(8) | MODER_I(9) | MODER_I(10) /*MODER_AF(10)*/ - | MODER_AF(11) | MODER_AF(12) | MODER_O(13) | MODER_AF(14) | MODER_AF(15); + GPIOA->AFR[1] = /*AFRf(4, 10) |*/ /*AFRf(14, 11) | AFRf(14,12) |*/ AFRf(1, 15); + GPIOA->MODER = MODER_AF(5) | MODER_AF(6) | MODER_AF(7) | MODER_O(8) | MODER_I(9) | MODER_I(10) /*MODER_AF(10)*/ + | /*MODER_AF(11) | MODER_AF(12) |*/ MODER_AF(13) | MODER_AF(14) | MODER_AF(15); GPIOA->OSPEEDR = OSPEED_MED(5) | OSPEED_MED(6) | OSPEED_MED(7) | OSPEED_HI(11) | OSPEED_HI(12) | OSPEED_HI(13) | OSPEED_HI(15); GPIOA->OTYPER = 0; @@ -84,8 +84,6 @@ TRUE_INLINE void gpio_setup(){ GPIOF->OSPEEDR = OSPEED_HI(9); GPIOF->OTYPER = 0; GPIOF->PUPDR = PUPD_PU(6); - - USBPU_OFF(); } #ifndef EBUG diff --git a/F3:F303/Multistepper/hardware.h b/F3:F303/Multistepper/hardware.h index c89efee..7faf9c2 100644 --- a/F3:F303/Multistepper/hardware.h +++ b/F3:F303/Multistepper/hardware.h @@ -20,13 +20,17 @@ #include +// USB pullup: PA8 #define USBPU_port GPIOA -#define USBPU_pin (1<<13) -#define USBPU_ON() pin_set(USBPU_port, USBPU_pin) -#define USBPU_OFF() pin_clear(USBPU_port, USBPU_pin) +#define USBPU_pin (1<<8) +#define USBPU_ON() pin_clear(USBPU_port, USBPU_pin) +#define USBPU_OFF() pin_set(USBPU_port, USBPU_pin) + +// temporary LED: PD9 +#define LED_blink() pin_toggle(GPIOD, 1<<9) // Buttons amount -#define BTNSNO (7) +#define BTNSNO (6) // Buttons ports & pins extern volatile GPIO_TypeDef* const BTNports[BTNSNO]; extern const uint32_t BTNpins[BTNSNO]; diff --git a/F3:F303/Multistepper/hashgen/helpcmds.in b/F3:F303/Multistepper/hashgen/helpcmds.in index c3bfdd2..d8bb1ae 100644 --- a/F3:F303/Multistepper/hashgen/helpcmds.in +++ b/F3:F303/Multistepper/hashgen/helpcmds.in @@ -16,7 +16,7 @@ "canspeed - GS CAN speed (reinit if setter)\n" "canstat - G CAN status\n" "delignlist* - delete ignore list\n" - "diagn[N] - G DIAG state of motor N (or all)\n" + "diagn[N]* - G DIAG state of motor N (or all)\n" "dumperr* - dump error codes\n" "dumpcmd* - dump command codes\n" "dumpconf* - dump current configuration\n" @@ -44,13 +44,13 @@ "ping* - echo given command back\n" "relposN* - GS relative move (get remaining)\n" "relslowN* - GS like 'relpos' but with slowest speed\n" - "reset* - software reset\n" + "reset - software reset\n" "saveconf* - save current configuration\n" "screen* - GS screen enable (1) or disable (0)\n" "speedlimit* - G limiting speed for current microsteps setting\n" "stateN* - G motor state (0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err)\n" "stopN* - stop motor with deceleration\n" - "time* - G time from start (ms)\n" + "time - G time from start (ms)\n" "tmcbus* - GS TMC control bus (0 - USART, 1 - SPI)\n" - "udata - GS data by usart in slave mode (text strings, '\\n'-terminated)\n" + "udata* - GS data by usart in slave mode (text strings, '\\n'-terminated)\n" "usartstatus* - GS status of USART1 (0 - off, 1 - master, 2 - slave)\n" diff --git a/F3:F303/Multistepper/main.c b/F3:F303/Multistepper/main.c index afe39c0..283bef4 100644 --- a/F3:F303/Multistepper/main.c +++ b/F3:F303/Multistepper/main.c @@ -38,13 +38,9 @@ int main(void){ SysTick_Config((uint32_t)48000); // 1ms } hw_setup(); - // here we should check the debug mode and turn off SWD if no - if(BTN_state(0) && BTN_state(1)){ // NO debug - turn ON SWDIO (AF0) - GPIOA->MODER = (GPIOA->MODER & ~MODER_CLR(13)) | MODER_AF(13); - }else{ - USB_setup(); - USBPU_ON(); - } + USBPU_OFF(); // make a reconnection + USB_setup(); + USBPU_ON(); CAN_setup(100); uint32_t ctr = 0; CAN_message *can_mesg; @@ -52,8 +48,9 @@ int main(void){ IWDG->KR = IWDG_REFRESH; if(Tms - ctr > 499){ ctr = Tms; + LED_blink(); } - can_proc(); + CAN_proc(); USB_proc(); if(CAN_get_status() == CAN_FIFO_OVERRUN){ USB_sendstr("CAN bus fifo overrun occured!\n"); diff --git a/F3:F303/Multistepper/multistepper.config b/F3:F303/Multistepper/multistepper.config index 4a12c78..6a23e7a 100644 --- a/F3:F303/Multistepper/multistepper.config +++ b/F3:F303/Multistepper/multistepper.config @@ -5,3 +5,4 @@ #define STM32F303xd #define __thumb2__ 1 #define __ARM_ARCH_7M__ +#define USB2_16 diff --git a/F3:F303/Multistepper/openocd.cfg b/F3:F303/Multistepper/openocd.cfg index 56ccc2e..c97a093 100644 --- a/F3:F303/Multistepper/openocd.cfg +++ b/F3:F303/Multistepper/openocd.cfg @@ -1,11 +1,9 @@ -# SPDX-License-Identifier: GPL-2.0-or-later - # script for stm32f3x family # # stm32 devices support both JTAG and SWD transports. # -source [find interface/stlink-v2-1.cfg] +source [find interface/stlink.cfg] source [find target/swj-dp.tcl] source [find mem_helper.tcl] @@ -104,16 +102,9 @@ $_TARGETNAME configure -event examine-end { stm32f3x_default_examine_end } $_TARGETNAME configure -event reset-start { stm32f3x_default_reset_start } $_TARGETNAME configure -event reset-init { stm32f3x_default_reset_init } -tpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0040000 - -lappend _telnet_autocomplete_skip _proc_pre_enable_$_CHIPNAME.tpiu -proc _proc_pre_enable_$_CHIPNAME.tpiu {_targetname} { - targets $_targetname - +$_TARGETNAME configure -event trace-config { # Set TRACE_IOEN; TRACE_MODE is set to async; when using sync # change this value accordingly to configure trace pins # assignment mmw 0xe0042004 0x00000020 0 } - -$_CHIPNAME.tpiu configure -event pre-enable "_proc_pre_enable_$_CHIPNAME.tpiu $_TARGETNAME" diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index a351b7d..08a048a 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -282,7 +282,7 @@ int fn_canfilter(_U_ uint32_t hash, char *args){ } int fn_canflood(_U_ uint32_t hash, char *args){ - set_flood(parseCANmsg(args), 0); + CAN_flood(parseCANmsg(args), 0); return RET_GOOD; } @@ -294,7 +294,7 @@ int fn_cansend(_U_ uint32_t hash, char *args){ CAN_message *msg = parseCANmsg(args); if(!msg) return RET_WRONGCMD; uint32_t N = 5; - while(CAN_BUSY == can_send(msg->data, msg->length, msg->ID)){ + while(CAN_BUSY == CAN_send(msg->data, msg->length, msg->ID)){ if(--N == 0) break; } if(N == 0) return RET_BAD; @@ -326,12 +326,12 @@ int fn_canstat(_U_ uint32_t hash, _U_ char *args){ } int fn_canerrcodes(_U_ uint32_t hash, _U_ char *args){ - printCANerr(); + CAN_printerr(); return RET_GOOD; } int fn_canincrflood(_U_ uint32_t hash, _U_ char *args){ - set_flood(NULL, 1); + CAN_flood(NULL, 1); USB_sendstr("Incremental flooding is ON ('F' to off)\n"); return RET_GOOD; } @@ -344,7 +344,9 @@ int fn_canspeed(_U_ uint32_t hash, _U_ char *args){ return RET_GOOD; } if(N < 50){ - USB_sendstr("Lowest speed is 50kbps"); + USB_sendstr("canspeed="); + USB_sendstr(u2str(CAN_speed())); + newline(); return RET_GOOD; }else if(N > 3000){ USB_sendstr("Highest speed is 3000kbps"); diff --git a/F3:F303/Multistepper/usb.c b/F3:F303/Multistepper/usb.c index a668e82..73e5eea 100644 --- a/F3:F303/Multistepper/usb.c +++ b/F3:F303/Multistepper/usb.c @@ -146,7 +146,7 @@ static void transmit_Handler(){ // EP3IN static void receive_Handler(){ // EP2OUT uint8_t buf[USB_RXBUFSZ]; uint16_t epstatus = KEEP_DTOG(USB->EPnR[2]); - uint8_t sz = EP_Read(2, (uint16_t*)buf); + uint8_t sz = EP_Read(2, (uint8_t*)buf); if(sz){ if(RB_write((ringbuffer*)&in, buf, sz) != sz) bufovrfl = 1; } diff --git a/F3:F303/Multistepper/usb.h b/F3:F303/Multistepper/usb.h index efbf996..3a98d84 100644 --- a/F3:F303/Multistepper/usb.h +++ b/F3:F303/Multistepper/usb.h @@ -27,6 +27,9 @@ #define newline() USB_putbyte('\n') #define USND(s) do{USB_sendstr(s); USB_putbyte('\n');}while(0) +#define STR_HELPER(s) #s +#define STR(s) STR_HELPER(s) + #ifdef EBUG #define DBG(str) do{USB_sendstr(__FILE__ " (L" STR(__LINE__) "): " str);}while(0) #else diff --git a/F3:F303/Multistepper/usb_lib.c b/F3:F303/Multistepper/usb_lib.c index 3be4ed1..4db6281 100644 --- a/F3:F303/Multistepper/usb_lib.c +++ b/F3:F303/Multistepper/usb_lib.c @@ -25,7 +25,6 @@ usb_dev_t USB_Dev; static usb_LineCoding lineCoding = {115200, 0, 0, 8}; config_pack_t setup_packet; uint8_t ep0databuf[EP0DATABUF_SIZE]; -uint8_t ep0dbuflen = 0; usb_LineCoding getLineCoding(){return lineCoding;} @@ -344,15 +343,24 @@ void EP0_Handler(){ * @param size - its size */ void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size){ - uint8_t i; if(size > endpoints[number].txbufsz) size = endpoints[number].txbufsz; uint16_t N2 = (size + 1) >> 1; // the buffer is 16-bit, so we should copy data as it would be uint16_t uint16_t *buf16 = (uint16_t *)buf; +#if defined USB1_16 + // very bad: what if `size` is odd? uint32_t *out = (uint32_t *)endpoints[number].tx_buf; - for(i = 0; i < N2; ++i, ++out){ + for(int i = 0; i < N2; ++i, ++out){ *out = buf16[i]; } +#elif defined USB2_16 + // use memcpy instead? + for(int i = 0; i < N2; i++){ + endpoints[number].tx_buf[i] = buf16[i]; + } +#else +#error "Define USB1_16 or USB2_16" +#endif USB_BTABLE->EP[number].USB_COUNT_TX = size; } @@ -374,16 +382,23 @@ void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size){ * @param *buf - user array for data * @return amount of data read */ -int EP_Read(uint8_t number, uint16_t *buf){ +int EP_Read(uint8_t number, uint8_t *buf){ int sz = endpoints[number].rx_cnt; if(!sz) return 0; endpoints[number].rx_cnt = 0; +#if defined USB1_16 int n = (sz + 1) >> 1; - uint32_t *in = (uint32_t *)endpoints[number].rx_buf; - if(n){ - for(int i = 0; i < n; ++i, ++in) - buf[i] = *(uint16_t*)in; - } + uint32_t *in = (uint32_t*)endpoints[number].rx_buf; + uint16_t *out = (uint16_t*)buf; + for(int i = 0; i < n; ++i, ++in) + out[i] = *(uint16_t*)in; +#elif defined USB2_16 + // use memcpy instead? + for(int i = 0; i < sz; ++i) + buf[i] = endpoints[number].rx_buf[i]; +#else +#error "Define USB1_16 or USB2_16" +#endif return sz; } diff --git a/F3:F303/Multistepper/usb_lib.h b/F3:F303/Multistepper/usb_lib.h index 4408a55..ddfc8b2 100644 --- a/F3:F303/Multistepper/usb_lib.h +++ b/F3:F303/Multistepper/usb_lib.h @@ -128,7 +128,7 @@ typedef struct { typedef struct{ uint16_t *tx_buf; // transmission buffer address uint16_t txbufsz; // transmission buffer size - uint16_t *rx_buf; // reception buffer address + uint8_t *rx_buf; // reception buffer address void (*func)(); // endpoint action function unsigned rx_cnt : 10; // received data counter } ep_t; @@ -167,13 +167,12 @@ extern usb_dev_t USB_Dev; extern volatile uint8_t usbON; extern config_pack_t setup_packet; extern uint8_t ep0databuf[]; -extern uint8_t ep0dbuflen; void EP0_Handler(); void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size); void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size); -int EP_Read(uint8_t number, uint16_t *buf); +int EP_Read(uint8_t number, uint8_t *buf); usb_LineCoding getLineCoding(); void linecoding_handler(usb_LineCoding *lc); diff --git a/F3:F303/Multistepper/usbhw.c b/F3:F303/Multistepper/usbhw.c index 40de129..33a3432 100644 --- a/F3:F303/Multistepper/usbhw.c +++ b/F3:F303/Multistepper/usbhw.c @@ -61,12 +61,12 @@ int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*f countrx = 31 + rxsz / 32; } USB_BTABLE->EP[number].USB_ADDR_TX = lastaddr; - endpoints[number].tx_buf = (uint16_t *)(USB_BTABLE_BASE + lastaddr*2); + endpoints[number].tx_buf = (uint16_t *)(USB_BTABLE_BASE + lastaddr * ACCESSZ); endpoints[number].txbufsz = txsz; lastaddr += txsz; USB_BTABLE->EP[number].USB_COUNT_TX = 0; USB_BTABLE->EP[number].USB_ADDR_RX = lastaddr; - endpoints[number].rx_buf = (uint16_t *)(USB_BTABLE_BASE + lastaddr*2); + endpoints[number].rx_buf = (uint8_t *)(USB_BTABLE_BASE + lastaddr * ACCESSZ); lastaddr += rxsz; USB_BTABLE->EP[number].USB_COUNT_RX = countrx << 10; endpoints[number].func = func; @@ -101,12 +101,10 @@ void usb_lp_isr(){ if(USB->ISTR & USB_ISTR_DIR){ // OUT interrupt - receive data, CTR_RX==1 (if CTR_TX == 1 - two pending transactions: receive following by transmit) if(n == 0){ // control endpoint if(epstatus & USB_EPnR_SETUP){ // setup packet -> copy data to conf_pack - EP_Read(0, (uint16_t*)&setup_packet); - ep0dbuflen = 0; + EP_Read(0, (uint8_t*)&setup_packet); // interrupt handler will be called later }else if(epstatus & USB_EPnR_CTR_RX){ // data packet -> push received data to ep0databuf - ep0dbuflen = endpoints[0].rx_cnt; - EP_Read(0, (uint16_t*)&ep0databuf); + EP_Read(0, (uint8_t*)&ep0databuf); } } } diff --git a/F3:F303/Multistepper/usbhw.h b/F3:F303/Multistepper/usbhw.h index 2e7a52d..ca6fd25 100644 --- a/F3:F303/Multistepper/usbhw.h +++ b/F3:F303/Multistepper/usbhw.h @@ -83,13 +83,28 @@ typedef struct { __IO uint32_t BTABLE; } USB_TypeDef; +// F303 D/E have 2x16 access scheme typedef struct{ +#if defined USB2_16 + __IO uint16_t USB_ADDR_TX; + __IO uint16_t USB_COUNT_TX; + __IO uint16_t USB_ADDR_RX; + __IO uint16_t USB_COUNT_RX; +#define ACCESSZ (1) +#define BUFTYPE uint8_t +#elif defined USB1_16 __IO uint32_t USB_ADDR_TX; __IO uint32_t USB_COUNT_TX; __IO uint32_t USB_ADDR_RX; __IO uint32_t USB_COUNT_RX; +#define ACCESSZ (2) +#define BUFTYPE uint16_t +#else +#error "Define USB1_16 or USB2_16" +#endif } USB_EPDATA_TypeDef; + typedef struct{ __IO USB_EPDATA_TypeDef EP[STM32ENDPOINTS]; } USB_BtableDef; diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index f8dbcc8..c39972c 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "1" -#define BUILD_DATE "2023-02-04" +#define BUILD_NUMBER "11" +#define BUILD_DATE "2023-02-07" diff --git a/F3:F303/makefile.f3 b/F3:F303/makefile.f3 index 1203008..4d132b3 100644 --- a/F3:F303/makefile.f3 +++ b/F3:F303/makefile.f3 @@ -2,6 +2,6 @@ # MCU FAMILY FAMILY ?= F3 # or __ARM_ARCH_7EM__ -ARMARCH = -D__ARM_ARCH_7M__ +DEFINES += -D__ARM_ARCH_7M__ FP_FLAGS ?= -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -mlittle-endian -DARM_MATH_CM4 ASM_FLAGS ?= -mthumb -mcpu=cortex-m4 -march=armv7e-m