From b8f3e5a69526cd5dbe7297dd31587d2e83fd28ee Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Wed, 29 Jul 2026 23:06:36 +0300 Subject: [PATCH] throw out interrupts --- G4:G431/Servo/hardware.c | 18 ++---------------- G4:G431/Servo/hardware.h | 1 - G4:G431/Servo/servo.bin | Bin 9092 -> 9124 bytes G4:G431/Servo/servo.c | 19 ++++++++++++++++--- G4:G431/Servo/version.inc | 2 +- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/G4:G431/Servo/hardware.c b/G4:G431/Servo/hardware.c index b9b9bb1..578ec1c 100644 --- a/G4:G431/Servo/hardware.c +++ b/G4:G431/Servo/hardware.c @@ -23,7 +23,6 @@ #include "servo.h" volatile uint32_t Tms = 0; -volatile bool tim_triggered[SERVO_AMOUNT]; /* Called when systick fires */ void sys_tick_handler(){ @@ -65,18 +64,14 @@ static void tim3_setup(){ TIM3->CCR2 = the_conf.startpulse[1]; TIM3->CCR3 = the_conf.startpulse[2]; TIM3->CCR4 = the_conf.startpulse[3]; - // enable CCx interrupts - TIM3->DIER = TIM_DIER_CC1IE | TIM_DIER_CC2IE | TIM_DIER_CC3IE | TIM_DIER_CC4IE; - // enable main output - //TIM3->BDTR |= TIM_BDTR_MOE; + // enable main output (don't need for TIM3) + //TIMx->BDTR |= TIM_BDTR_MOE; // enable PWM output TIM3->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E |TIM_CCER_CC3E | TIM_CCER_CC4E; // enable timer & ARR buffering TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; // update buffers TIM3->EGR = TIM_EGR_UG; - // and enable interrupt - NVIC_EnableIRQ(TIM3_IRQn); } // TIM3 channels: 1 - PA6 (AF2), 2 - PA7 (AF2), 3 - PB0 (AF2), 4 - PB1 (AF2) @@ -99,12 +94,3 @@ void gpio_setup(){ SysTick_Config(SysFreq / 1000); // arg should be < 0xffffff tim3_setup(); } - -// update event flags -void tim3_isr(){ - if(TIM3->SR & TIM_SR_CC1IF) tim_triggered[0] = true; - if(TIM3->SR & TIM_SR_CC2IF) tim_triggered[1] = true; - if(TIM3->SR & TIM_SR_CC3IF) tim_triggered[2] = true; - if(TIM3->SR & TIM_SR_CC4IF) tim_triggered[3] = true; - TIM3->SR = 0; -} diff --git a/G4:G431/Servo/hardware.h b/G4:G431/Servo/hardware.h index 5dee284..7e0b65b 100644 --- a/G4:G431/Servo/hardware.h +++ b/G4:G431/Servo/hardware.h @@ -35,7 +35,6 @@ #define MAX_USART_SPEED 3000000 extern volatile uint32_t Tms; -extern volatile bool tim_triggered[SERVO_AMOUNT]; void gpio_setup(); diff --git a/G4:G431/Servo/servo.bin b/G4:G431/Servo/servo.bin index 0aaa07a1c089731d65222a2b35840b36ceefae78..d3b6ec623c9053cd4f9164834c789e3b48567e0c 100755 GIT binary patch delta 2870 zcmb7_4^&gv9mnr|FOR%PpkVluKY$@mB$!eWT(QM!2qXl8#lM|OtqHX@Oslxo%yLb{h_9PZNmd1=Q^K0<(6fJ*P{~ zC-=Vl`~Lpi`+hI4zHDC^i`+=t9)sA%L_?!i#$U#WHB&#FV>DuA-=RnF`G4Y!Y5DI> z-v0v&6BCOcG2nm4|DAtVVNoX(`%u+nEmkyYlbEPlyujwsrG%%xKfpJMA5KnHD4e)J zVXrGg-X@Yu8Pk4V;>WaNEoE!fEwNLFMFT>V5uCJ5ov%^3xTw*-vWxad7^Fp+r~4%s zb6+@Hot!Jjg8gOpvRqP|w0!@>s-U~>UEMBwuYIwj**^W_XaEwRAB%?!6l4h86yrit zi5W-8%aSShCTWud6szwZGsRrfI^P~(Dd_-o!n!%f5-a~2;ZaZ;6G z_sBR~Rj`iwldx5byxyUz9p0feJCI*D+yvE%2@^QP&X9_g&y^Z59oNee51TrrVLWV0 zJGwP6f{@m;y*Wo18$Dp8JB5b)ST`2!QB4y$!{%To`I^;Cb>=;6iKeJP+$NzdU*DAn zRPsW+o6MDG#WhHUOYO7U zZ3kXzFYh3m<%L;q*|-&v&|mIKGy9i|C%va)k2S$w+?-3szDPm%|qiCMK$CRL)mtV{NhDgH`rL4zjAm z&(LIf;_4pZNwnTp9CQ~auF$Qn@@pN`z#Qu6h=1@i`zhUGd$YY+cgs;{b=K_H9k8z{ z&v7VqX9T2IWtI-cQD+2+QVn%Q^3^qwP;l63Lz!9~)40T56+|^)3A*`tYWr&zNn=mH zY(CPxXKE27_HBYh`=M9&lX;qIO^dS7^5-FA3^E}9bDk#Q(LCsR78#8GAA2yj&{_{G zk9zre?)J7Qu>lT;0+rS{G}99aJvpL0az#LS=LC6vvF(b$ zv+iroGq>IAjt#Jk)yu#P<<9W&xztr|Ju(#fBmp^!?cQcO?k!eVtE-i!jQK}0H)4N8 zj&h9t*FAq#V~%sx3(8XmOw4EZbJ5UR51OpGmTX}LSo*OFOgeA7c?zB&G&s#;uuir_ zLXVGZG2s^EU*JLW^fA|rr4c>8+hjX~=#$1Y(b45ZY!s00mk)lWPc|;k}bZpcE69IGsT~C7t ztQCO2z39XCOE|25IN`9Ew+CXFZtqu0#O*e5F5}QgZa#Ovm(PkOiD~J=+@|u)kV33| z=I|ENB$w>s($ZJUdFvJ-p$7R6-eZqMLeh~YVR>H3ksiUM<$Hvg38(wj;}KU6i!Ph1 zLR0IiqKM1-Gibe_=Yk+_*c;F>aChSIZ}A({n{x%pO59jzQaLkxM+J0h!muZN-kjn) zETGm80_c%M-+6PnW!dGqr4I9cufuXoKnBVc1?hg<|;+tQgsO4_O(+Y>!29o9$b?5D2UjDav<+fV2Vn~%A%NqKit=!`E6+y0RQOgXo?tIYU?GtspY*Yy0 z^#=aVhK?E5NND{q>{hm}@7;lM*kL{id)R%m5Y|@>3w@8n=o}98Wx1ketCor@36Kg4HEzuA4;{nJb<-Wds@VcfjQ#0Nj=XjkjY)2tAgoos>raYsUf;Vrx= z=3?vsqObg7oPqV$3-A`#^P!JBBKlc(j&~gIOM`S%hu^qaT`DU0;5!|N0@EP+lBr1=Qm>eVmq%5rqpDR=)zWXNimBc(IjG2>u7}Bag$}c#h6;yC zd{V|(sBls)B*;!qmx-ap7teMwJ2@MlCF_z6IGMZ!zp3Oxa!!#mOk0$e)-s1p<9y!w zyRv1rG-nOWmGC6E$81aB`Z=&I0^3rUQ$?cHMy95u;~AtXWddw(O-hzVHKu<8G$zm& zf_@|#Nlp%>WTy$jXs#Tv7l1wcfqg(AgDI0Ve;*SlLBN3^<$>T6QjnUBkCW=u+^G$j zh@B2wYK3tcj0a)NgYhJc-GI2|9vH6z{{*&^u2ctphG>*oW5;7w)?z40$w}^q!jXs1 zO?e4#AfKwT;WZpmWsb?y)i1{RABp24Dp?09%13U>9&2@Bv=}0+66ZtP(H+ zmB1^28#oA@1il1)$y-0wE+S+Maq;wi%FObZWtN%+;+g zw5Ziu4O~y>Kv(Afxz>qTr>mZL=5gB9?tqdVDKg#Z1~O**fB=txX1|Bnx*a`ddpVzX z@9*C4@6WyWurclpGmmNIX3E~AUFD!oiy082jF4U9ZpouEFm5BS(y=(6yi3PpH~BT4 z83H~O`1JRPN(e(2U@y^2vhXERBI#G=kAG~Eb!nVO`xr{z$6(AaAgiSd@pN)fx*9?} zlwON{XKb2nnw^-Kn|S_BwU(zTNj6GSSup<^xhsoSCi}&8idFcui206OtVSW%zd^@s?SKB5teIqnPj)5V3}#GIV|i8hw?RmSUf=MnA_>iQajyeq+5i2*+DKW&Wd>4 zC@E0nVt30n#qY3KG|DN;=yh3xoGkBp zZQJP}N09RXmV2}8_#R$Bw<6CJXFVQmpI#K?H2YjR;{1ME-k$c<{Lcv&6!SufRPK%Y zX4JOsW$9>pbdlQr8F-i>w&?jwEN@qSqnYA#lh1?Z-~&V&oHDguE_j<4H``BcY%V%O z<^<2-j@sFZz{s_6c~Wn=XRvthA=@Eqr~{VgXob7mj5JFfAK28;XI@m775ly_TUGWd zFQu*sC|Rq$B50D?P5W(!#%Q)tffuy&yEx`%F@I0Xr@T~3>~9O~Qg>-s=?)v&C_Y={ z6*0#i`&~hE#xm^0zaS5SSuP=|!;v=-78X+$<8&>~<7+V1#5h)zLKQFR9c05#i_E-~ zCgsXa?ZSKnJ7iW?u$$<}KTvJ|6I7>hT-I70yBrPLFG@GtR+XL5HaMzm>QWWd zh;%Vy^6QZ z1?N55^;vIh6PTuRo5cr18q6-Y*1||& zB+HLipx7 ztNL6YBeQyB&_kIETDeT>4!Z^EXOoPOMDF`FH`SPBt7`?-<@Zg}u1A?@Ft-LxS9e8O zWDtI)jV3KaE{=k4C>oH~WLmQ=P|nzP6Wxe-Z4J^%yNvk(9qwova#h}UtR2i##PHO# z)&8BsM*fa#P>%Y&uJ&HZj>3XZJYPD+l8^T>@_-6uIa*oun@?7I!-d&sD_b2H`Dj#J z>lJc0B%Avix`*asqxc5VL7NPSU!6Fh34nL6M%G?y;fAxN5L3ra^tL8&FY^#{ds1ZCxqn=1+~<`;HU6rAu> zSmf_CpV@1Y+?Ma$YtniCAj~SqITAhUr;xWz@5Bv_>Xsot7ksNzh%l%noo34CqG;Yo zE6tw?Dg!7;rx0pT`p|0B7|OLG{qk15lOmW!0BX zJcQNhx#5$i=34_J2mJ`thr2(G-D5iM39)?KGaE+h{i!`KK)c7E*ppg4u_qML?`*^D zn^|nNwz{^9OI_b{eaN*r*-F<3Ms$9l8iXsTEKY(s3hSoeJo3hwno{36SJ_{v$p5d{M#qI!=iiZ+Bp1-snVHS;>VD9w@eA zw!N34W?E_=NVc-oh%b4RT8+~_?WQb8yOHO&gYcgr2i|t#b%c6+)?HG>Sm4adfn*xa zJ^?Z1z#^at#wwvDC&FwLHBNkCFXBIw!f-QQPTmb)gAb9f!xQm`WSWx2eln(v$9-g( zGLhLW`Xzzi>2MWsD^u~F3E}<;;rkQ99imV=AtVbU@-Q`_m@=Wro=~t)DWs7ZY5q~# zqOvpTO7b1qrjm*&Eclo&~Tj4R2?$TZwfY9jSGmwW{GJkk-F9$!D{ zT?*c7z>_EZl*!FnrdlVKq+%t35mq4Th=j=rX^a;iBb_m6xSr7J zq{-2A_1dZJ5NIj4. */ +#include #include #include "flash.h" @@ -26,10 +27,21 @@ static uint16_t servo_tagpos[SERVO_AMOUNT] = {SG90_MIDPULSE, SG90_MIDPULSE, SG90 static uint16_t servo_speed[SERVO_AMOUNT] = {0, 0, 0, 0}; void process_servo(){ + static bool notinited = true; +#if SERVO_AMOUNT != 4 +#error "Add timers' variables" +#endif + static const uint32_t trgflags[SERVO_AMOUNT] = {TIM_SR_CC1IF, TIM_SR_CC2IF, TIM_SR_CC3IF, TIM_SR_CC4IF}; + if(notinited){ // init tagpos with starting values from settings at first run + for(int i = 0; i < SERVO_AMOUNT; ++i) servo_tagpos[i] = the_conf.startpulse[i]; + notinited = false; + } + uint32_t sr = TIM3->SR; + uint32_t clear_mask = 0; for(uint8_t i = 0; i < SERVO_AMOUNT; ++i){ uint16_t curpos; - if(!get_servo(i, &curpos) || !tim_triggered[i]) continue; - tim_triggered[i] = false; + if(!get_servo(i, &curpos) || !(sr & trgflags[i])) continue; + clear_mask |= trgflags[i]; if(servo_tagpos[i] == curpos || servo_speed[i] < 1) continue; int32_t newpos = curpos; if(servo_tagpos[i] > curpos){ @@ -41,12 +53,13 @@ void process_servo(){ } set_servo(i, (uint16_t) newpos); } + if(clear_mask) TIM3->SR &= ~clear_mask; } // set speed in steps per tick bool servo_set_speed(uint8_t N, uint16_t s){ if(N >= SERVO_AMOUNT) return false; - if(s < 1 || s > the_conf.maxspeed[N]) return false; + if(s > the_conf.maxspeed[N]) return false; // let s==0: this will allow to stop mowing to tagpos servo_speed[N] = s; return true; } diff --git a/G4:G431/Servo/version.inc b/G4:G431/Servo/version.inc index df3da95..aa08bfc 100644 --- a/G4:G431/Servo/version.inc +++ b/G4:G431/Servo/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "16" +#define BUILD_NUMBER "28" #define BUILD_DATE "2026-07-29"