From 402a461031373b911d6218e37c37396c1293eee5 Mon Sep 17 00:00:00 2001 From: Thomas Roell Date: Tue, 7 Feb 2017 17:59:02 -0700 Subject: [PATCH] Rework stm32l4_servo.c to use the EVENT_PERIOD to sequence throu the timeout --- libraries/Servo/src/Servo.cpp | 10 +- libraries/Servo/src/Servo.h | 8 +- system/STM32L4xx/Include/stm32l4_servo.h | 22 ++-- system/STM32L4xx/Include/stm32l4_timer.h | 1 + system/STM32L4xx/Lib/libstm32l432.a | Bin 1132992 -> 1133726 bytes system/STM32L4xx/Lib/libstm32l433.a | Bin 1198452 -> 1199186 bytes system/STM32L4xx/Lib/libstm32l476.a | Bin 1301692 -> 1302420 bytes system/STM32L4xx/Source/stm32l4_servo.c | 136 ++++++++--------------- system/STM32L4xx/Source/stm32l4_timer.c | 28 +++++ 9 files changed, 93 insertions(+), 112 deletions(-) diff --git a/libraries/Servo/src/Servo.cpp b/libraries/Servo/src/Servo.cpp index 4ad653cd..5ea8e60b 100644 --- a/libraries/Servo/src/Servo.cpp +++ b/libraries/Servo/src/Servo.cpp @@ -79,7 +79,7 @@ uint8_t Servo::attach(int pin, int min, int max) pinMode(pin, OUTPUT); ServoTable.slot[this->servoIndex].pin = g_APinDescription[pin].pin; - + this->min = min; this->max = max; @@ -138,12 +138,12 @@ void Servo::writeMicroseconds(int width) return; } - if (width < SERVO_PULSE_MIN) { - width = SERVO_PULSE_MIN; + if (width < this->min) { + width = this->min; } - if (width > SERVO_PULSE_MAX) { - width = SERVO_PULSE_MAX; + if (width > this->max) { + width = this->max; } ServoTable.slot[this->servoIndex].width = width; diff --git a/libraries/Servo/src/Servo.h b/libraries/Servo/src/Servo.h index 6d1e172b..1f56fbd8 100644 --- a/libraries/Servo/src/Servo.h +++ b/libraries/Servo/src/Servo.h @@ -61,13 +61,13 @@ #define Servo_VERSION 2 // software version of this library -#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo -#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define MIN_PULSE_WIDTH 1000 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2000 // the longest pulse sent to a servo #define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached #define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds -// NOTE: to maintain a strict refresh interval the user needs to not exceed 2000us pulse width -#define MAX_SERVOS 9 +// NOTE: to maintain a strict refresh interval the user needs to not exceed 2250us pulse width +#define MAX_SERVOS 8 class Servo { diff --git a/system/STM32L4xx/Include/stm32l4_servo.h b/system/STM32L4xx/Include/stm32l4_servo.h index ba4efa89..163f1d12 100644 --- a/system/STM32L4xx/Include/stm32l4_servo.h +++ b/system/STM32L4xx/Include/stm32l4_servo.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Thomas Roell. All rights reserved. + * Copyright (c) 2016-2017 Thomas Roell. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -40,7 +40,6 @@ extern "C" { #endif -#define SERVO_EVENT_UPDATE 0x40000000 #define SERVO_EVENT_SYNC 0x80000000 typedef void (*stm32l4_servo_callback_t)(void *context, uint32_t events); @@ -51,14 +50,11 @@ typedef void (*stm32l4_servo_callback_t)(void *context, uint32_t events); #define SERVO_STATE_READY 3 #define SERVO_STATE_ACTIVE 4 -#define SERVO_SLOT_COUNT 9 +#define SERVO_SLOT_COUNT 10 -#define SERVO_SYNC_MARGIN 50 /* sync needs to be at least 50us after the last pulse */ -#define SERVO_SYNC_WIDTH 1950 /* last slot is 2ms, hence the default sync width is 1950us */ -#define SERVO_FRAME_WIDTH 20000 /* the default RC servo frame is 10 slots or 20000us */ -#define SERVO_PULSE_THRESHOLD 500 /* below a pulse is deemed illegal */ -#define SERVO_PULSE_MIN 1000 -#define SERVO_PULSE_MAX 2000 +#define SERVO_SYNC_WIDTH 100 /* sync needs to be at least 100us after the last pulse */ +#define SERVO_FRAME_WIDTH 20000 /* the default RC servo frame is 20000us */ +#define SERVO_PULSE_WIDTH 100 /* below a pulse is deemed illegal */ typedef struct _stm32l4_servo_table_t { uint32_t entries; @@ -69,13 +65,12 @@ typedef struct _stm32l4_servo_table_t { } stm32l4_servo_table_t; typedef struct _stm32l4_servo_schedule_t { - uint16_t period; - uint16_t offset; - uint32_t entries; + uint16_t sync; + uint16_t entries; struct { GPIO_TypeDef *GPIO; uint16_t mask; - uint16_t offset; + uint16_t width; } slot[SERVO_SLOT_COUNT]; } stm32l4_servo_schedule_t; @@ -83,7 +78,6 @@ typedef struct _stm32l4_servo_t { volatile uint8_t state; uint8_t index; uint16_t prescaler; - uint16_t period; stm32l4_timer_t timer; stm32l4_servo_callback_t callback; void *context; diff --git a/system/STM32L4xx/Include/stm32l4_timer.h b/system/STM32L4xx/Include/stm32l4_timer.h index 7f04d807..3a831da3 100644 --- a/system/STM32L4xx/Include/stm32l4_timer.h +++ b/system/STM32L4xx/Include/stm32l4_timer.h @@ -145,6 +145,7 @@ extern bool stm32l4_timer_notify(stm32l4_timer_t *timer, stm32l4_timer_callb extern bool stm32l4_timer_start(stm32l4_timer_t *timer, bool oneshot); extern bool stm32l4_timer_stop(stm32l4_timer_t *timer); extern uint32_t stm32l4_timer_count(stm32l4_timer_t *timer); +extern bool stm32l4_timer_period(stm32l4_timer_t *timer, uint32_t period, bool offset); extern bool stm32l4_timer_channel(stm32l4_timer_t *timer, unsigned int channel, uint32_t compare, uint32_t control); extern bool stm32l4_timer_compare(stm32l4_timer_t *timer, unsigned int channel, uint32_t compare); extern uint32_t stm32l4_timer_capture(stm32l4_timer_t *timer, unsigned int channel); diff --git a/system/STM32L4xx/Lib/libstm32l432.a b/system/STM32L4xx/Lib/libstm32l432.a index 57ced6d3c6173f08a0ee34c80d9cba3686a361b8..4f58d0a950fd1ddabfa7e1018a72f78374ab1b63 100644 GIT binary patch delta 22693 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 j4plCW{O@0_B9bnD2-Uy#63N`O*gk;{ZlI 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 delta 22413 zcmc(H33wD$y7sB=>aOn2(w$DoLLhWH3xNc(ux}wO1`vc0P!Ui-KoJ~_2#A7q5Em3w zFlaH#RTQ^TR6vJj6afWXZ~@ngTvUb;7eoaWWfb*)-_u`*z|44O@wtCLRK4f@wzF5A zsygA#<%7PxZP1byk%~@TI&~=zg~~$wH9dzyV??>dHF^b!~v_lzx=Wtl-)jvGSrz*#<9FbpB z{wBJ|Ur>&Jd_oOl_;of9ANMuQGY8 zQzwo+0TnTEGQaEktB0%LTXoVgW}$NZHb>;Q3e*_KGj65Q$0N&>=i}YKdU!*Tkn)E9 zh2xxSmG{?9;%*S`ASr9sRFW2|OkT z{@xM!d&0k!{rQ+m_z#c7p84u;kI3HZBvmRIqoT^8X(n zk$*PBz*C3RZ+WDYELS)pJpKE}hBB4%ZydppsbWVYp7a8lZn0o1$O=6fal4&(k?znX=%gSZmk=(bh8?EcU$A;>acSMd)NK`j3*!HK5g(x zf_B%x(*GnuvscFSiwl;Nres8KPBtQmaY=ovg!E`pwlQa1Owv(@jXry&(PQXIl4dU( zJ1b9;7#@e+CN9yD|5)zmeN|k-;zd)QaHN*UB|5LFeU6QiSEpEBSyj#vLtMI2cBEB8 zMs(p~=f?FX1ewtZ{mkzRPY5!iGpCxzTbvMNMsL2s+}y+>GkVeE=5}W+W65UlI`f;> zCwwxZqxYDJElx67@SS;2X%k6iw5rfGyOTKWyx*UB!&_rqINUg_=v!kvKRTNzqo0rS zd|w^&?_#628PQ)J^lUxJaNPUR@FtRs=!Zjn-{dusq({G;;aj{~BvE)(6r7}fy?;VoC@#_6Ic9Rg zEA!$KolW2U34zg4*pzG|BRaijV#zg41?x8@1`ae4+^~ODQgr{SVdngi&dU;lC}25i3g^= zbIhzak9gc0jwpZ8uHuFFExfa@=Z#0FJaXfm6UwSp?!g;>`Tpl$!uwX$msK-00TxC# zqr1wB@q;%G`?kJ=%8fC4{1Sm#EP$Ek+80x7JJz$_nU`0m@+Q`)(k{DJO&g;+zLPg? z{Ip?*>-)6dw{_ZSb4E|Oy>EDz^YiV>=yd&*`Wx4re|ujKx%18`%WqsV0mW2%ZglP& zy)e9%X%@%Yw`!UyHuuCLsXogGOs?zs?5Bt4FVJG=v?^pkF=c^2sywsWQ%1*{wT3Rv zs)>0M|1uH3x{39x>hmVq?>^wqkHl<@&;t`gbp;bAPwe_^QFYg6*?!JBMzO0JG1Z*+ ziY9$N?TuqO*+?z$Y&hnw-*EJY zNZMOl7QXn6Gt=GQb970j`T15g?BK$pEyq0d)?vRj?6BeSM1HWozhV9h^ZWHTD)xMm z^QXf43+gWz-+bT1@h+)%|F5g^wtVe(uKDqs!|tO$T+si!Ruk{;JEh+7USWMjp1H68 zccF=S_5HuTX5z&9FQ+B1EtwSBm$&enweYtdtv@uetM1H;7CxdovqN=^@7JAKUOg~I zyH=NLvsF{>!)P$`itCIJ+p*nezYMVE{Ibp{HLGu`URu4py7&!uwIk1c%+sUlYYe*F zEjSN5yk&$Pe#l>uv}$7FUE7Y8E!lRgWBn?7!bAQn>)MIN#J&?3*z+Iqr$(|8@Z_M! zs%iY}RLXb{r=PXp#K~b=KRc9inx^TxX!=a$@VK@ccy#xe_Ye&C9DwUgm^fOT2{(t~ zxt+w}+6?Bx!?$u2PUqQSO+b8Co(t(N^-9$$hv`~D(SK9j^){YO>pK+5;jy+eh-tk} zq2alOW*v}|v+e1SxEjEnohLH+2$OwgF}c^C{II`QQ35392gV+VlU0wgMrm0`Uo(<(H0kPVPBL1Pp1xKjV>GGqJz%$Z#GlpaMut02 z%Z4Njt1VaNI8ADNf1+l*CL?|Mbe*8dDBl))>LdQv?XRY6vh!ZlGs#Rw)su5@@|VER zzY{0rT7(vN&GtYV7-4UI#Ges)jNcuovamF>)aI1?{hAE2RbBV4NEs#yJxOISvo^S5zm{eqkGG4^Y_N4A@BX?~TvJax|Bg#F3 zjjw{&u|Ol);70Il7WB+mCOY%8m^OnwSf{fegVv)v#XV{R(q+0++~=@UI_gewk7h@7 z4Nk(@J%)Mp41UM-Sf;Cj{h8OfgK>`ZMdgeEYrn06( ze;xFzw7xMLm36h`64eTwOE$_G(S>U9DYS@VRt?T?rBurlw)G-5HGhRTj1}E1G>C42 zMQnlN5N2?~8jD!R=4itV&e<5{K*>o2y$5A!Zs-csI=?Y$kqKZpD?ihNobZYSJ}cu{ zrID>TzcH(o%xWxxsg`FTW$cI>=4->d8Vz^Q@G9oY5LET@Jf_9DnTS8Z8`w&Zjw5UqZv4zBHzho<3oa^BoM>)o9WaQVj1~ z;LwU!qL#RJDPwiK<``F~`R!h*xv`oRk4%S6tmdm(^ZQ8kY+B99^e(BM6stKYd=Q27 zq*%>K;aIA2FF=ryNM|zo_V$P#z6+vCScY#!qLzsTNK9tpawO&;p|ZN;^o0-OZz^2k zBZT9;am+S%T;*{N9GDL@9Wxa`x#$Y#YMj{j*J|J4jw^Mm%|!3lKojqMRydF4xrY||$S(Mgu zAh7ydKSSx>20_tfIJs_TlZWBw*QWx=V)wr!lh@9oBpTgDqh67?l`858mFreY+3hh` zwz77O`4=5T(Ok=D!=67Syx6Q`oTaqkhm1md-(a(uz3G2a66|f4nCY?9sz3TWcGg$4 zlOx>-M?(!KPVMMK*c`okgMYCR$!OEQAe>tk&I`{T zQaLr;Yr(7`l^rU}%FD0-H{9*rmFKm}8=F%#q;hE4*hhEdVBsvsOL zsVre8%y@{#p6=P zqqN81f+3!)DV1U8K^5v#o>N-tJbrb1XJ*J@HnDufVdS1`w|d5(Vf@MN@{B*n_CD*+ zY6!GVZ|K?9XU~1cU(irjnjT&GjQkql>CeOI&l1b5l&-yLH z4kV`d?CG2Q>l!NVJ8TUbQFGd9{cG(v+WAxM-kbfMqLa4xyBqfFqY@Hb?5FipQ|&t;HtOu>=3;Wc`n5CQ7+-9^4HL&Q!(K8lDZSa_ z=r>$H8-G&}xyWw)fLY-+Tm*q-?Uf&`rQzIopCpbzo zTB?2Ji~fLXc{y&}_N}y^jae|N;kikv_6}$qpLVkMzKCXc9pZsn-25eo%R1X7FF~B% z43}U;Pqn8~yr#1~kK*?-lzPm5=p}!iZONyFrZqW?D`h>*!#G;mZ+v59yNa-|+h`y8#>h*$7IQOzsCm%l+PU9C zyQ~fFiFTiFjmzwnV~l{0lbSV0ckkQnO^c4-;lIs@oDNC+ho(^H#tD#|kG}CA`Jy-h zlJlC%sJu1=(N|9a<3H+O#z8%E58}b)L*cx%1eG_Ujv^8N(IElWbl_Dks1j5jiTtSV zBKp}#2UU_9a*BR}=(#!wD!-a795*>|M7V6`?>bam+;QAxlV{An#NPL+zhlGIrRlc+ zShRaxB1J6}!De#5qVr9K37MaafH~tc%#~WfpE+7zWDMUa7uB zjP4=Cwhd4JToL{Fb&NdkLKA%qw+HNBcKOfFD#Fd2w4>ly!3*t6-oTY{iO>~-j|#3A z+(^Xnitu-cD8?S)9|`|V_&36j33p)n(%vGX7%9TjV?3flA}AojsZy|3aGKyE!TSX_ z2tFsci--*N5YgJ73IB$O0vr>LdrPc9#1;{hNCfFbICj?x^e_>lW`yu_i3l`N`0t2` zO3f2~z33N-e1*s#B;wlhN8y`^h_j6tL5W`%!CPYRzVQ9R4+%da{72y&Q>?L%h=6_~ zGRhO|A~;-dhTt+H{O$%u9GDT0i6BZuppC*`5dMnrcZBZ|{*my{g#SoHykuOr7$-w8 zB-loLiFDVH_=_RYa>`Gc)sBE zf-42L`A`ZvyeEP$efD{7quPGGMM}W_xGJH{etJ?uvj~Reg_vd>p1kZ3IlqbX1+Nq2 zTAT8_1n(1kP!KO@w0^DN2EmPjTLoVfd>0sDz&#@POz;cA<3uz(FPcP4kk?UiKE@Ms z1bK%fZzIU(dh*_a)q!T0C=I`G(kS1a~{kWTqw9$utCrkyj$=-K|ZMK z`60MbaEsth1Cx{nd}l}8Blv+JpXDk4R*(<#)FGY3ojEf zWzt`23Lx^!+RzrJcOrxH{sz>s=?`Bda!{+LUqcr2uH`YeLyWH> zmphR28dTO9{~GcdB={N<<@L*9B_?93xTc~doL#tZ!zU0oU8W<7v+E67V)4}oK7pLh zYo=)prO@#3J%ZaX&y2v_ngEL#)_jDy%(@rpnHF!#v#h}|nr*#?^jxbOa-3%kgU!{} zIdF9=gy1g!JW6e-piq=Qy(Xj82}!z;~t1zydp$R`k`Tc3ht zSg)ZdnbusSvn(evZf*sk&9=@*fm&E=p>1Vl!#QMiL(p8S95oADTXD{_o`y}nbpgBz ztk$qBv@Sp`TU$LKDYBa3+{XG8=W;6pmL05OMCfc?6M=IVD+lMU*2i$`X01a>yIU)v z?qMb1+|w#Rfwm~?cgXoUWnBXHyt0zOw&Ga;nQT*5Au7LJStC*07nD^BlNXgW7{Zs7 z#TRlfE2|}GhAe!yMyHDx_H9rSfLq5!*;#TCOF%DMvVO|*Uz&|I|&jpbvbxC6p^!}mXQe^u*N8oqQ|zGmD-KZoytJ?z;) zbN^Q~*=6v0aMg;&acoe#n#f}38F9KeDUH?RblF2crgLrnksW+Z>n`xtcj0H$DL*^W$C0 z3Uihtf*uL>t5xRZ4i-*%&q5K*IhvT>Kcm>@6`FXwL)cqaYLe(Zik>m&Y7+2nqS-vh zN(4>w{)L*Wv?kL#89iZMtx2SX*GE-Evyd*LS+AY)y&I9YIbUmvyrWPP^BPS`yj=U4 z3p6S7@^)lit9?3pJ22Plw5F@K7s>US^z^>RlHQ<6m6zRbE_AHqm88Enhp}(es)1g9 z0XA>aWQg|>7Il#(HC~PjbFt27r1y7d7xQMV8Rg}A%e+OCvEI%!yH%6%Ufu)ECE90_ z_dQm1sn$&Keu73eBe!XGvG+JzxIvRTFGrWTOgqi=`ssAL*39uXC%HqDdEOZqZ>FtD zz4x#5S+0Gq_0B>Uo4?nZg3xA^IYSeVcL%c{s!3vS1hN>W(}Cb= z13+ptN%M|Dxgz+Q%xIb32`pu;CM~=Z7;S_mpI(&y_K3%;lNJeYY(|a!`K0ZWKRpnj9#vQ9k|6qTH zJ6Dr|-YaQ#o+d+r@@<+vHC|qP@NJr8r1wFZP0(bN_feAbH5m(^3S~~zWIRX*Wlqw> zGf4%w+%j$7)<90g-G*0gi%%HJ`aRBuwGL;8^%4Y5tArt~J~+E9z9e@m*ESIM?61)| z8Ruev7rC$A42R5-gU(Ry2$L!cYh&fEpUpnWIt+n(J}0^>YbPUI!?Zi=M%pYG#@szw z4^R~Q)Sa~i6Tp2PCvhNa9<=W3S=BWCCB%KhcIKthOb(9Z&d9;_K2q+5)sSa=?X$nz z8fX_8fN^ECc?Y8A3z4O9Cd!~j;V@S4gG2UL2xy$iPZ|8RV9|}US@c}cmXDxT#wZrx z3{sXSM#qDy9C{hIK8ZN|^~GVVAd5x46;UJVPDop^=EkiBJP&Whstc*j-qA?@8(OS0 z96eB?9KJO-9*##YBwO*9#>fw|yiT;5%GpcRdX|vCnBi#{O0goWkI=FgEL(n$ld*w@ zV@NBJh|ya?Lufd47e7&?Bk>>;Es$7?gv#wlQ@;@}Og&`AiYt&uST~;EU>=V#3ZM8k zYM<-b?1PLa`K5=yS8*6CveAAqr$O536*z_UC*wf|OUBRi;a3n1uH=3+ML2_f5aa#8 z^K=&tHrPkTnfWu>B}23|CvkqO6MQjvB>!UMAqKp-hU!t0y}FEV;u>gdYOL3IUBo{$ z7IBj<;!p4ibAZB<1GEb&7UmcQFM-F^7;OiLec7E1qHCkI? zFmfdAjQ7&px;6M9i!T362fp<0#Cu)e~{6 zj~lH{k6RslKW_Cy+^QVi7mGDAZgt3sCmS8>G$@&4M8A7dZP=*i!HkiOFGDoj3(*oC zgUU&9F4Pn$yf{Y>Y>_gxV536)8@(0}vM)Be0KPM4_Q~6=3*qSAiZt7*&NZ2v zOFi*YF&;{oA!qwVa7Hc;@AoRy9xUmpEPTUob zro?L-)}C*}DEuL78+H^Rwg&?XXSIZnNbicAu67~ zmbC}x1YU=9Nk_zGo$klnK)sT@KVPZR((*G}<%J4z**SAzbQnf#z2{>_?y7Z<*zyjqmmF=gDXg(|s2 zG+p9uaWCjri*ESec=7JfV*Kv!cq~is)O0q6 zaPAju?4^y}R;fE2-zH>`F4f%@hGl!*ZA*2x8N=J_PFt$G!Kh^y;riRqI2z7lmp<4y zj4+`v7kRyR0|6|bGFzZ2IoD{%qtA6G%qAgO(G#=6(ciiQ>Ezqt(t*n{>od-`4zm&1I;fM2nEaf{ zj%!h2Pdg^xg;TmdkzonQWnstm=qXQoN;oQG`c!Su=@w+>DPtPqXwuF=rC~p_(M+5)Ad8CVx}Jh4S1!~VI{+t#0nj>c9Fm11x!M{Yy;knFUu?BsA^CkMRp;N`KO zJ1;ThC{MNjd|qODv8#1fD8YaOJ}&7^A27x3swIM?7(w@_gmbjEE!xL!H{6kt72hpF zpLUFgLh11Kva?f4E0O)}eY04C@+L(@*(!v>ws%&~EVN#G)jKP;&!lzMpj3)F+J_e# zX+|gejSlXN=!0(t-u6Zd-pAVCK3I^HX8-i8>9N23Fi>Mx?+dKqX{5ChqtBskjvCp% z1jC-RKagej{tG_A-dvZM7u~);5O&xF2LcxwOYNHv1X?$H&}F2ChjN#M(YPyNoxSfs zAl=xg;k374fe#rc)O$`9e0Zv0k^2;vCD9%q2VOPo0|x{CXv5(icE zs~C4$?YKd;!>32L913)E*!u?rQtf>M0vYzr75MhQ^H7S{9{N?_WxMupAQ5=MVL$n@H^r{`KH!cX_&(6lVIRKSvDn`8ikW6V{X?Lu z*Mqfr2&1mj{_%&vfTSW&T!$5}QI`G2y=JOC{tAc3p88{;D5)!y=p(Jfli(2}+kP5y zZw=%a*og7@kAVT+QH`|6anSLNbP;IM6wr_aNomNvFx&p&IASb>SZ8b({{*MyjZSla z3Up~!j|(vV=>-o!@oM6;%MTl=z2-rVncVnW2~RFbSpyapmb!3!SZx|24fC&3?@QQl zil)|Wmwn(%Z&)@Z;2ICBwzO*4I3>{TSd+5zi6S2R_$d*%vr~K7?tw`u9uy}8>&k{B z>oR;$>EBbaT)Jmt8aFL}S6H*$EPn_`JP&@PKsJp{@O;eQzH(e3(6*+DQ@DxKd8at- ziaBMCJ|)vBaew=vz1UIyfyDk`uP@NHKCVOD!X~lrI3@O>m{YIYPKmv|iGNWO|JC9T z&_6DP-P~uG{FI3@VP$#|!Ur9Oj~ zH3{DJln@W$j=P0b4{`%x)8fs!%w97X8*KO{zGhRxVmlWN@}rIi_rW){tM3)t z>~a<4_*d6xU#T~{bmzNb+Q)xAQB+Qw_>U##?`GIFZGg~hJM)aBLRZ%+e81M)b`Fm= z0!h2iP^umSrZ-%M#uxk2&_r>4D}2OrQ8QS5+XHje_Rd zHpecV>dUepK0P^Tm#r}Z_7Coq9A}P7v4?%^Yh|R^m&D-K7(5Y!oiX_8V_(Z2ZS{K@ zhUG=V&}*~COwg*uI^PqLVs(L#OnY2yQik2!lM*nlwu?O}t?bOpodJ7&ZBmV+O4*(f zNtMy&-V~1!;X^|Zg+GF-vbG#DK|HPT<0&~;XF-*%S_;R|1aG0boWyff%}MqlHRU88 zR&!6{`AV-j*=n&23e`O)85Bid_N5$b+z_|PzBwtSb7VO4#-+YC*4(}kvG4Idy!YZq z3m>k>=yl~gCwBAjorUR0j!8WSSc;1@?aF{!4nNk1egPsl#<#{pB5#jIpnM3hI|EOm z0LT}YM7|FtJ}kIJ@NGeUoAjM+&r43(jK7RfoI8#|c=IdROfZW$08239K&-4p-c^tz zn|{@Tg9TAFEgvVyAwaunf~+_BRlo=nH;G`W;Bvux1Xl~L6Wk!UNpPFs4#8c5?+We} z+%Nd4;Fri>m*iU!{2<6-#)7#869t2UnSwcj`GRc)%LF?M_7vtg2!NY>z3GzZpdp>~@J%SPa#SDUU5pYt|fPeW#EEd!|A;7x{ zuM!*}I8^XVLA?R4!>jiHXyi@RX!T%Bb zRPZP~KVJlV#Ysh_ z;9$W~f-?l`1)mVyD5$r`!T&4a#|3*~Maa0P3!W`F$%Fo#Pl<-!*T-YR&P;6s8>3i4$( z{ofVT+u*=mzL-29m`=p_C=gysJPrM?_roF4PZVc}qE`4=;pYp#n21)GE1Z9!!az3( zw*~JPd|dSFg+C*>oyhmqZ;RjqA_9FR{7WKM0zV12@JfUFL?UXKE<9T}w@^^umI%KN zg8ID+c(vH^?=83;X}sp>|7lFXu}&0MY6Vv8#5ARr3BQL3yZePdA^a)fn}u%^zEk*q z;a>>xncL}~Pcu??LBHrFR@!&$gBq9qgyoK;w;l;wsgm)L-J4xpMAQ21| zgHgiI6@H=cIwCS&Abhdl9U}jO@O6S4MZQz`Zo&N`Kbpk(kCOi^3J(SfGsq@FULd@y z@V>&&6h2P)4B_*HFA@HG!BrxU3V&Ak#}P>+;^jV@GK1I>kI}-*i6}^C;eCV;7d(py z`>BF6iHO7RV2)Nw-6H(=M8x@n;Nzl?Y!-tZ#9VB975)(s4#$K$F=ZTi=wl)>Xi0=V zEWDlY3gNwk_Z5DI@bSW@#dt*3iD0f6)Dw}>1Apn>NKIwTT{F(!l;5@BB~ytDA0!ut{1;Zu*`7{SS+ zznEBxD=0C7#I+*0MGS5ymg7Pr__)abNbG>kV1loU{2gK^TsZ~56!}qN7d-0YB`PtQ zhzd0$cEb`6IF*U^qUcVn!vE+Xdn~3_bpx);V-cC5b zWl>)xI6#m)=OB+LeWQcHS)w>skgwCr z?N$jsCaCw8Ki8H0pS^f z`ow@nHaz_~b{w#PPf%hK>^sO0qL=?vaj|-Z-;X&^a z^b4j6^2;2rDTRXV1j_~ajg6O(0fIvXYZFUi3Vw8>!4$zu1TPcB!dW@`*-Jk1WZ2V+ zQ);}(Yz}3`_O{}b?zZDQ{MqO|@0kI+xFls|7POP71y0dcN?jbY{-`8nM&wRD47#wn zl!&$5*F@x$#78LHkn}SjF0*=bI~F1~bJ%!p9R)5#2=a=Nlfb`Icxs=G-zS5Pgjn#I_@_hOY|WMMO z1oRM5^A^HG#9S0mxPAeFmKY^`ED0RG!3N6YOJ{o6#e;6CB{eE?eWu<&n*Xi@&9TQmNt+pGyQX12ei6#qeP*UtJs o(6za%J^Em2%DhEQwz)?upGnzpVN*dcFE}K*so=`;;O^%C53^`6r~m)} diff --git a/system/STM32L4xx/Lib/libstm32l476.a b/system/STM32L4xx/Lib/libstm32l476.a index 5e11c58e4dcb8625780df2b5f29da2e5a91339f8..b2b6de22ac7fe496b44c0ca92d2bcf9bee57f09c 100644 GIT binary patch delta 24844 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 delta 24356 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 diff --git a/system/STM32L4xx/Source/stm32l4_servo.c b/system/STM32L4xx/Source/stm32l4_servo.c index ddc0a8e0..487ebb85 100644 --- a/system/STM32L4xx/Source/stm32l4_servo.c +++ b/system/STM32L4xx/Source/stm32l4_servo.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Thomas Roell. All rights reserved. + * Copyright (c) 2016-2017 Thomas Roell. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -42,96 +42,62 @@ static void stm32l4_servo_event_callback(void *context, uint32_t events) stm32l4_servo_schedule_t *active, *pending; unsigned int index; - if (events & TIMER_EVENT_PERIOD) - { - pending = servo->pending; - servo->pending = NULL; - - if (pending) - { - servo->active = pending; - } - - active = servo->active; + index = servo->index; + active = servo->active; - if (active->entries != 0) - { - if (servo->period == active->period) - { - active->slot[0].GPIO->BSRR = active->slot[0].mask; + if (index != active->entries) + { + active->slot[index].GPIO->BRR = active->slot[index].mask; - stm32l4_timer_compare(&servo->timer, TIMER_CHANNEL_1, active->slot[0].offset); - } - else - { - servo->period = active->period; + index++; - stm32l4_timer_stop(&servo->timer); - stm32l4_timer_configure(&servo->timer, servo->prescaler -1, servo->period -1, 0); - stm32l4_timer_channel(&servo->timer, TIMER_CHANNEL_1, active->slot[0].offset, TIMER_CONTROL_COMPARE_TIMING); - stm32l4_timer_start(&servo->timer, false); - - active->slot[0].GPIO->BSRR = active->slot[0].mask; + if (index != active->entries) + { + active->slot[index].GPIO->BSRR = active->slot[index].mask; - servo->state = SERVO_STATE_ACTIVE; - } + stm32l4_timer_period(&servo->timer, active->slot[index].width -1, true); } else { - stm32l4_timer_stop(&servo->timer); - - servo->active = NULL; - - servo->state = SERVO_STATE_READY; + stm32l4_timer_period(&servo->timer, active->sync -1, true); } - servo->index = 0; - - if (pending && (servo->events & SERVO_EVENT_UPDATE)) - { - (*servo->callback)(servo->context, SERVO_EVENT_UPDATE); - } + servo->index = index; } else { - index = servo->index; - active = servo->active; + servo->index = 0; - if (index != active->entries) + pending = servo->pending; + + if (pending == NULL) { - active->slot[index].GPIO->BRR = active->slot[index].mask; - - index++; + active->slot[0].GPIO->BSRR = active->slot[0].mask; - if (index != active->entries) + stm32l4_timer_period(&servo->timer, active->slot[0].width -1, true); + } + else + { + if (pending->entries) { - active->slot[index].GPIO->BSRR = active->slot[index].mask; + pending->slot[0].GPIO->BSRR = pending->slot[0].mask; - stm32l4_timer_compare(&servo->timer, TIMER_CHANNEL_1, active->slot[index].offset); + stm32l4_timer_period(&servo->timer, pending->slot[0].width -1, true); } else { - if (active->offset) - { - stm32l4_timer_compare(&servo->timer, TIMER_CHANNEL_1, active->offset); - } - else - { - if (servo->events & SERVO_EVENT_SYNC) - { - (*servo->callback)(servo->context, SERVO_EVENT_SYNC); - } - } + stm32l4_timer_stop(&servo->timer); + + servo->state = SERVO_STATE_READY; } - servo->index = index; + servo->pending = NULL; + servo->active = pending; } - else + + if (servo->events & SERVO_EVENT_SYNC) { - if (servo->events & SERVO_EVENT_SYNC) - { - (*servo->callback)(servo->context, SERVO_EVENT_SYNC); - } + (*servo->callback)(servo->context, SERVO_EVENT_SYNC); } } } @@ -150,7 +116,6 @@ bool stm32l4_servo_create(stm32l4_servo_t *servo, unsigned int instance, unsigne servo->index = 0; servo->prescaler = 0; - servo->period = 0; servo->active = NULL; servo->pending = NULL; @@ -178,7 +143,7 @@ bool stm32l4_servo_enable(stm32l4_servo_t *servo, const stm32l4_servo_table_t *t servo->state = SERVO_STATE_BUSY; - if (!stm32l4_timer_enable(&servo->timer, 0, 0, 0, stm32l4_servo_event_callback, servo, (TIMER_EVENT_PERIOD | TIMER_EVENT_CHANNEL_1))) + if (!stm32l4_timer_enable(&servo->timer, 0, 0, 0, stm32l4_servo_event_callback, servo, TIMER_EVENT_PERIOD)) { servo->state = SERVO_STATE_INIT; @@ -233,22 +198,20 @@ bool stm32l4_servo_configure(stm32l4_servo_t *servo, const stm32l4_servo_table_t for (offset = 0, entry = 0, index = 0; entry < table->entries; entry++) { - if ((table->slot[entry].pin != GPIO_PIN_NONE) && (table->slot[index].width >= SERVO_PULSE_THRESHOLD)) + if ((table->slot[entry].pin != GPIO_PIN_NONE) && (table->slot[index].width >= SERVO_PULSE_WIDTH)) { - offset += table->slot[entry].width; - pending->slot[index].GPIO = (GPIO_TypeDef *)(GPIOA_BASE + (GPIOB_BASE - GPIOA_BASE) * ((table->slot[entry].pin & GPIO_PIN_GROUP_MASK) >> GPIO_PIN_GROUP_SHIFT)); pending->slot[index].mask = (1ul << ((table->slot[entry].pin & GPIO_PIN_INDEX_MASK) >> GPIO_PIN_INDEX_SHIFT)); - pending->slot[index].offset = offset; + pending->slot[index].width = table->slot[entry].width; + offset += table->slot[entry].width; index++; } } if (offset == 0) { - pending->period = 0; - pending->offset = 0; + pending->sync = 0; pending->entries = 0; } else @@ -257,15 +220,13 @@ bool stm32l4_servo_configure(stm32l4_servo_t *servo, const stm32l4_servo_table_t servo->prescaler = stm32l4_timer_clock(&servo->timer) / 1000000; - if ((offset + SERVO_SYNC_MARGIN + SERVO_SYNC_WIDTH) >= SERVO_FRAME_WIDTH) + if ((offset + SERVO_SYNC_WIDTH) >= SERVO_FRAME_WIDTH) { - pending->period = (offset + SERVO_SYNC_MARGIN + SERVO_SYNC_WIDTH); - pending->offset = SERVO_SYNC_MARGIN; + pending->sync = SERVO_SYNC_WIDTH; } else { - pending->period = SERVO_FRAME_WIDTH; - pending->offset = SERVO_FRAME_WIDTH - SERVO_SYNC_WIDTH; + pending->sync = SERVO_FRAME_WIDTH - offset; } } @@ -275,20 +236,17 @@ bool stm32l4_servo_configure(stm32l4_servo_t *servo, const stm32l4_servo_table_t } else { - if (pending->period) + if (pending->entries) { - servo->active = pending; - - servo->period = pending->period; + servo->state = SERVO_STATE_ACTIVE; - stm32l4_timer_stop(&servo->timer); - stm32l4_timer_configure(&servo->timer, servo->prescaler -1, servo->period -1, 0); - stm32l4_timer_channel(&servo->timer, TIMER_CHANNEL_1, pending->slot[0].offset, TIMER_CONTROL_COMPARE_TIMING); + servo->active = pending; + servo->index = 0; + + stm32l4_timer_configure(&servo->timer, servo->prescaler -1, pending->slot[0].width -1, 0); stm32l4_timer_start(&servo->timer, false); pending->slot[0].GPIO->BSRR = pending->slot[0].mask; - - servo->state = SERVO_STATE_ACTIVE; } } diff --git a/system/STM32L4xx/Source/stm32l4_timer.c b/system/STM32L4xx/Source/stm32l4_timer.c index 6187b04c..e3f82a86 100644 --- a/system/STM32L4xx/Source/stm32l4_timer.c +++ b/system/STM32L4xx/Source/stm32l4_timer.c @@ -543,6 +543,34 @@ uint32_t stm32l4_timer_count(stm32l4_timer_t *timer) return TIM->CNT; } +bool stm32l4_timer_period(stm32l4_timer_t *timer, uint32_t period, bool offset) +{ + TIM_TypeDef *TIM = timer->TIM; + uint32_t primask; + + if ((timer->state != TIMER_STATE_READY) && (timer->state != TIMER_STATE_ACTIVE)) + { + return false; + } + + if (offset) + { + primask = __get_PRIMASK(); + + __disable_irq(); + + TIM->ARR = period - TIM->CNT; + + __set_PRIMASK(primask); + } + else + { + TIM->ARR = period; + } + + return true; +} + bool stm32l4_timer_channel(stm32l4_timer_t *timer, unsigned int channel, uint32_t compare, uint32_t control) { TIM_TypeDef *TIM = timer->TIM;