From 013a0b041c1061965a28498b3a0d580f5cea350f Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 16 Jul 2026 22:42:30 +0300 Subject: [PATCH] fixed some bugs --- G4:G431/blink/Makefile | 1 + G4:G431/blink/blink.bin | Bin 1140 -> 1288 bytes G4:G431/blink/systick_blink.c | 1 + G4:G431/usart_full_DMA/blink.bin | Bin 3060 -> 3076 bytes G4:G431/usart_full_DMA/main.c | 16 +++++------- G4:G431/usart_full_DMA/ringbuffer.c | 28 ++++++++++---------- G4:G431/usart_full_DMA/ringbuffer.h | 2 +- G4:G431/usart_full_DMA/usart.c | 38 ++++++++++++++++++---------- G4:G431/usart_full_DMA/usart.h | 3 ++- 9 files changed, 50 insertions(+), 39 deletions(-) diff --git a/G4:G431/blink/Makefile b/G4:G431/blink/Makefile index 610b9e9..d445eb8 100644 --- a/G4:G431/blink/Makefile +++ b/G4:G431/blink/Makefile @@ -1,4 +1,5 @@ BINARY := blink +PREFIX := /usr/bin/arm-none-eabi # MCU code MCU := G431xx # change this linking script depending on particular MCU model, diff --git a/G4:G431/blink/blink.bin b/G4:G431/blink/blink.bin index 3d95fa34837e11247d119a499b7dbf62579a41ce..63757c6e758a8e20c1383f13a76da3a3da5b4ee6 100755 GIT binary patch literal 1288 zcmb_b?@JSL7=P}^+T64)&tNQH%q@D6Lc@VjzBz7Fw>xd3*$)jlf7MBtBcT^Tcol(Y zU^-t2tEm13@m;a3H$f27ZIA`JUa3KFV;9_MxV~R)az#bI4j!K8`#hh|=XvgX&w&i? z4FW9i7tb={wUGaAxb^?g`BRPJD`TE<24nmqO(U;ZFXn#be}*mg{~c~o!^rtQ#%Gde zB*M>#(I!aH0Pb?05n`NWi8!(3@+cJP2-CIBMo{W?J8%D{Lf1kSt{l;=LPU*{FSIc? zBog_^WFkL23CeyA>!DfQvZD9uW%k~8nnqtHWgr=wo#d9Jh`T56Nls8^N)X(MQ z(UPTzlJy)5wf888&0bmavQs@w&#Lw?Tiv{(IegV&@Wknv#)vBKizuwAB2%dl_M^$y znzQwkRs%LE?z+WorAl)|>608|KbW*im=~u%q*t^GpObzU096J`VJRwrSU${{`?NW_ znc7&}#WE_KUr(YLOHo}+p>GQglHD%Y0iwV%9YBDaWYH$Dco$5q;Fh`^F~~ew@v||-cW%Ih0t`e1Nt7V-~7D%yzKq#kn7HE=bO-S*9|DY G244W)_c*5j literal 1140 zcmbtR-)qxQ6h1e}Na+SEcFGzBQ#(-D9%Pdh^d-%-Ta(qe!3LWsX@4D0Y!49tf) zCS!u5c7K8oKInUjGVsx@?SqP};KM{ZxX=jc2CMg0GlHnd7C3z8$M>CcZVs3ren#Mf zBYa5)d>@GRxJE}Gx5rWR?vtt3yMx#NQ(v#nt-HB@;orFK{QuFqJ-nLVeHtI^fORr) zN_{SOY@sVRg)Sw6S(Y0JULAM1_875(+}I2#0kt6e31eMw>kyV5?sP%k-}I}RonziQ ziy~N7U0bp0cUJ&+Ib=_f+I_C|-$ahayHI76pn(R0dTtmjTF+j9)JhHp>+Bl9Lx@ zjL1v#BK6mJUpd;+a%5AI2`uwYrC%9TSLX(k(UIurwo@xcwdnPjZQfhWgp4q*qL4mC zF*VgfX)K1#v7bK8g^U>131`b$ycogKoi_xzNNENl8iw?S14SJErqAlbI)DC=6A3Kn zye`Dg#Cx-66M0Uv%?=Gq{E5mJe$wfIQR`)D!|5)z8|%V?ykA0>f_**0|7=lXm$eRKnhL(0+Er(1toILkw6uy^p>4@ m1}^-%Z*#j@??V6&$WdpAdGQ^IZ<89$dy(e7JXiOX1^5Bf#w4Wx diff --git a/G4:G431/blink/systick_blink.c b/G4:G431/blink/systick_blink.c index 7e05428..246b381 100644 --- a/G4:G431/blink/systick_blink.c +++ b/G4:G431/blink/systick_blink.c @@ -38,6 +38,7 @@ void sys_tick_handler(void){ static void gpio_setup(void){ RCC->AHB2ENR = RCC_AHB2ENR_GPIOCEN; // enable PC + __DSB(); // set PC6 as push-pull output, PC13 is pulldown input, other as default (AIN) GPIOC->MODER = (0xffffffff & ~(GPIO_MODER_MODE6 | GPIO_MODER_MODE13)) | MODER_O(6) | MODER_I(13); GPIOC->PUPDR = PUPD_PD(13); // pulldown diff --git a/G4:G431/usart_full_DMA/blink.bin b/G4:G431/usart_full_DMA/blink.bin index fd6bd69e7d0b7c05653d3ddeecf7d0465d2aeaa7..75548c9460c64e116b2d1a7a23d297c9298d6a56 100755 GIT binary patch delta 1474 zcmXw2eM}Q)7=Q2DYp;b_&?xm3X?trdoE??U8N|eLlv`WGnrP-9?xUdDE`EhE*KN9R zhvGh1oZvARA%4upN&G`ZWrh)RZbK!yWrg7v+DS%2tsUDTAH50n_7?R`p7(j~x#xM` z_xC)%XFRLUhyxy&ycob6GpRWbQJZ14!AI5rb7Np@r%F;VU;^gum>NOI zzu4m}8O&vXG<(__6b4W?(j(-kHXzr9k5u{D=cYnzC0phW1wyPqqxV8=3lR#GGqI@L zF<2MOy_Gh->q<&k5w8g zGb>vx?^fBEfeQJOU{VvDH*8=)E)xcMbD5GzIEF4|*u(S>;uvv**l2uAAbDzLX$1Wg zl@!q2RlVpB0#JSlK`lG;B1h;}F`Eez9khvUWm?6v4DP0xLWrqws)N=fC#D9ca<(uu^_Oklz?W@lTg2tKkz3(Ua3xJW9O*b}+WBvmnFS#}33kea;{KBJaGy(tk zKNaUjd9Jup*XNf8&63GiaoD#`uOx0JGuoZ(RXM%j?Xp`k z&PUiQ6a0rAaUAoA7_@-BD9qW>`{c)fdM&ITO$TW`UqN0K6B{9~=tb+=%{7Rmq=Q_S zR8-qXAS4;AlZ}_Zp|QwQI~dEZ1$jhdE`z~`dVMP4`~=UTT#8DMhj_-52YcL?+()Zg zfCOrR4U4$kiVeAYe1fk!8+dQ5ST|on4evbpa>6D3$UoA8(er$NO#S)mrCs9C3}a5k zajjwm`8&d7&CF;*+^2bj%=eH%CDA&aLj4`jm-fJTFp6N1%GjGd;)oHDM`$wW8f)S? zd#lJTv)*ZgJ4nyUd;K*(YaID~aEdghxqSPZ~WyipvgngKQ|! zQ~BX}&?_dXL1CqCwZV-7QvlL!8x$vt2*2YwTuKkf8IBfp=FP5AU|1J+vZw%uFzwDT zY{*(CdrMBYv=BOK)ugIT8%@RFshH*#!bWkESI;=$6>lZ|5=aw=UxD_9q$g^JdR?+O zY7Nc+KmpYW0o3G^K}+yLgtJygdnWj5t4GBhR1zc8s^&d3H@=|lWE{oK-W(6G(o9D{ zNeoW&rRrX%@!l>yg^SiIVB-=QZHjHxq`plb&4QPhlc%Cicj`YkK6M7peN|#uNj#l; zR`!jZ$40cf5wbsqqPa}nh@A!lDySH4Ykc*jOcJYN@KRfzlv!ZYa%tTTfT-|Co@#r)A#omnyf2Pg*AJ*_% AlK=n! delta 1512 zcmX|B4{Q@v7=Q1s*Iu`=KY*+pWcCkR3T06KL}XK`*Y?t`EJcXHpoCsQxPd4PHQ*9^ zV@P1eu%5C(*#KnXIe{Asc>%J9lMdbpMI4aAqc@4Ni+eZPC} z_kG{nq)Qi*fCu_%1R$G>EX{gt^J`WJ53hD(6Y}Tgd)jM&vDLTuIM4&bnO+ryrn}rX zT!@{>04Z;%ofZDV9Pol*!WY6bLLEL8b_xgaaj;l8hnp&TR)Q&gmq&Q>UC`uB^R=^? zxL?Tx6=3f1--&5GIaRHO8?4Q+*RS&z`GdygYs^eHE1v|SFj++foRIhl1 zI04F@171maC6xeTd9Q3&BQnDvd8EiYviiCVnp8~H;{#^R?Fp3HF(y*Ug_2raWhwe2 z*Y&#$cq227Q8GIe`}kA@m>*nLGH)v{V)|~JyeBuz1V~^ju#HE4WYs8-K$BO5c|;++ zDX_#?cvh$*4C+(4fOKetHsZ6=g~XF+v77Q-^yPAPiC>qCd=P4)qdf37ti&Tg%;9zj zZ>nd(J;DZc>4@zb`C6yD)6=-RbMAM-LG_Gj`>KAGw*bOqTzYYt*zeu8$8B1*r)p32 z2w&SEKEFllmB9O#d|s)^1}i{mwQrYDpecTHd(}qS1T@C4*c^6?yScjYgJ$n7d2$;q z5m@6g^22Ra_yB8fAH)~f(!7maJ}%EI>3vsyjn(sfr}Ry}t-=aTc_5hm+ye}HBi6jg z=S>4Yg)Bdx@_osG=4h|B0T}JhH#StPJs}!bwxLpmk|Z9~o$a>~XZv|AumI^>KE4tP zz+#iycxYVZx{La%A`8qgc3aAubn)Iro90K4nA^*8cLAaf^Mc({@~ zC+AIH6eQ1r7VyGYDy*iP%#M=r5@UWcR!sqGX;7!B#xDkq)Fw!mU)9`(@WK`VgVR*yu2N1=gIC$^T0; zCtVmuI%$g&;}M%VJ15c3hH6#-OCYTeL*ud3(}FfO#0D~B!%FGygp$z?wbv{@zPFF8 zgQjRNhD~HP^{MJYERZO)zZ5zTr7P2`% yR{Wha<^17K&-++;{q`kS`ZkTMEt|DWQ34P#z+r=yg8+JfJ^y}T9k}o?cg(+Ep>Z7m diff --git a/G4:G431/usart_full_DMA/main.c b/G4:G431/usart_full_DMA/main.c index e85bf9f..4c0a5dc 100644 --- a/G4:G431/usart_full_DMA/main.c +++ b/G4:G431/usart_full_DMA/main.c @@ -35,15 +35,13 @@ int main(void){ USART_flags_t f = usart_process(); if(f.rxovrfl) usart_sendstr("Rx buffer overflow!\n"); if(f.txerr) usart_sendstr("Tx error!\n"); - if(f.gotstring){ - char *str = usart_getline(); - if(str){ - usart_sendstr("Received:\n"); - usart_sendstr(str); - int l = strlen(str); - if(str[l-1] != '\n'){ - usart_sendstr("\n(only part of line)\n"); - } + char *str = usart_getline(); + if(str){ + usart_sendstr("Received:\n"); + usart_sendstr(str); + int l = strlen(str); + if(str[l-1] != '\n'){ + usart_sendstr("\n(only part of line)\n"); } } if(Tms - Tblink > 499){ diff --git a/G4:G431/usart_full_DMA/ringbuffer.c b/G4:G431/usart_full_DMA/ringbuffer.c index 9683f6c..5e28ee0 100644 --- a/G4:G431/usart_full_DMA/ringbuffer.c +++ b/G4:G431/usart_full_DMA/ringbuffer.c @@ -31,9 +31,9 @@ int RB_datalen(ringbuffer *b){ CHK(b); if(0 == datalen(b)) return 0; // don't block for empty RO operations if(b->busy) return -1; - b->busy = 1; + b->busy = true; int l = datalen(b); - b->busy = 0; + b->busy = false; return l; } @@ -59,9 +59,9 @@ static int hasbyte(ringbuffer *b, uint8_t byte){ int RB_hasbyte(ringbuffer *b, uint8_t byte){ CHK(b); if(b->busy) return -1; - b->busy = 1; + b->busy = true; int ret = hasbyte(b, byte); - b->busy = 0; + b->busy = false; return ret; } @@ -100,9 +100,9 @@ int RB_read(ringbuffer *b, uint8_t *s, int len){ if(!s || len < 1) return -1; if(0 == datalen(b)) return 0; if(b->busy) return -1; - b->busy = 1; + b->busy = true; int r = read(b, s, len); - b->busy = 0; + b->busy = false; return r; } @@ -136,14 +136,14 @@ int RB_readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){ if(!s || len < 1) return -1; if(0 == datalen(b)) return 0; if(b->busy) return -1; - b->busy = 1; + b->busy = true; int n = 0; if(s && len > 0){ n = readto(b, byte, s, len); }else{ incr(b, &b->head, lento(b, byte)); // just throw data out } - b->busy = 0; + b->busy = false; return n; } @@ -151,9 +151,9 @@ int RB_datalento(ringbuffer *b, uint8_t byte){ CHK(b); if(0 == datalen(b)) return 0; if(b->busy) return -1; - b->busy = 1; + b->busy = true; int n = lento(b, byte); - b->busy = 0; + b->busy = false; return n; } @@ -184,9 +184,9 @@ int RB_write(ringbuffer *b, const uint8_t *str, int l){ if(!str || l < 1) return -1; if(b->length - datalen(b) < 2) return 0; if(b->busy) return -1; - b->busy = 1; + b->busy = true; int w = write(b, str, l); - b->busy = 0; + b->busy = false; return w; } @@ -194,10 +194,10 @@ int RB_write(ringbuffer *b, const uint8_t *str, int l){ int RB_clearbuf(ringbuffer *b){ CHK(b); if(b->busy) return -1; - b->busy = 1; + b->busy = true; b->head = 0; b->tail = 0; memset(b->data, 0, b->length); - b->busy = 0; + b->busy = false; return 1; } diff --git a/G4:G431/usart_full_DMA/ringbuffer.h b/G4:G431/usart_full_DMA/ringbuffer.h index f9e1e64..fd859bd 100644 --- a/G4:G431/usart_full_DMA/ringbuffer.h +++ b/G4:G431/usart_full_DMA/ringbuffer.h @@ -24,7 +24,7 @@ typedef struct{ const int length; // its length int head; // head index int tail; // tail index - volatile int busy; // == TRUE if buffer is busy now + volatile bool busy; // == TRUE if buffer is busy now } ringbuffer; int RB_read(ringbuffer *b, uint8_t *s, int len); diff --git a/G4:G431/usart_full_DMA/usart.c b/G4:G431/usart_full_DMA/usart.c index 0c4cbf7..94a72d8 100644 --- a/G4:G431/usart_full_DMA/usart.c +++ b/G4:G431/usart_full_DMA/usart.c @@ -121,7 +121,7 @@ void usart_setup(uint32_t speed){ /** * @brief usart_sendbuf - send next data portion - * @return TRUE if sent something + * @return true if sent something */ static bool usart_sendbuf(){ if(!txrdy) return false; @@ -148,6 +148,7 @@ int usart_send(const char *str, int len){ if(put < 0) continue; // busy else if(put == 0){ usart_sendbuf(); // no place + t = Tms; }else{ len -= put; sent += put; @@ -162,6 +163,11 @@ int usart_sendstr(const char *str){ return usart_send(str, l); } +static void addtoreadidx(int adder){ + dma_read_idx += adder; + if(dma_read_idx >= USARTRXDMABUFSZ) dma_read_idx -= USARTRXDMABUFSZ; +} + // return current flags USART_flags_t usart_process(){ static uint32_t Tlast = 0; @@ -178,7 +184,6 @@ USART_flags_t usart_process(){ // add next data portion to RX ring buffer if(available >= (USARTRXDMABUFSZ / 2) || gotstring){ // copy data in one or two chunks (wrap handling) - bool wrOK = false; // check if we can write to RB `available` bytes int rballow = RxRB.length - 1 - RB_datalen(&RxRB); if(rballow < available){ @@ -192,30 +197,35 @@ USART_flags_t usart_process(){ available = rballow; // read at least as we can } if(dma_read_idx + available <= USARTRXDMABUFSZ){ // head before tail - if(available == RB_write(&RxRB, &dmarxbuf[dma_read_idx], available)) wrOK = true; + int written = RB_write(&RxRB, &dmarxbuf[dma_read_idx], available); + if(written == available && dmarxbuf[dma_read_idx+available-1] == '\n') gotstring = 0; + if(written > 0) addtoreadidx(written); }else{ // head after tail - two chunks int first = USARTRXDMABUFSZ - dma_read_idx; - if((first == RB_write(&RxRB, &dmarxbuf[dma_read_idx], first)) && - (available - first) == RB_write(&RxRB, dmarxbuf, available - first)) wrOK = true; - } - if(wrOK){ - gotstring = 0; - dma_read_idx = write_idx; // update read pointer + int written = RB_write(&RxRB, &dmarxbuf[dma_read_idx], first); + if(written != first){ // could write only part - just increase read index + if(written > 0) addtoreadidx(written); + }else{ + dma_read_idx = 0; + int last = available - first; + written = RB_write(&RxRB, dmarxbuf, last); + if(written == last && dmarxbuf[last-1] == '\n') gotstring = 0; + if(written > 0) addtoreadidx(written); + } } } - if(RB_hasbyte(&RxRB, '\n')) flags.gotstring = 1; return flags; } char *usart_getline(){ - static char buff[256]; + static char buff[MAX_INPLEN]; int l = RB_datalento(&RxRB, '\n'); if(l < 1){ l = RB_datalen(&RxRB); // Rx ringbuffer could be near overflow but without '\n' - if(l < 255) return NULL; // allow to wait for last symbols + if(l < MAX_INPLEN-1) return NULL; // allow to wait for last symbols } - if(l > 255){ // overflow -> read at least part of the string - l = 255; + if(l > MAX_INPLEN-1){ // overflow -> read at least part of the string + l = MAX_INPLEN-1; } if(l != RB_read(&RxRB, (uint8_t*)buff, l)) return NULL; buff[l] = 0; // return with '\n' at end of line (so user can detect non-finished overflowed lines) diff --git a/G4:G431/usart_full_DMA/usart.h b/G4:G431/usart_full_DMA/usart.h index c65d1fa..2152af0 100644 --- a/G4:G431/usart_full_DMA/usart.h +++ b/G4:G431/usart_full_DMA/usart.h @@ -20,6 +20,8 @@ #include +// maximal length of input string (including '\n' and terminating zero) +#define MAX_INPLEN (128) // Rx/Tx ring buffer size #define USARTTXBUFSZ (512) #define USARTRXBUFSZ (512) @@ -36,7 +38,6 @@ typedef union{ struct{ uint8_t txerr : 1; // transmit error uint8_t rxovrfl : 1; // receive buffer overflow - uint8_t gotstring : 1; // have new string in buffer }; uint8_t all; } USART_flags_t;