From 81e58130de6b3aedb0e8d019d7e2607feff674f9 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 4 Jun 2024 14:32:21 +0300 Subject: [PATCH] Release code --- F1:F103/FX3U/Readme.md | 75 +++++++++++++++++++++++++++++++++ F1:F103/FX3U/adc.c | 2 +- F1:F103/FX3U/adc.h | 2 + F1:F103/FX3U/canproto.c | 14 +++++- F1:F103/FX3U/canproto.h | 6 ++- F1:F103/FX3U/fx3u.bin | Bin 15168 -> 10000 bytes F1:F103/FX3U/fx3u.creator.user | 2 +- F1:F103/FX3U/hardware.c | 55 ++++++++++++++++-------- F1:F103/FX3U/hardware.h | 5 +++ F1:F103/FX3U/proto.c | 2 + F1:F103/FX3U/version.inc | 4 +- 11 files changed, 142 insertions(+), 25 deletions(-) diff --git a/F1:F103/FX3U/Readme.md b/F1:F103/FX3U/Readme.md index e69de29..54e3260 100644 --- a/F1:F103/FX3U/Readme.md +++ b/F1:F103/FX3U/Readme.md @@ -0,0 +1,75 @@ +A usefull thing made of chineese FX3U clone +=========================================== + +Works over RS-232 (default: 115200, 8N1) or CAN (default 250000 baud). + +You can see pinout table in file `hardware.c`. + +## Serial protocol (each string ends with '\n'). + +``` +commands format: parameter[number][=setter] +parameter [CAN idx] - help +-------------------------- + + CAN bus commands: +canbuserr - print all CAN bus errors (a lot of if not connected) +cansniff - switch CAN sniffer mode + + Configuration: +bounce [14] - set/get anti-bounce timeout (ms, max: 1000) +canid [6] - set both (in/out) CAN ID / get in CAN ID +canidin [7] - get/set input CAN ID +canidout [8] - get/set output CAN ID +canspeed [5] - get/set CAN speed (bps) +dumpconf - dump current configuration +eraseflash [10] - erase all flash storage +saveconf [9] - save configuration +usartspeed [15] - get/set USART1 speed + + IN/OUT: +adc [4] - get raw ADC values for given channel +esw [12] - anti-bounce read inputs +eswnow [13] - read current inputs' state +led [16] - work with onboard LED +relay [11] - get/set relay state (0 - off, 1 - on) + + Other commands: +mcutemp [3] - get MCU temperature (*10degrC) +reset [1] - reset MCU +s - send CAN message: ID 0..8 data bytes +time [2] - get/set time (1ms, 32bit) +wdtest - test watchdog +error=badcmd +``` + +Value in square brackets is CAN bus command code. + +## CAN bus protocol + +All data in little-endian format! + +BIT - MEANING + +0, 1 - (uint16_t) - command code (value in square brackets upper); + +2 - (uint8_t) - parameter number (e.g. ADC channel or X/Y channel number), 0..127 [ORed with 0x80 for setter]; + +3 - (uint8_t) - error code (only when device answers for requests); + +4..7 - (int32_t) - data. + +### CAN bus error codes + +0 - `ERR_OK` - all OK, + +1 - `ERR_BADPAR` - parameter is wrong, + +2 - `ERR_BADVAL` - value is wrong (e.g. out of range), + +3 - `ERR_WRONGLEN` - wrong message length (for setter or for obligatory parameter number), + +4 - `ERR_BADCMD` - unknown command code, + +5 - `ERR_CANTRUN` - can't run given command due to bad parameters or other reason. + diff --git a/F1:F103/FX3U/adc.c b/F1:F103/FX3U/adc.c index fc3b3fb..e8a7ddf 100644 --- a/F1:F103/FX3U/adc.c +++ b/F1:F103/FX3U/adc.c @@ -38,7 +38,7 @@ void adc_setup(){ ADC1->SMPR1 = ADC_SMPR1_SMP16 | ADC_SMPR1_SMP17; // sequence order: 1[0]->3[1]->14[2]->15[3]->10[4]->11[5] -> 16[tsen] -> 17[vdd] ADC1->SQR3 = (1 << 0) | (3<<5) | (14 << 10) | (15 << 15) | (10 << 20) | (11 < 25); - ADC1->SQR2 = (16 << 0) | (17 << 5); + ADC1->SQR2 = (12 << 0) | (13 << 5) | (16 << 10) | (17 << 15); ADC1->SQR1 = (ADC_CHANNELS - 1) << 20; // amount of conversions ADC1->CR1 = ADC_CR1_SCAN; // scan mode // DMA, continuous mode; enable vref & Tsens; enable SWSTART as trigger diff --git a/F1:F103/FX3U/adc.h b/F1:F103/FX3U/adc.h index 063bb90..d594f4d 100644 --- a/F1:F103/FX3U/adc.h +++ b/F1:F103/FX3U/adc.h @@ -28,6 +28,8 @@ enum{ ADC_CH_3, ADC_CH_4, ADC_CH_5, + ADC_POT0, // on-board pots (PC2 - in12, PC3 - in13) + ADC_POT1, ADC_CH_TSEN, // T sensor ADC_CH_VDD, // Vdd sensor ADC_CHANNELS diff --git a/F1:F103/FX3U/canproto.c b/F1:F103/FX3U/canproto.c index cd43cad..6304cd1 100644 --- a/F1:F103/FX3U/canproto.c +++ b/F1:F103/FX3U/canproto.c @@ -27,8 +27,11 @@ #define FIXDL(m) do{m->length = 8;}while(0) /*********** START of all common functions list (for `funclist`) ***********/ +static errcodes ping(CAN_message *m){ + m->ID = the_conf.CANIDout; // change ID + return ERR_OK; // send same message +} // reset MCU - static errcodes reset(CAN_message _U_ *msg){ usart_send("Soft reset\n"); usart_transmit(); @@ -127,6 +130,13 @@ static errcodes eswg(CAN_message *msg){ FIXDL(msg); return ERR_OK; } +// onboard LED +static errcodes led(CAN_message *m){ + if(m->length > 4 && ISSETTER(m->data)) LED(m->data[4]); + m->data[4] = LED(-1); + FIXDL(m); + return ERR_OK; +} // common uint32_t setter/getter static errcodes u32setget(CAN_message *msg){ @@ -176,6 +186,7 @@ typedef struct{ // list of common (CAN/RS-232) functions // !!!!!!!!! Getters should set message length to 8 !!!!!!!!!!! static const commonfunction funclist[CMD_AMOUNT] = { + [CMD_PING] = {ping, 0, 0, 0}, [CMD_RESET] = {reset, 0, 0, 0}, [CMD_TIME] = {time_getset, 0, 0, 0}, [CMD_MCUTEMP] = {mcut, 0, 0, 0}, @@ -191,6 +202,7 @@ static const commonfunction funclist[CMD_AMOUNT] = { [CMD_GETESWNOW] = {esw, 0, INT32_MAX, 0}, [CMD_BOUNCE] = {u32setget, 0, 1000, 0}, [CMD_USARTSPEED] = {u32setget, 1200, 3000000, 0}, + [CMD_LED] = {led, 0, 0, 0}, }; diff --git a/F1:F103/FX3U/canproto.h b/F1:F103/FX3U/canproto.h index 557cdb2..dbaf54a 100644 --- a/F1:F103/FX3U/canproto.h +++ b/F1:F103/FX3U/canproto.h @@ -35,8 +35,8 @@ // error codes for answer message typedef enum{ ERR_OK, // 0 - all OK - ERR_BADPAR, // 1 - parameter's value is wrong - ERR_BADVAL, // 2 - wrong parameter's value + ERR_BADPAR, // 1 - parameter is wrong + ERR_BADVAL, // 2 - wrong value ERR_WRONGLEN, // 3 - wrong message length ERR_BADCMD, // 4 - unknown command ERR_CANTRUN, // 5 - can't run given command due to bad parameters or other @@ -45,6 +45,7 @@ typedef enum{ // CAN commands indexes enum{ + CMD_PING, // just ping CMD_RESET, // reset MCU CMD_TIME, // get/set Tms CMD_MCUTEMP, // get MCU temperature (*10) @@ -60,6 +61,7 @@ enum{ CMD_GETESWNOW, // current ESW state, absolute CMD_BOUNCE, // get/set bounce constant (ms) CMD_USARTSPEED, // get/set USART1 speed (if encoder on RS-422) + CMD_LED, // onboard LED // should be the last: CMD_AMOUNT // amount of CAN commands }; diff --git a/F1:F103/FX3U/fx3u.bin b/F1:F103/FX3U/fx3u.bin index 1d624e122723e4d63ed4eaea9b91757a35208565..d00a77f618f978d48df3b16f5c87261a178d8cae 100755 GIT binary patch literal 10000 zcmbU{eOyylmiK*xgn$wVwt!S032Gpy0kox}V@Ti$35cItYrkHA=!+Fd161tHtWk7I zMQ2o;j)LvlkKMI)x&tV?c18xOo$hSM?j$O+fSob@jGA`mA;CN$CVOrI{cwNt$8LVV z^Ugizo_p@O_nv#txfc*3n9)Qen@1v9#(jY9`(YUjn2m9-^nbUxU&r5~v+nC_T5ep9 zWNv^T15ES&uej`Q=>EUz`Txil-&*|)GGZ4cBV_&5y6MEkpMb!%`DBm9S z+lDif<9AkEdD&2SIn$hGONyZe)un3FCT=swn6B{Gq%ni0JEs|@oZ+tU*QJwJm#EWB zDDw&j+#Ds#EKu04i!~m-Kq7_ZaZ8%bAn3_7%Lwn1(u4mgqJa_qvUK9=b#91P2nr;3 zDO3bA!o`}DHnl)fN{i4(FaS&b$&gk2m!aEUPar%OX<%LP$}*&0O>8ZB`=!5rgmg$B z@}hqGD%3AAr}0N<$zY`)tsycfur`sye1u3nf>sZil&zgHiotaAk=9h+ewOm>M#cP* zo|QS$KNA^9bx}N~FmU$s_Eq*(mwV*dGFLGVGD>xES_849I8sAoc2DfSjpniZMe%@M z&##NUC>}x}l}wGsBjnqixTF|n5Y1~y<4U-T;!(w)yr_WCFMfa__^efC~i{;!U@g$SV&opHS z1VQ@#{lQf3I=6{S<7;9K0zrNtp3tXp0@w|Gz!&$0wxz(30mJ+hBU1k{l*L}ES$!tC zf@TLs3F)AC0{sLjJa47CLA%5^pd?3$`1iz<0~yWA;ui6gVp(dkNUW^xemfPc)j72{ z-QmD1;gs%Z%TK*XrC`NA)Q|fs=v9k zFG6{*cxp{SUpTNMj5HH2+@=lPf;EiJ5!EbZkroMuog_u8gPbGWYy zRPTA+aT*N76^Jawn9QI#Qn!} z{jSIwsn?{(aUXlzo5{SfZfrxMN3!URQ42k5Sdw#k=&{UMg1zz$A5DGWrhJlFSR2y5 z8X0kH&KsjeG2S6v=2zZFGGWft*q(odxjTORcq-LA`&}B3Wo2A9o-yqE!da9-EFe{T zx@K1phh~gQX;{-oeeY6P@vdjO&FMouwC3?1zZ5=A%oOE}@JB+*hLJU7Z@Y!mUBe zSvmAd-aey9gT5){H5uh=p~+Dl@tUugh|NYK@zCgyZfgHvJ&Im+X*f_5QkAO9!-37= zaNy}s25_DTF}85v2+)5QngjIu(8>Mb!23Y24$TJI9OAZx1LuKeLn%NTLmsF<3-k{{ zvw$uPF>T?%FM)nIlmv8shynRGfnF3!09qUJfc_Ie&kxC&aA0i+F$&mcSJUD2!)GAO z>*rAR1JDm4nF1gkKm$+!AnT<-i!2lld~gr--}9CNPtm)lOLK;5rr8zR1uljq-U40~$T8_ga&CG4W!fLcmLt1s9osG(HthEMIj;V-;Yq#f$#)ksFZK(TZ- zHGJqU$)IfcHCaZy2{A|bRL35_v+BZ_Qu8~6!Nfl>zH_Oe5f;|EA2w@j3aTBW7^=XFqenO4Z zG8O4Ca*FdC{ zk^cgmH*uD5;QA!eoO4MSu}=Yhay2M3Nf;cr35eTbUp(+W461DsX1YE0R~)l(EK0^@ z@ZstB&4aHr1HfA7kT&L;OcevOIlC=7mo2TNN!b!D<2a5Oyk-=OvZb(UQWN0-FUvs8 zW{C4eJO!%={+5V&n1g*z)++;h_5{NLeXxJ5@@JB=81sib>GxDAjep=UC*<7={iCmu zhei_;I3YkwQrqU;usYB_$-J3gCrumN%&P>N+{|_G3Mn<%!5ai8*}=t`JNQINg!Ust z2PXwOiK4I4Dv7y89LTV*0!cpt$#Lv6H7Jq?#K1aUj*$*Zm^2$*rVbsMXU~q+ zjt`TNQMK{^GD?yc$B63L1U2e3QsaLx#$@LWUB5vJs(G619C{H#nZMpye2Xl80e@A? zcP1Mrnv-JQZ8qE@3_I~x^=NbDt@0-mjpdMi9Oo$JW5{%959AGCyid%>s(dt*|y45TDG1qtuXorjO)2L{`K*6gIWkv zM&T$G$N6lDtWiJ>KFcg#Z!QrC$t;e5jEQua!2c%(mscz|^-c<1zvr{dH7KNrsuS>|=bMG+-k z6w?7{0KMvhR6a<8zg-d2RdOTLK+af7UKEp)U}rOMK0FAy=L3N0RMS3jAont~Pc`GL z?E;k6+KT*iQISwethKa=$yAFt3*Z52E;olu=hj5>ikW6f`7wj0KZWfYf8d#d{!0G? zYaG~j@V-HW9-li%LF!SaA2|;`fu{WheS$m#A1p+&vRG3aZxozLqaPXDIHe8GnbLyy zC&uiQA7ULiCg`VPLiSWlSUI`ZFw30sy_kSV#Nen94!FWNGF+R8Mh3|wj!q=R@#)Bb zW5{%5z~yLUI5SDJe}sPVemsO@L#v{9rj}-vt^_URl4uj*EK&5yO>pwV86dePgHv6} zBc_^D^i}gp?yi?M30^%P4jc-TCZ883f=LI+1SsgmCkG7~Bb*&-Sq0_r?Z+((`iwkX zff(POaG)tX&5O?C-)_^=irZ*gaI4MVwt{|y-sR;lcA?SD#0)qcmxu~Ru4^@@MRKv| z?h|8leWFa!W*~>;Y$~f{`^0#CpE%Qg9yrU`1#B{Kl2D(Ryyg^evRMhM01nOl6sSCQ zCYuP9eBeA}npNz1_CcT&%xS25nayUK*fR$5%ByTX`#f7yLSFfjeUoiu_e5$**3MRy zX!@(zcMS#okFqBXM|#LBQkG$tvn{}(*ke5>!J8Pi$Dm|2{rT)$z|CTvJ)J!*hL?I| zm)i{JavU4=IA@QvOXzDgOkPf5<5<5}gnUZTD^t^~vsvvx!Y&l6!M8<4BzK2XII=>h zzo3_9W%FX0d5&=4*)YXw*oW9~U`x2tFR0-jIff>wF^TEoc%pjGB$agS!Hd2sqH87Lo3&T>_! z%Usf&tdCJAu_UZrFhq*+%Wry7=b3R-PhCct&{Fq_mtZ7ax<1g{04u?C81A^@Dh|TB z48j>ndx%rvz%%zKjobw^oR8ITK1vwK6PVAuB=dwxsH+_6k~M zeFDZhV+f+gd^`t#4pN%`a{XRJ+;rX8@Ftk=n_{$&j|Pv5&3PSnbxga#1^UkQBNgQ{ zN~lqSy4G{9f4`_>WZJzTBkMC93gEcmu3Ki7nc5BXWt0J&+3ki& zHxgbJaXWmjd^{h?FkVB!8DoeWS}W>wgl~Yj*xkwRZ%s2K_Y+Jc<6?AYXFRl4%+u*n zKGZE0^YrP4lzu%#0%F2}mT_=%GVT%L> zk;oec8xULOdnY`rX2Oc)Q}zJZYxITxCjat*Wdt zKgP9)YR(LASuKX2bIF|kcJ`j9%}<+9JL>G*MiypVMHz4kJWqP6=d>Bpu05GX_-bg{ zw-@D!%o@_?M9DB;&i$73F2jGjQ76htx5QnOOwyUFD-tdx{7%hlIm!b*k&il*mP!FN z5t)_#fi-Yy35jt)msJX_1*`7Rt0C@hue{^jQD7=seb`nc{FpdwSy@)Wtt``5RGhv;;Yb&&-i=txSI`?$-L)9NwZQ?p0i^cCo9nt((jrxhgpqp%;V^)=Qz-kx-8Pq{; z^(g6T;U9vmD8)Q`s)mM|hdmHSaSpwvtJ z%qYKeskr3!#x?repBjE-PUlj%$GKFtgKIWNd-@RG`zG9QBCDHLH)_g0AGfs)`@f_#Iuqa zSJsO3^7U|sC1!T=@vZ3wTnl$h<36L3J5*A63l?EiMttu6?I=o^>w2r?L-G9D*)EwH zWyGuA5p{}#aE78z`Qh1Z(6T7*=Lba%^A4Pxv_}q+W8f~Op- zUf+IKr|*EsL9`===pfhx&u>O$39^0|Z(Mr`<%SWfU_TZT8IN#ip~d|qOOFz9@cuT@ zHhFU-u^V-^h&sKjd%xJM8WE4d9bYdTa*l`xAiG@Yf9zKuiU*hx@sMsrJc^L^L-7zZ zaC@I~rQh_cly0gSY4w8J`HGmSlYvdY*gdN>6sWpa=uKvnrsVPq@J0@=y^z-kW9aA` zRhPbiy#RiSUN_N^Jpn$C-&=7$j^BN8o{nSM4Tx>=5Sz|IoWMEzz+AvnZ#hfwUcokZ zDY}UxQLE1-(!OGv$SUY3GUUF!B+N5$MBICXIzk=}1%4U|1yb&v1IuRJqdMM1J>pNu zP#_k#Gw!_$tEqJLm}5u7kEW$QGx5@0V)^0X^kRky1#<4e>t8}B;J+6Nh{5s_zgrI6 zjC)VAWpKCuP&}rCxzW7|dT$0Vd`ZAc?V3!7Tqqp);iS?V3cMP`>rJ-ze|Z9A{wp}& z+X?teu+x0PhH{Ybs`EI|e+V)&LxJUB%?H7kfxZ}ge@viC-5bRC1f=n}H$m+WBDICVWl*~% zB2x`ANc)wW&Mfe3g1#39>%O${B%7FZ25w|{eNh(8mR_5y{^+Ju6?^0zF&*~h939oH zD~#1v4aK|_3Rr`C4HPSJ#dPe-Mz=q3LOqiXcK}Ki3XBJ-W(mCcZFEUb9TYR6-{qlK z#JPHuv(kU?Usgbm{>jCVee9*Lib0tFui;Jyz7@Rq#UoJn<>c$qUE?c%wG_&p$Be zM*#$!Bf|cPhjJ!>9suVzzXbjUD4zvr&V)8Ve}(H|pVGc1+ zk=5R){HqapBG&6BGgo_w%yKWh$ZHctqL9ee^miBnE?1g;Ra1l2QC(lRIEB^ilPn1(hOX=#!XH(G15KowfQp=jL((D9AVslHd&Pbq-9b=GRD?RjgI0qvXW8m*3H z43ckffK|0Hz)0)w)WAHHTN=LQ*H}RuMaAUE0M^xS*#aCGuce{kTix4jSR3Y-VC$zf zG7&zS9@!S#mU^cCdFZsMj;XJ%ZgN;_@Z_zpueC;oA2nyHMvfRYLL1k^IGHj$HCwh= z9g*f+w%6~#?fAwR8O?E@N|b`HR_2`5VT`dR%rV~T~lq9)$!C5D_~)PekvmWO*Qib9ws>CQ_Mn!w{Ew~(Zav^lOs6;Kj@Ev zXDMiaB0~o!sWi*c`bHQl)UjX!AXHTSEHc3SI$%8`vkp8=*VNbA>MV7QSjM={h%{gr zQ?-+60RP)zaaggVRGJa0vebZ?5&XPmJ3>1g^>tgfTkCK;sH?86iTHLSEXy}*H9Zel z<{Q6{mLvX*`3*a4jn#Z)A}fwQX&3SQ>5hxRdDC0(ooW;;mpJm~2}Z zWioif!G>fswGBB;t)+PxldIF|vT&a^FblU~s_GkgMq{g641!sa?#hap#SB(utDB;+ zJ&`uHIs_GqaXVX`9W>)*DJ%Y_9(3UHv<#5n69OHPL*ctJSVM%#XsYZDS*WI|){f63 zEQ8Aoc(TI^+ZZ#yGjOZJ(qP@P-O|A0eG28sK94Y%hQ@k_Wvdl6Se~~|>%!&xb$okF zeQR@MPvk~T!ZwtxUR=3x146KrcwCIbvV$oqHZri-P1cAfGh1P=)-lz*1K<PG3^#BqmmjkW=2!T#J-~#~oAU+1T3m_KC z=K;F_5}^DsU_go2Jw*%e_5C`Q0fB{8* zXQBK)0G^slfWHF3Yvl)wAiuf?w$Xrd07&330lWqP*x^lpBTA+}_^!_Yfw6uHV+l-S zBjDbToKrM59MjAc)&mB)$atU_`Qdup9^>iu*a%EdwRd7cOoP$yLoRm-;3~inzzqNq zAP9iPa^Y!mXAF{k0{;3q_&^EJ@V+NY21p0U1keE#07Tv^a9{ZS3{MDt)0n~-VOt|g zBY&5P(vh)&oDBESX{{w@?_I|^7NP)wQ>C(V^@nJa^TVi{t5 z2^i=khD=|1A#EBvYhIewPT#zCUZ?}}C`#%yw6C2uoh8S4GuTdM^k$}$tm*4i{3I5- zSekF2du1DvOlG~cW{ua{I_K>3x6eL%@3YT7*Nh3$yh>(!6!6tMfZg#&Z3qZW>DGmx z?Q`cCUsV3E;`94HHILbT2p9)^QQt4a|7qnvzweig{blw2=TDwvuQQjX)Ov>kHTAVO zSn#Z`+S?e|QePVt#0KBU^_|~lBb&UN>jxFtyQzLc+2Gw)wpUs2t-bdB-45k`Z=<>f z{iM5sP*VG={? zyZ9q!5&jiRBy-uB^QXbLUQj4Efu^RsNK?JswmMcQX>E-x<7&B(Rp*M8F4x+yjwZRy zRwXxSZ8rBGKa8J}PY>2u$8RCkkGnkbiA$$-j(HPl=!DCopXhr&^gOjWf>b-{@`O%a zI;Ec?%$rC<=%pX;J00S^jv&?0D|BMx^BV8938{=;+R1-JtLmQd%h}G*`L_sf;!{)_&(WmrlzjH)PHY z8S65}*@TqV6+*8&+k{RRd&;qQXRvp)UuQ0GxsEQ1Sv~1ea%x#p^oY9kI?2@KPx4)| zBC8qoCv>r3cmCvEV-70EtLV4bLo#sYEjDuU=dV`uUpRq%-gzSmxy!&fBF1reH1!Sr z8Xv3JVO0&5W7ub@pnC)hm`c zx-@li*jNwA^iLU+jP>*?C1~aFlz7kHWR;Ms(Yv-;qKj?`uEmiej$>}iL_X<9S1wxa zEgc=6SD)YI@DzF)Sz+A}%dRi1%Pu<%ZdszO(=?~eZ5g%l9?X^E3L80xIbnXK7h!*Q z(fr)r81pi>Fu`2+MCQ|s(%7(2H97qC;R0_-S8A3#%%UmtI7Kvm79T&8mmQu=%sN<; zHk#&5g3fearL-VpJ2$-4I~FTly#y3n#CMQejGen2+g7&7 zYe8C6wh;Afbt$Ld9pp-I8Wm$T*4owM*3mfxjt92YTBUtSE9P(+Zvrj*$sg0*X zCz7t`V#_MGLpNk!L1ddb?}OaCh%_*_EnJ7ZGiP#`D5SP&k*|0isvH<|WV-*y_)EYf z-BvCOZ8t40H9{DtAYSdS6+ii1E%v}gzJ%`6pRr(nYi9P>p9Mb_upJ-+Rsa?O@&Tbh zMwPSInH~=m*6O}cAe~CqR4I*0mQ=}#lEb5$Ek)jMV_RXZ+!P8}c)wIh;Qdl1>Lv4b zy1KD#5EdyOm{8)+=;~f2bh6Br!$!N8v|b%_)C2L0q5^uz-}5kB)HkN zxBB(N4ngt4zBlWK!SnDpye#q!uiX5DNXFG{QE$@rH{$f7v+%i?yYeM~d{Eo(R2%0F z4eKYU%-r>1ZU3aIq3sa-Fv1CPhI@<2xxdP0wzGie02<&afFJO6z(WA7&5@(GWmLU4 zjFYm>k*&9-r}B2aEsf{(HfvR18?}&mYmsA-M{7$ekJf^jpBUEL99{9#%VGTnYb;^? zG;`lG%2(uD<{cc+1AC9_0cRiSRxH4xFUMVwsE{u+5(^}!-b}ztanB1cGNr2&@)Lsm zG`s&i?t~ma93zWMXLrh)W`t?%Vo!3a;FjoN?t)PnJgSXK7J0uzp}e6l$8PL-UEWXr zt_35|DC_x7o%6HmJnT_6fNWlB-!5X$xGg)+UeDxumzL1#L7^uW6apN@PQ;nCjewSFPJ#@&NfC*FuOS+`rgg|)vkZzPG2 zz%lq(Ru)f7`4MT`gy?fgA$l{Bocb@xS&!#8B47V^Y zxH2QUMpE(Pn})w?tukgZZ8S@*BSqsplg7c}Ebm~y9g>>q-P=zVvq?|UZ1wIPAi9l_ z49|#U=FYJ)XU0m6QT^p(+`+T-nK5jjCq+RT=$fS<#kILKuxKARMK&D!A4!|>L{l{G zj3z5tv`PQ`HimDP?b3r}`7LhiIPu5eY>HFaoHB>1Yx(e+SoC{b@2nGoE8pB(;yjD4 zpT5XXe*raC)L5%7nY(T5L23u{K6f@_jPf~SWXz0V$OXyG|IJ7&`Z`9@wOqa$gNhtT z2fv|QcX&c-VKsASj|eX2niw{?d*=)c@?!7?d>PP=y~fXMYlr1I_{cxQ>;lU(ru} zz1}Hce5@&Jlv>R87&Lo)C!(L)#am_LM2$Z)Sd;bM?PEV@wmcEhpAp?#$7OyJlhu$X z^k-~tdw6d9r$8A|(vERA@^Nid;N7Wp+ntCv5Z?!D7KP%Cj!d?R2HmRRl zVfHaF_764HGDGzP=Ga>?wu`rOsv86Em-edPdl0s#izsvS(yt|Y%t9xk16)tzTz~JD z5be3eTp`Z&&xNeaxtrno8@FtbjdXw&kUF21;Cwps*88xh z#jBa^2DhuU?=j_PN*^qt?kkVPvBP7IiQK}v#ysxX)P>*!^{EzJG$gxD^J&;Ky0M?F znTK8KBiaUbewysY{cJQ8$c_+Ay3ax>Zd)|sV9k3IuoG3q9-_gxNgDQJk=HrE+zY}B zk=A{>sOfA?-W3P(LlzA;>dRMIbDv5#R!v<{|C%nkoSE}s^NYMr)gl+w=c`3!q!&Z* z?(>1q10MeB6-BbqN~p49emmy1eP-VD?PR^O z(4!ch9L+;>&|Jnm0Kx^8-J@S5>+4k^S@4EWEhzG94uNYZt`Y@}w_dvIWPexaI z*OW~t%hAV;GaUCzUr2?&%ROzOs?nzT$OqmKkr6|S2OM>j{w$DHS1{n{7jbhjeErfn zBT|b?d`}05DSs2Ko$$QU!gqmt|4tVWo0}iW<2}f;fCmBm-*9|p#LnrF;l0UC8{0JO z{4d7RK%Ety2T`ZB&3LqurP?Lzd*H{X{``CLYqP6xhXM4T{}E1kGby(6OQwnXEkM@Cq z7NVj5!a!7K}*!hfVyA zxD5Q&xNPG8wTb^Yz7F_5#6tnvmHRNOVH1Qg!L==-K{M==ntBO)B3uz%TYw>5Ci{W5 z@GT9QTjni?wB6%f#$|4q$=$L!++D=?7#bTW#V#OTf>CrO8_^Zg#YLcod~tBxmku0k z0c=1Bv;MC!=w~1ol0bd*K(R;S9y1#uJ*0i0{U`^l0c--)0Z3OKLrQwnf|T}ZuH5v) zH%2@=K=JHn#IwG;y*r}}(eQ=dyXzfFDUVl_B0|oZ911K8R^{Y+T;k0~B%_4q@1h9$ z>b=SW>RaQ0ec2fuKsg(=6Nr{Q_^GvqQYsm^Z12ub`@1I;HZtR@=Rt-j_F)sM1%c(W zY~%+9idh~~iiZ>n)&1w6gM5jepDB9q*D>qcx;DvjDI!NU75ifuB`cX52_c^rhV~2) z-r+<1D=;+Ruo@)+eoAS|j*ff`p7dXMmXAxZ&y1^*s4M#6EVlz*E6K0klNZ^jY5_;J zegtD&{+7=qBAc zn>@dcvA6ZZldJ&t8S|;L^xLuPPIX9)t1k?YCsf2eA&SGK^v=*T(L?kWdP1PNT$FvX z3Q0K}Iy_jjW}Hr=(BY78Ax@FWVS^r``RB=A@CyFHsSrl+Xb0UF6REv z6Z4=IdvDU+@NV1&>GW*4Nxq46Qx9a!td>UqHeahDmD|=3Ur%tpQVcq)%nCc6occa* zW1Juc?`PZOnr)16j5aFYAF?Z?5w*}+z9)xjB3p4<=trx!e>LW+e9y53_o~5~m1FwR zuhj33RpBmvUsyjX^ZX#%t=~RLC)sTrCBD-sw1P%L6vB-&2s#&-sJ$2S6jm=oSwFfA zwsYC`tudFB@&xpw*!M#Qr}U#)?w^fAn{kp4)~pUM0=F*5a3kh6r+3=m*rgb8?75ii zp)+u=GN{;GayRad@LjW9a+mC}R%P?sR~CB8(0m!3PE6h6_wRJv8jZM3v-{dO`K<9Ql4&PZ9Z}$UkFPU!~7` zxV}+sPo&{3;<*XU-He90Y=O-P?e+7Z{h zFUg|sCf1l^ubUI^*$}SeZ&-m#H!RstM&*Un-kVtO zlR<+xQGj_Y$-a-MbZqMB*ELQ@ZTzW^cuXDVUv-JVNM97_3i&N0Ybx>sfL8$&XL=jy zF9C)PTZVU&Wf=EACho!S82=3?mLmWA#QpFD$a-gumZAKs1a6Xi#6%t9OPGaiUx*ZffmZ0~o%Xnp&9InL681=oI)8atIVqAjK8*J~yl8C2i$)gab|i2wz}(ey=8oW|hZsEW)~UDy%^T+Hr8A{h z5z%vcnngQtXJI3^KKft|FAz7!ElF3lq0JwsV=9Zj#&6^-`roH3Fz!#M>8znOe%Hib zncfWi52rT+ALnmcRQsG+`|qdMW2C>IUWeby)6fv!_f@m@(sUK@e>Yua;t!knzn!iC z{>Rf5rjM(b_}8XMTmEVq=MXfVMfaHa?@p8aot<_enoIa?CjRvFV&I>fUWgNg@S9Bh z(dkm)wduP|+fixayQl90zH^$sMWFUeOnfWnY1JH_l5ZIW-)uNrZcz$ZBVV%^DfyP= zNJ*F0Bdr7M0z3{l0O-G9ykTTq%@Z9S<|T_UC1+H}>n7`@(`FrfrJ>==*X`oauy&HZd-#Ws zv^GQ>KNMZ}qArQpqs6r(a#PjX_LlZF{T9AZIU*Bcta$m`9|^9zB3j$zuzZN_pgLmS zL@7ypH8fJ>F}w6gnrTTX=1uXta_-9+=Tpjev4NYvxdqP;{)VfPIQolQB%Ob8E2X7B z0Y9#6B%Yk%vZ+CfVM+Q)8!7i6`mK1+*;1M73N;USwPxI#nu$CAc$3aoy(udaZ)+&k zo8>eL<%GDPUtmI+mHB6b2?hV!Zd69$-?|$G_*e#9(8i+==6z5tc^uq0VN@f zZl4J4Z>&-HN{v_y(cJ~!WzX4VDutRX{EaHKe{eX|=I9UMg<=utp*2^yCB!nFy&K%6 zS7xox$#|?O-bU6ZC#++~L+UYi+LcQx^`r=o7!f#^Hbg`|GI3}Z=MdSnh1{m07v4w= zYxY}=*Qe@`CUKN#*-}{=p|Kpj^xI^{jcj}@di|0Q65S*L^An*qdXb_&DZlR}F>HXXi@As0iciU4-bQk)w8g9@}8iAL(Ra zdeF;=SkBfA;w79#_vvh;+Pw3T%`b=EohLmr@BCRFy=x)jo4QK7P7)?TSBy9NN?=NH z5*cxzNm~d~H8D&UzQl71o^d0a93FE_4#!ntV_d1M!n={`=nCO$0vhMPj_Q!ov~X&) z6&Ov2_DgXh9mIhN7RK%0Bwi&D=^uTeaXzH}N$d?$663 zum(XyA%ZU6&f$6KW=`c0tBH%(jaNK5C~KK++Z8PU%i!CnRjwW#E~+2hgSfVdc@&sj zU_zQ8PY#DLb`Hk=PZNk$hiA$~Nd-p2PFi5=Q z&Ol_-_?nF9zrnws(7?^q`+;%K?Nv5__cD*7EaN@tHKoG6bX?aqxXVEIe0MJix321~LkmYMr|T z91^3-ZF9GkQGEdkDOToA)T^J#>71M)%dlC^>tZVBsjO;j^Xs_RQ%^@oZhO zM>eRW#jhmDlMI0hf#b~YEW^~uu0ee`-EY;_TZvIUq?GJIMfO{1E?sWJZ-^B@F@FX8RDN*TV!0v5`l~q1g zYTHp4D`Oekek)k&3hUyB9bFXBOMN4mnvcdmXKE4Y(9#I4>aIC+w9L#=ikG>DQVri_ z731Bb1key$T={ru)bh~Pc`52%K%`-bcPYL;rf)CGz}XkTS#fa= zUb`;xfXB@DB{(OOS$G_l_Q|>)vDeq?tqiFl zXRFQ8C5--PcqMKe`2OW7d{L*a;N0EfuKhqiYIRcF(!OZl^#x`IQZ_p zh-4AFKgJ5KV0*ON80(d2X=cN*|EdUntdI?F2BEJ#a9@6xKr|XcXxIN z?TqdAH~RyJ{02g5?mXDh~2TGwl?o)H5j2Aa|DB!1vo0VbhZaNd>uX1rgnEND-Zg6q^84Cu(P%2XN#8y{`bjRv9%;ZF(sr7lwbkFvhi^U5`8182nzy;Lz1`Q* z5+sr#{~!euA>Y*<=;)Dr2M+LYi9$|5P%8IH2QXV_s}yLJI*`NecKDln{4J#7+$MDd zxXEC_rvp9BDjy(7IFQiZ+2UulBoF%zcKdn)ogL`Y1Pj#+LjonO*awA#840W~kWx>e z-QRhzM=Eaz3n4ojrB#)cmG{y-ffn@TW~Q@8mC6Gh6=--bpKg1dR3Xt&fey25(iUh5 zbTCv@P`^M&7e*#dY_FTC#~74PwL$T=Mwpk|+_`ON1df!-o4SJcvX+DGT_p3=hVqiB z2gItm3-@>Xg8tS6zMx8W3wh3Oj*x;qo!!_;7W5tRr^cfEonssf`nr2eic&Q5eP3me zL^N!FxMJrcd${bexx6LWG?)-1x$NkC+K|^7dO3rF%Rr2;2m90QKj1rz@lx~fvQa6O zS4u0$s4tgRQKo~0VP}tuEuWRJ_U3~<{`M~FFFjQIh(raf8y40tmEX6jvcX_7uL)6!^ zQR?z_``Z2J+Xze8aWmu*%-GjyG{iI;bJVH03BeK15wVK}j0 z-JKo#4*1Dj5U#l$%8%iDU@oCM@DfWTA8gX%vu+d<W{L~@82SCTv<4BK~b>BpK z1~3g8UPSsPfX=L6B8>omPJWCuH4ddmD6R+?0Gt850{8(SiMm&x74YbaKim?En81(4 o)l_~*U}wT2`4H5MeP=PV{S>g!h5t#Fn5_i)%3i85{)mSE4Y>P_t^fc4 diff --git a/F1:F103/FX3U/fx3u.creator.user b/F1:F103/FX3U/fx3u.creator.user index 2796bd3..b9fc616 100644 --- a/F1:F103/FX3U/fx3u.creator.user +++ b/F1:F103/FX3U/fx3u.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F1:F103/FX3U/hardware.c b/F1:F103/FX3U/hardware.c index 1d1e6cd..d81ebce 100644 --- a/F1:F103/FX3U/hardware.c +++ b/F1:F103/FX3U/hardware.c @@ -22,23 +22,28 @@ #include "hardware.h" #ifdef EBUG #include "strfunc.h" +#include "uchar.h" #endif /* pinout: +Xn - inputs, Yn - outputs, ADCn - ADC inputs + | **Pin #** | **Pin name ** | **function** | **settings** | **comment ** | | --------- | ------------- | ------------ | ---------------------- | --------------------------------------- | -| 15 | PC0/adcin10 | ADC4 | ADC in | | -| 16 | PC1/adcin11 | ADC5 | ADC in | | +| 15 | PC0/adcin10 | ADC4 | ADC in | current in (0..20mA) | +| 16 | PC1/adcin11 | ADC5 | ADC in | current in | +| 17 | PC2/adcin12 | ADC6 | ADC in | right potentiometer | +| 18 | PC3/adcin13 | ADC7 | ADC in | left pot | | 23 | PA0 | Y3 | PPOUT | | -| 24 | PA1/adcin1 | ADC0 | ADC in | | +| 24 | PA1/adcin1 | ADC0 | ADC in | voltage in (up to 11V) | | 25 | PA2 | Y11 | PPOUT | | -| 26 | PA3/adcin3 | ADC1 | ADC in | | +| 26 | PA3/adcin3 | ADC1 | ADC in | voltage in (up to 11V) | | 31 | PA6 | Y10 | PPOUT | | | 32 | PA7 | Y7 | PPOUT | | -| 33 | PC4/adcin14 | ADC2 | ADC in | | -| 34 | PC5/adcin15 | ADC3 | ADC in | | -| 37 | PB2/boot1 | PROG SW | PUIN | | +| 33 | PC4/adcin14 | ADC2 | ADC in | voltage in | +| 34 | PC5/adcin15 | ADC3 | ADC in | current in | +| 37 | PB2/boot1 | PROG SW | PUIN | onboard switch "Prog" (X8!!!) | | 38 | PE7 | X14 | PUIN | | | 39 | PE8 | X15 | PUIN | | | 40 | PE9 | X12 | PUIN | | @@ -54,13 +59,15 @@ | 52 | PB13 | X0 | PUIN | | | 53 | PB14 | X1 | PUIN | | | 54 | PB15 | Y6 | PPOUT | | +| 57 | PD10 | LED | PPOUT | onboard LED "RUN" | | 59 | PD12 | Y5 | PPOUT | | +| 64 | PC7 | | (FLIN) | (Not now) extern 24V power detect | | 65 | PC8 | Y1 | PPOUT | | | 66 | PC9 | Y0 | PPOUT | | | 67 | PA8 | Y2 | PPOUT | | | 68 | PA9 | RS TX | AFPP | | | 69 | PA10 | RS RX | FLIN | | -| 76 | PA14/SWCLK | 485 DE * | (default) | (Not now) | +| 76 | PA14/SWCLK | 485 DE * | (default) | (Not now) RS-485 Data Enable | | 81 | PD0 | CAN RX | FLIN | | | 82 | PD1 | CAN TX | AFPP | | | 89 | PB3/JTDO | Y4 | PPOUT | | @@ -77,14 +84,14 @@ void gpio_setup(void){ AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE; GPIOA->CRL = CRL(0, CNF_PPOUTPUT|MODE_NORMAL) | CRL(1, CNF_ANALOG) | CRL(2, CNF_PPOUTPUT|MODE_NORMAL) | CRL(3, CNF_ANALOG) | CRL(6, CNF_PPOUTPUT|MODE_NORMAL) | CRL(7, CNF_PPOUTPUT|MODE_NORMAL); - GPIOA->CRH = 0; - GPIOB->CRL = CRL(2, CNF_PUDINPUT); + GPIOA->CRH = CRH(8, CNF_PPOUTPUT|MODE_NORMAL); + GPIOB->CRL = CRL(2, CNF_PUDINPUT) | CRL(3, CNF_PPOUTPUT|MODE_NORMAL); GPIOB->CRH = CRH(10, CNF_PUDINPUT) | CRH(11, CNF_PUDINPUT) | CRH(12, CNF_PUDINPUT) | CRH(13, CNF_PUDINPUT) | CRH(14, CNF_PUDINPUT) | CRH(15, CNF_PPOUTPUT|MODE_NORMAL); GPIOC-> CRL = CRL(0, CNF_ANALOG) | CRL(1, CNF_ANALOG) | CRL(4, CNF_ANALOG) | CRL(5, CNF_ANALOG); GPIOC->CRH = CRH(8, CNF_PPOUTPUT|MODE_NORMAL) | CRH(9, CNF_PPOUTPUT|MODE_NORMAL); GPIOD->CRL = 0; - GPIOD->CRH = CRH(12, CNF_PPOUTPUT|MODE_NORMAL); + GPIOD->CRH = CRH(10, CNF_PPOUTPUT|MODE_NORMAL) | CRH(12, CNF_PPOUTPUT|MODE_NORMAL); GPIOE->CRL = CRL(7, CNF_PUDINPUT); GPIOE->CRH = CRH(8, CNF_PUDINPUT) | CRH(9, CNF_PUDINPUT) | CRH(10, CNF_PUDINPUT) | CRH(11, CNF_PUDINPUT) | CRH(12, CNF_PUDINPUT) | CRH(13, CNF_PUDINPUT) | CRH(14, CNF_PUDINPUT) | CRH(15, CNF_PUDINPUT); @@ -92,7 +99,7 @@ void gpio_setup(void){ GPIOA->ODR = 0; GPIOB->ODR = (1<<2) | (1<<10) | (1<<11) | (1<<12) | (1<<13) | (1<<14); GPIOC->ODR = 0; - GPIOD->ODR = 0; + GPIOD->ODR = (1<<10); // turn off LED GPIOE->ODR = (1<<7) | (1<<8) | (1<<9) | (1<<10) | (1<<11) | (1<<12) | (1<<13) | (1<<14) | (1<<15); } @@ -125,9 +132,9 @@ static const pin_t IN[INMAX+1] = { // youbannye uskoglazye pidarasy! Ready to fu {GPIOB, 1<<10}, // X5 - PB10 {GPIOE, 1<<13}, // X6 - PE13 {GPIOE, 1<<14}, // X7 - PE14 - {NULL, 0}, // X8 - absent + {GPIOB, 1<<2}, // X8 - onboard switch {NULL, 0}, // X9 - absent - {GPIOE, 1<11}, // X10 - PE11 + {GPIOE, 1<<11}, // X10 - PE11 {GPIOE, 1<<12}, // X11 - PE12 {GPIOE, 1<<9}, // X12 - PE9 {GPIOE, 1<<10}, // X13 - PE10 @@ -160,6 +167,15 @@ uint32_t outchannels(){ return 0b110011111111; } +// turn on/off onboard LED; if onoff < 0 - return current state +uint8_t LED(int onoff){ + if(onoff > -1){ + if(onoff) pin_clear(LEDPORT, LEDPIN); + else pin_set(LEDPORT, LEDPIN); + } + return ((LEDPORT->IDR & LEDPIN) ? 0 : 1); // inverse! +} + /** * @brief set_relay - turn on/off relay `Nch` (if Nch > OUTMAX - all) * @param Nch - single relay channel No or >Ymax to set/reset all relays @@ -195,9 +211,12 @@ static int readpins(uint8_t Nch, const pin_t *pins, uint8_t max){ for(int i = max; i > -1; --i){ val <<= 1; int p = gpin(i); - if(p > -1) val |= gpin(i); + if(p == 1){ + //usart_send("pin"); usart_send(u2str(i)); usart_send("=1\n"); + val |= p; + } } -usart_send("readpins, val="); usart_send(i2str(val)); newline(); + //usart_send("readpins, val="); usart_send(i2str(val)); newline(); return val; } return gpin(Nch); @@ -227,7 +246,7 @@ static uint32_t lastET[INMAX+1] = {0}; // last changing time // anti-bouce process esw void proc_esw(){ uint32_t mask = 1, oldesw = ESW_ab_values; - for(uint8_t i = 0; i <= OUTMAX; ++i, mask <<= 1){ + for(uint8_t i = 0; i <= INMAX; ++i, mask <<= 1){ if(Tms - lastET[i] < the_conf.bouncetime) continue; if(NULL == IN[i].port) continue; uint32_t now = pin_read(IN[i].port, IN[i].pin); @@ -236,7 +255,7 @@ void proc_esw(){ lastET[i] = Tms; } if(oldesw != ESW_ab_values){ - usart_send("esw="); usart_send(u2str(ESW_ab_values)); newline(); + //usart_send("esw="); usart_send(u2str(ESW_ab_values)); newline(); CAN_message msg = {.ID = the_conf.CANIDout, .length = 8}; msg.data[0] = CMD_GETESW; *((uint32_t*)(&msg.data[4])) = ESW_ab_values; diff --git a/F1:F103/FX3U/hardware.h b/F1:F103/FX3U/hardware.h index 2024f45..8248f82 100644 --- a/F1:F103/FX3U/hardware.h +++ b/F1:F103/FX3U/hardware.h @@ -34,6 +34,10 @@ #define INMAX (15) #define OUTMAX (11) +// onboard LED - PD10 +#define LEDPORT GPIOD +#define LEDPIN (1<<10) + extern volatile uint32_t Tms; void gpio_setup(void); @@ -44,6 +48,7 @@ int get_esw(uint8_t Nch); void proc_esw(); uint32_t get_ab_esw(); +uint8_t LED(int onoff); uint32_t inchannels(); uint32_t outchannels(); int set_relay(uint8_t Nch, uint32_t val); diff --git a/F1:F103/FX3U/proto.c b/F1:F103/FX3U/proto.c index 14d12a9..cfc53d7 100644 --- a/F1:F103/FX3U/proto.c +++ b/F1:F103/FX3U/proto.c @@ -67,8 +67,10 @@ static const funcdescr funclist[] = { {"saveconf", CMD_SAVECONF, "save configuration"}, {"usartspeed", CMD_USARTSPEED, "get/set USART1 speed"}, {NULL, 0, "IN/OUT"}, + {"adc", CMD_ADCRAW, "get raw ADC values for given channel"}, {"esw", CMD_GETESW, "anti-bounce read inputs"}, {"eswnow", CMD_GETESWNOW, "read current inputs' state"}, + {"led", CMD_LED, "work with onboard LED"}, {"relay", CMD_RELAY, "get/set relay state (0 - off, 1 - on)"}, {NULL, 0, "Other commands"}, {"mcutemp", CMD_MCUTEMP, "get MCU temperature (*10degrC)"}, diff --git a/F1:F103/FX3U/version.inc b/F1:F103/FX3U/version.inc index 144ca8b..627e72b 100644 --- a/F1:F103/FX3U/version.inc +++ b/F1:F103/FX3U/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "50" -#define BUILD_DATE "2024-06-03" +#define BUILD_NUMBER "56" +#define BUILD_DATE "2024-06-04"