From bf19c278a6a74a18e00cd576852817400cd6fed9 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 24 Sep 2017 23:16:49 +0200 Subject: [PATCH] Working rainbow code --- olsndot/PCB_Project/bom.ods | Bin 23580 -> 24867 bytes olsndot/firmware/Makefile | 9 +- olsndot/firmware/main.c | 250 +++++++++++++++++------------------- 3 files changed, 122 insertions(+), 137 deletions(-) diff --git a/olsndot/PCB_Project/bom.ods b/olsndot/PCB_Project/bom.ods index 246dbf40729c169a97ed8f67c2f89b95443409c0..69c5fe4ac6a26c6bc688030f82f8cff15d8bad4b 100644 GIT binary patch delta 22621 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 delta 21122 zcmZ2{h;hyiM&1B#W)=|!1`Y-Wv*3Lbc?0>(g7C!tCg^GUGB7YR1o(uwvaqo5@$rd>h)79EDJv^$X=xc78(UjjJ3BjjdwYk3ghWS2 zCnqOoXJ;1|7gtwTPoB#tA$s`m;nSy2U%q_#_U+q`A3uKm`t|3}pEpZ0&0ySYz{Jg1 zf6GyAGXsOvPEQxdkcwMxW4n`tEjOh$+{oK|KY!}K|N8k;Wjqp2yt$XCF!!d!q#Jj0 zqnE2*T^T&dOa7X4eNDyHeEC$z+A7ZD-^DB3_N)K?6xCDASRkLZ|BB`9oZKF^dY+cx z+gi0r8&A*R&%4;z&mk(1qsfq}^Xnz+Ife&2zSf^!yJT^V(EO*z|2f*L9FF{P=9Lux zv*KTCJ}g@OD?-05w)g@6+X>UFOsCfvD&3EhZ+P~s=rqTJU3Ldl|8Lx~>mJ|Noohw= zRqt$FbM(-U6!{-lHK)m)Qg8S-G5+si!SeykyXtqzoXcT&9c5>dICK41W3#WH7_OHb zRZ}hfC($Q({CPcl#ftf>PtLDev$O7q+?QJnK@omp&q{({N31eZP7`1Be&4GZv0SSc z6`yweyk$ykQOYvKLR;1Eq5G{G%=6vuGwxxoVE@4PK=y!jLpj5HhI=r9dTEFJx4V;_ z@BVk{$!9$9wJe6sB%+z+OGIwZu3K*uV&9h(^ckM#c~C!TdVqMXcX;NTw_ z$JS%*(PtiB&WK?4)fU?-SXRUH<_^P=ug|7g`XuXYY5tmAw(s8scm8(XX8DyXjvk9P zUR-~mO1WR0;YqoYb-iW7pCaMxhqtdUow{87>S^#}bArGI|3 zR?JsV(BfWNX5Pg|yD#u*D?4Q9PP&w_aCgX$k4#&p&7J)?J^-m zFP=5Em~q;sJ5#c5CPyY##!hz#+4cDRw}n2B)byV24X-KP`|V|p2os00$j*>0=DNJ| z3X(bR?h-of;^Mq?+TW}^Bi(Pt4A%teO?YmYPCJpxGRY+-M$dEmk4WANt_CGS9j`bY z4o4MwCwxxY&Gup0rm1UUbe2S}Qeeml^lmKkS@_#wftqIU%LOlr96MhB*r}EhED~g< zEHeMI@!#WSjiG(d^}X6=PqLE_N@(0WDYUwgL67Zpo4AJR2L2sqSidnk)+Si$vTf_~ zsJ9J%sT?SrWfG#|IKys>(Ule!Q^ihSkCL<-@68u8)&IF)oh?zc$BzF`?cwdaPQU)j zIH&yt!?W#An%uALy}tIh{to$F@-r$d5189b+qXwb^>KQuyqWZ#k58{NJUDh{>uHk& zVcuJZ)l8!Lvb*X|Zb*3;l~64&#C>SXx)|+O>ngt1oBTNUk@fzZBT+SXXTJORKz1L4 zMjhiHE{4u`XA&bFvvs*7k4fATGFG!>U1jm{w76!y4LmaJad67Yxs>Wx6__&HKr;*UWmO<+VE_` z6$_uv<7K=Ft-SSH_Hg7b%wXH{-8*c_+MTo3@vXIXmJ?3PlxAFivG#0MWzvgq7lrEvqF+9I_g;yx{Y51$Z*eX zU7Dj3y!v(yj}DW;xy|tx+U#_8-~Qa_YFZVhBR*LxZtA4D9iKLRsJGY9{CH%K=hK&K zLW1%q1szx&vrCRG-aLG-sZjoYiKy9A7&_M}J7y(|*41%3o{YcHQg=;O<#1kHJpZ35 zowL8jPW-FP@ZkOZ6P9uO4Lz&x$j)9^9{Hhs5%b?JH}+a@&AU#*v(>7WO8(x^_o_?p z&jh0dQ_tV{S6et&(76+z;&q&x5{QtxD_L@;y9Z;^SrDDXOFV*?D<}w zHKpNPf47G0+iZr2@EoU8Nud|I8_jPOzZP^zRdCEo$;jJs)AvQ&8y;zgr*5hu8Qza| zB@XDCSN?6;@%Q(;FN^P6B;MV7(U85z^WBqw+n<%$JhxRdVwap#S#I}z_KUk;{uSE) zKgaxkF~cWmwh1b%?DP93D7|nBQxtt4HB&Ris6J@xWu^zrx{uCw%y85^{FwExm8pY* zWA6UA#og<@tn+z!RAoP?#;_^67e0wlmMvJv;x4qoJ^oImtRFXntwpHHtHUO&UPk^5 zSC&Xg$jJVUW&WFO@w0_t%@wA*?14K3g}Rb&ES!B{`i7h-QM`(aCoh_FgX^!y@i0N-sVF+-viDA-u0?7X(`QI#(&DF5a{zapt-?(fjoCS6$qh$?N&p z@vR7N-IB&Urn*h%>USOYXGltMZgZJtFR`)Wbn8r(IqZ}9|J2>Du$%LJ<15YFr^d%( z`denXUsY_?Rmpkvz&c}TdrLjz@kwT~A1bb!HQc_WD&DtCbj7PCcD0S$T3&_Ta(0>A z?AbnJt$bu<6}ae{cFA&iI5W*o|pJSD3eJB;V}~A?Kz#*eYU$07-%*Jw-_5IR_TMPQi${DiWl_m5pV*1F->8h>H5aaWt{=|jp z?|zhu+GofuT_AAWy5WBH0{@0S2GJ+33?)fQ;??V#w&=v|{bas!?$ciPoC~2m(?U+z znKL!CdQUsP`mWZws=z7c$3E)qx-s9w_k~bo2giZ{9dlVZK^v84rgb0K5~2@$(~#yi z@AsWlHSOh>(sPT%B}4bBiIpB|vdAg>-c-MbU8^>{}#^9qCK zOBx&O82HcMQ~&zR?uFK?+#jp#rMUj^E_(R&MLomU7hxG!6^?t~dh<4KmruvkdyV~j z!h_!)P!#f_rEzgt#0+V+FwZ_ZI|l# zx_Uo+a%1hWqs;e*1Wm=vHZrl zixtbSNc_=fJ+QG{$-Clq``5owd)|wQ`n5dW>31QcB286i)>dVh{W}_a|Hg>wE8%Duh-}blSXa;Y~L7 z)h}OOoRJZ?*tzHo)9Kc$!24Ear@7un5j$FEJ|2cbSId>`a)~)o6m-Py`pXm3CtaAJ6o3(cPyOs z=jft+Tl===N>y2H+vwR`U#8b3Yv>cf?0ZnENk&vZ;#;HQ*3HX`9vptML-k8Z-X}G! zNfW*wd>GssVRX$uIbhw>>r5W^e#Tu$o*{5b%T%AEGF7TyhEej&` z`P;BcSKxA=hUoLt2VQ^Bl8SnwD{$)a*JO zpVsiElK=B=Yy0yo4=$c;&~5m0UE$^87^Us@{@3=s?bsbTeKLcBu~3PbMtaF-x9fQm z=IJb6sgb5~C0a4|k?2I$=#L?$`+hBZyJJb_o04x^87F-0*JyTfjyI{e5^*(pW8cn2 z(z=olvO0K!L*n+PFHoMocH&-L&->3f8R~iD@-$WaeL0@!wye;w;fhO{vTwz&C%ay2 z*j$y6iZIl1zm#St^6!;z$J9wF`!3lWT2sroaFYI-xD!j%LsoSQGt6qxXY@CXa}`)O z>yY)SNx}>oirZqMy)S(HA0ZkPnakZbC6VWe*@_o6la_leKOwuySj=k5=hfv;|J(Ds zlxkVkSNHeMV{mX6em^H$WzMs3)4QMJkD5(CbG~*ha(8vLW$f6qYPL!2#+3VcrpF&%ex&I$J<&fq@<1}RUnG#k>JY4Zq!b!M(#?=bv&}p`_PF7~V_{x4W z_k-^v!yv=Xa%oq-q#0Yj-Y~iuws6rT;}eH^MdjY?ZBp~ys}r_h)t)HHdQOJpUpMA8 zUR_!8k>$XGCC{rj@MNs2efC0c<-Qp#E?Y&TO_hFfXU(bg@9w&^OfU4~DP`M|C)@Qm zzmRHQBfgtw$+u(moDB7B3qCB~J!99M46BUI3IYC=W}X*{4oJt2&>?)DUtpHz7M|lJPv2LF?U_U{a)p@4t38oepr{4 zyb`j@ydg2^<>}j!3$HiKEx)nh{B4HJocO%7f-;qym#s}%x*2c3&rG=xTW@5y?#^1X zw=HQRxBmY>W6l5PHiOFNGkfkn_m5ij&tSvW=Z#;k1$jJYO}O*L?$)La|8Fj2b+zDh z5Gm~x)LzRGba3Xood28ub8yB97*QFzK3^-#|rtN*cz{zcC znE$QL&1WZkU*!D$*b%vj7Xp>7OizTqxbpDionKxz*pF#4-pO>|cQLd0y-OLJ>$HC+ z!YX@j-1xj%M_%RNvFU*(r?`XMeR%o5-{(>|p>t7q?&7cW(%x4-yZO*=PdneURgxF% z)^-}ySGU1c z&mdV39h13hUR)|qZIKF&DlVP4MfI%+|to-GyJe!xA*j|B@yl>0s()R+9keC>20|tE-kivYM~*s_`DiBKE3~b z3=gI>FGyY)T>U)C|MYS})2XU2?v$F`d6}5o6Sv)D()wfX0$Epvig=kvh4{~1bjvB_ z?iTCWlA-l4SxRfG>g8tGm;Rc2;$LvWYWu?AKXDs-cDo(cKK7!(kKv4!-{$3In&LbX zQeo|TgYL$LP4!b2zH)e1aGK<<byva9 zIi?CTb<7VpaVRX`u=n-CXqj_(`;*bYre0z_H%n`>%W!->$dYgxPR!#g!^0!vjPhO zFHM{M==`$yxn+OfcBg$YlwBh1xhP-v%WS5CK&^K+oy9*zX72p-vn;D&#*d9`8nR3D zPwLkTe4gSw$(~Iib&tYC+hs0GJE!Nb=G@CYtDM1}^T9kFp?&LW7N?kg5ZBAFk!D!N zn|*18EPK#0kH-@^F6dun=r4HSed>6rzvfTYXPGl@v?u4}&RNsDFvIbu@^jPd%&9Bd zlU*hDU$&FF*^;Ml;i{j{{3UEE%TLViIIMbiBU{ObE%he+6JK6iTavT$1oH|;2g?;M z#)gG!S)+_UrCo7BaRHCt7M$YTSu^Dpzhd;HO{<@NIkdW~#(eR6hJWD<4z}hDzng6L zq$@3Vx3A>gkU6cZ{z#NvhUDg;X30};eT~^$91rKOS+SgL!{oQ-te1`-`dzSt!iiuj#t9`ZF)Q`tu z)!`4PvQAFA9Q8%%R_S&r!)JQ}*J<4BvNdFgaO|3r5i)7*nn04FDQ>OH#?_GTL#M$J7s>b#8MGPmlCHtssFnWFFOUaurwW<$=1w{Kx8tUR0 z>UCM)Sp9r_-#w*%+w|gj(hRyk&e|(%+I#V&+NQ!hhS?|Pd<$OL)wj9-SD~`b(fvzm zOZ?{T5H{B2KWm(AsW{QKIwdgwNn2XuvzI%BBey9dX2j&|GfTgQ(aI@#G{7C9>*G4w^i^N7;A`QHlvoUqs{s8sy= zNq@cM#JvmlKDffLr_Rf;D&GEs4##z+ESc4QdyksVPe?XOjk12+rFQ(bhT7M?N}Zc} zLl&o5ZC2_Ibg|swxA*ip#d7DDo0)vWO{S;^HgeT}J7RhuL)zro9fL(DXD)fW>-AHf z+_lFJ8P1CQ6m|YiOF&KNz1TGuPd;RGm)O(&LUX(8(+8)5=AQq|bYcqsil1zXPLBCo z)>`b!f4pzOW`XshFY-et?zMIN{GP?YpSL0GScaFwrd=29&pAwbc(df#yIKE?=4yWv zoqchW#@fr-i~?EpU)$Y+|3}Q)~ zn|H4>e0AfisY?x)F8fxaaO?MF>1>Ue_Wb6~zpt3wdZQtsQ)K;TD}Vi7pZlMUw%(fE z7If;tw=4!R?``r+c^(SOujalr_h6@Tw*D#AS1&d;sjYAN#^2I-&&|VIxNGViA!e4R zX_9}oGKBoOu5h_;N9A&(49*Lcr}s>m>YZ=8Fzj^lv41m4R;{zsTwZ_MGv2*<*YQu> zbI$aH;;q`tpD~{hdDt_qO5#htj+m4_56U(5{5$g4^;oXa@ zb!Vnz#^^8Zl(f2Qm3wNQ^RgvVZ!{Jk-hX&%ANz6^`Quw3yq|mT=9`fJyH+aH-~ZQV zZDhW*>*7i&+f$9FE=*ZuE@WO|+}RPV}fF}FFT*k{mi`u_D!W~)h>htFKLs^?hu=FL;#_hlxw{_&Hw4J&Rv z+Ib2_0Y4z{kLPmQ55sCD9kg{|QZzc*D)Udzj#%71!|hIEKq-YJ{= z9#Y&I^Ipt0J3F&o&!g&D==YW4hT6MTpWeMRK`A?GqSEGLar3n|y-loV+;AbWfv2V` zd~QcSgM-EGfJy#2_F{7t*aOd`@OgM0HeE6^Wb%s6T!VfFnG1U^WnHg7aU#z1S2*i~ z3%5I+wWrR$vvTd)RjhNl(yoS_OI^Eb{wmeCRvV{2jF7i3_EG-t+xm4^rcJ!r;y-I= zT%0cVcP(>;u}j!V_ucw}8kPUjm9+iqe><3OSeNg1HLmrI||KbiLa&%}_hsiLw? zT6379Uxsa$JlpTG?Dd|PUtYPmY0KqQcl8QQylOpB@-OeioB5qOmpIe}Zwjox#m-XD z@5963&VG604S^#)&t?P)PjpRLrB`0?oqOWV^)7DJA5%Z>a(OoW__92aDpTu_-E;C> z>(kH9nR)DI&R34$?KyuGW*Iw`zWtW=O~tS@>cgtryZ&@{=IkqF$ZtFGtoHo&+RO1A z&s2VFOWWsD-({j&eCKk++2eN~FW_%T|EXTjJTWpPCB^OHR+B#)D>zaw1 zQ~5hjP=8lXw3PSkv#hE{#pl}R-sLK7L3)pw&iZA1`p(Gl)z0nPk`oJ} zQzgVs-Cn&mLw(|jBf=AR?%E+Ww~YI^@WPX;ZpSG$uGv`RdCKtTZL_Z54u(;?RiD}< z9Njo6KJwcl$&~t)*UqMDEIDzc=-tEY?*KVR%+ICf8V##>sCv!HhhzPzF*&L z)%17!xHXFfCrL47ZC=52T+O5<)bmtUdq&)Azb~nItF&i!Et%UnCFJ6ze<@9mCSF~; zaHHhafK2O!x{K#e_pOR^pxNq!6);&KWKI7)bZ;2 z-SWA4GpEF6kA~3)E#HuzGnAAj2A->Pl-^O)=g)Wk`Prt4ZW%$r@!p4$ayL0B*MweyRud1IYSKIb) z;t3C7Wnt}GK6A<%JNvFkUTer&&v-!3n5k&;na~_@AMGz}O(|h~nZ7}*b}B|+Savz` zaEkdRo|Vhu1Xr`KK6++O=JX2-?~C5F=UA|}l;JgKp636vkM(;yEzQrFX5&Ha~J>?z=Oen6@o>FC!~k``jp|_RfzVDZG;IQ%a^hvktXvJhD_y zsk_f;E{~tRhWzgO*o!}9c5ZkZX#Pb}aJdYZ;_?r|JLh~Tv$_-L;K*&39}~9M zx87dHsPa4Y?exvJJ2!ke%ci{Pm4>%sQ`urc*NeMfypc`qb_>3|#m#8f{8vFn?%mF= zOE<@NEt*m%E~4)-)w5-5$k#m+?X=acRpVzYTUzqH>_-0n>aD^P>gFmj{=H$QzWe&d zELqpCob`e|`=WhMMt^@SC0+O=VTCb=nn}R7=A?S*6OJw|mqOP|**EXu{2_JD)%FDc z3E|T=FFqT8ee?I?2jvd2(=k_PPZz)SbK#HWb{u|!A0Mz)MMfH&vR|6g`$d17txK{* z@7|tSF$OQ0yv)lwp3OGtbu_N>YuIukyX)VMBT-Hov)C&Z2paj_lzr-Pg8Rda>RC_y zKDj?xey8}#sd~qL4d?SyI2zV6C>J{0&e-~Y(kA5^8KcHKyDk{tdaoPuRJL|yJ@1cQ z+83nMUZ^Q_GkxB2s`35TwKKMV+mI%>Ql>LnxBh)#bqL3+a1NWrSLS<6@v^mI+seqd zc}3@`(>5V*d%?w zJkS6B-1$TP$`#zZ?x@!ATDqBPEYo4`&8%siwf6Mpu-A_^H5IQtsHJ>h>8pkQK2p63 zA5t=dx+k=Fs9e6%VD~KES+V}KWkzmods5!PoFi*pJRW^gmONi5b6M5;o2Sp5)_)~O zbft^C8xov+53ru83KeAvO4zx4%fFSrO`JPR)*Xu3f3qrn(z{I`escbw_#x~?MMiJM z!e63|&$Z*Pl?GMRHt*P~`fgHS)4cAzTRvS$4*&hk|3QGvy?Y+#yV{FTWJkDOv` zWBr)jdr6-~yeZp1 zEnINkpoPWg$-Fmda`$uP1D+|IZ$2_1QEG?My6nEUd*himaU49)d*ZH~g67R#%Mx|= zGn8gceRGOQjXC+7-P-`^_3PgsWL3KUDQ}wF3*q-wGZGxB-kCqLfy$2Q<#bG_KTn|rrn?4dFBh7dp=ULBQk*PHh4s@3wMJ};aKRIv@-W-$ri`C+Ygzp&1=o=yU?Z3YTX#?b;MNH zZLz1NbZ&j#h3^7>Opo`yuisoZ)w2G;79DS!d3q}*iNCv2X&mI0WME*iWk#Ba{+kIO z>YaJtl&U3}(Weh!=*R$0{g#_!%=21x@|{`Xe7A*a%&+skUJ9`)TJdh^nZ zo^G4-VJ7Ff&sD}fWSuS4cuCQ2ZAfXIPjvk~qfd?N?Jj+te)Ez1lWjr&Cb8X`b?K3Q zo!yKVr=4@1b1t#zP7dThd(S~DHr+YKZkD+V=P{kAxKEL#zY|%z{RGx&*Axf-xaS}E zpA8g+|5mJET*k=25X6iYg_CD!$ka#O&AV+TvhRK{$18)J11X+mldt8yNr>KF>JTmR z_h#-vk11z*g;={bO^$sRTDE)njm2*~%RIU^rTlg2yqofN8e6Vw-SZD0tnHV0%$*yr zcI8&WJmG12x%H23iuo~%O)`nQ_5R+!2R7TzhtHq8QA3F_u0=;fXbzXUc(}-OF^=Uw z>z&H=-Zm}gZY!FkA2j7bjban)>4K~lvC=P2yi22}Y})vUD`vXbkDwmWX*b$*c1hT8 zV!FQ6xo=x?tE!mA+HUupH6K#_=5|;zdK;;nm?t`Y%98zhZ?_8EJXE^<_S+Qe*#>gE z|JB%)hvugi1U%f-6x_MOURVS_NLz8{(8q;F+^;ur3cZ&5Z&w!Yu>9BS zqn~4AKBl~h5W2lU>w${2t#9wT)5gcNf|oYy=zubpl8_zrEK!*M42LxO;u zf>cP)<|W-G2kL+7Dah=ZsF;5t#&1{n=g!lG$9AmX={zQGosb^2^i`C~7W>fD^^M1D zc&ryDoIBIHrFBW68B4yrN!Cq+|Ha{rufApn9QYp7xiX01#a+>8x$x7DN4iX|WG+8> zV7lZpmomjwN5pt}zjiEqBc^rQbjh-Xff1a`)NZfREM1j&##vc5{Q^vgAzdrNzBksD9gSq|14oP`dbug+Xo5xRNl{G}7Ue_J+w zTB(-5*HM#2bBZdnFUQ`fTk#8ep89_)*mZH6)GF0`orPSR+n$`WD zMM;Nc&E9JMWBnV$GduKfkKxODEpZFWBg>xW__ll%$q(pCn(*>@Hh+cswY`a~?aR_V ztWW-WxAd#jaaPwo*U!~WTpao4+tJjU>&z?C(iHmw98c%YzZf%XjaQd&f>$o{c>#Ar z_nWs)Dy%mUXZhB(i~GWY)>J=_qQ;<|xpU^GCAly1S+;G4(Pni^rELo|dbvfM_3QmY zof)1w7i@TUSGqdBl{r*;>FU4G*3mItictVLo}#e1Z(>u1Rs-7Pru_X7TrAM;If~NB9$MMk872B zy*ahgEv$dO*4|ljSyDrbmMC7-XOwo~{_`|E{>Y<~o4Bl}q;65Uo!RoVaowzQ>-gVR zE3S}Zxu%<3uXN$s+c+30Eri8k9N52Y=79JZb^~M z@en6jaj{8G1wM1Ec6w<(=#PqZ;hK}|NWS>WN}UF;qU4ftHa(j zwLjUA7Hi4tvGzYR3wuCqV^jRoOViubHnOyPtq$e;by??0@mJ%zPuT_9Q`hZ%-D%6w zq`}qnahll6zc;mX-)_2kclRwF`P98W3UbWHOX?+7C%th9ag;G#_D#vVW;gSdzT%%> zxt_F4-XQQqqx{HGJ)LV440hk%<`#WKBBW(+=PBJAyUx5`X+Lw8)dU4OXYr$gB^77g z);+9VEAGSbv+&H~PV?*L>+|+|F4g^>uq+|6z1O$;&NOkiiu_-imHtl|9xwcJC(o*q z!*|*(avyNrrm-kOz|5{O2 zy*l*f#07hT0pY}NoHwo2H}w;6d@b3jq43V;BwMXIhekM2F75y zg$9a~|HpEH^}*zL4b9{&`U2)adRjERge@qch&snbV?EG(=?1wy*QidAIxFj%BvCmJPiB8jP1QS7-RStFwPEf9_!W z0VyeK1a+_~CdzC>_6KhK+$?f=g|T)q5V;fJ>;58jz6cY9a%uH(VANjr|; zdvIf(c)4CuP^zLIP-G8I(zc@*|O%d{r&xW)fXmOFIKx^Qor_P zy)>5%$LX`r`kqdg;+xf$I$`!s-y02QQ*U-Ye3|)FIW^pM);V?lw#mCPOZ@8-ug*-~ zv4bOQx<%TquCVo;Kd*le%zFRJ&MV{D!HDvp-!tPa-f0~&*t?qJ@YQVfUFLop*57*b zNdNEtUEvesEhlgJu9TYWYg%w7GRw62((3EC>$k~vdFgRj?bg?ORJl>|&%U5vFRwoG z?|UhE&g1t|wonbV(rZ5bFxb8dBw6jy|gA@U`iA;K#FX_OZ+LM~+>){?{@4S8Leu%i;PBHIt`s?p84?H~C?`xS+0T z%k#^L20SdiiGOBD_Id8Rr2Bu<;|Si>ayd8iR}>j8UwcJB`i1Y|sBixQmiAt~VK!sO z4ap6cZ*P7)b@k)VZN@(*uCsdd;@gM9y~not*%!nfyq$7;ciiOq8uk-gI@Q~b&J8PI zl>M_Sr8z;TVD>}y{uzP?7TXydxF8YnZvB3i}*jer{`q=W&T>tv@v{hxME+s+q}$nR6Z9^9eY>;S ze%BRd<-)hw>(YCkO?#(uYGw_map!E$x}85_=2x4|%R0;W;Wel1wg1-3?jLA-cvdXx z$72aK_H4VEaysi{{tBEa_-`z8-X!MTMZ3BJp1;x+1_j|qL?=b-XUB-t8?~ogbFbfY ztHJpE^m^Ah*HfG;PpW0|P7E?r)W4as@nG;NwP&i*B2(Ku)Mrnb?K`zi>+(sp=c=>S zE||@p6m2dlHDS}uD|=FeTiV<-XHSdXt$F3H$fuoOS#JoadOa+fEupf{F*9Vw{UZ%h zOiOci`tmHg6`<)ZIOFyi1uov!ZPriBOjkHL*DuJjROg&5^E=bm;LpibAqT^s9Nw7N zckIVamPKt|QO`;npRZ$lGc(<~rQzw~vy1Jv?=f8(Cc@=3&-wD)$X}nG=DFsom?ZnTCnWI~`c7ls(>{F>Tcd;h z8?HF68s5tKe+qFKf)Q$>dv|=BnwOx`ySpt_cmK?ne4Mer_wQL{zw^b?&|1rq(=xt| zukF{&k+GR&KW(b@u`?H(KYk3~^>m$$`orqi%I@=fum6e*d3mzYQ1(}z(Z#tFEm^01 z?0EgKnQyz2(;lY(iO(`0>hW(g?XhKLjc2%P`Ze>@b(MRWlJ@mtte5(2-7d8pT6A$^ zp8t-6fASoYc%Mw46Ww&hs%~Cy@5*25{Jo=d|9|^FdHz4s?R)3v=I2-(?Dv-ZdXvZg>3S{uqMr2RAE8x$ zvd$k?tGaO4RrbKove4P&ykSJ+43M-WhciWu9+t$T`Ql|(Y*Bi6O$QN`Zjbc zt6Y?Ic3&6*_BSu@v~*xt{+m@F(nQ~W)0ii-+$rgbfOP(z+sO}Co7cTx ze>gDg{o(D~?%w`=r#gQB#H-n9Ij^t(4h&mwTK}>4ey#nfS9>34-JW_j(70;h@%+Ne zJ#k^V(FZ>B%`sVQ?x`C2>&vZx`BjxS@@C9j*6DSvyYV*Sa#g15Q325kCk;EM& z8?AA`CFCIMNeBNlEm_DQd~vRSh`TtKfnaEfP)h>_)i@1wqV>N2^S1smVY91&XtC6s` z-Zr$v@tnr4fX2D=TqQf+O?lPh#C`MT@_TPWgwCJLxmdnz8s!^z138j+(8?S6KC6K~Q_Wz^T1!Jy#}kJiT{i$rZqmQotv<5O*Q3 zyaiU10^ae~drQs!^GJGIKTpo-GC#h5k3UX4UeCAbW}wqz&DkOMX8+aAoa~qN@YQ67 zQ+87v_th!sHn-0D_IR=7fztD~)r+d1DXh5v_v`ed;{4w}SpGRW*Rsv7#Itt)zen5O ze{|T+R_v|*i23>ln_{b?oex&8IOkq$#WL+*Lc}|-Y__F;_KSztvqZ6elGCw^zIy%g zL&rB(cfzjK7~KshNoY6aVV=(!l{(qjH28YwwriFKDqX)?M82|~eiRg@k+xvV6vw$m zY^7R~S5~G4ET85$cY^;z&x6(4%S^jWO!MAPtg}k%lDhoG-AeNE7mr<1+si$p)^2_= zVd1^YKc5^d5Oa+cIMaIU!;^Xj|C{;mc>DftdAP3cZ<59Fuen0!53Jifqj}%!Yj+s# zeLka5y;0WYzDz-i(4ooim%T6e`(*ab_1E{s?GVe$s5vgW^Z0%f@%V@G*HSz*r*7CB zl2NYM)XUE4D!g{(-lB`MCh5EP9$Dn{YSE|DnMSQwZm>7cxIC+P>1VSk*KS`pS7uvp ze5Wz_*LnTj(Ghnd=S0_j@RgV3nUnjy??$c6TRrwiktYt`ebsk7_BPLxn~`(=$vobh zX^}c%Y5I)jjfs_a-j+%p`MLai44dID^Zz={65oR_Co3F(*L26~$1Ant9&(+%HgnRe zcO7+*o7%d+;K$E$gER)Io;9Ld_>Lc$+ZN)oXPa{`?i?tSv=FqM&@t2Fzt-^; zm$#`4C%@X6I^pTQ@~yiiX3csQ=v-<2EVpLGjZ(Kg8Grv-mtVDfe8PNl|C}S3+N zw`ctvnG>^Bx$950HJ!AMPJVoLX^8psqEc3`{XG?*IR}-&*@a`eUabuRokW zmVYRoXG(+9;r$h8}`L1;nPL;Bq(3fB zQDgHu#oH-8*G~f08=t`V(P2gynlg+feQxByVO{$9f%DwrJ#YK0P z`iV#PbV@lL+I&b&MD)oX3BMl0IUa`#45mIlq$8P^xd0RZX-aXkulX#|QEr+%nZxf3 zr(cR^L6UN9zEY|r}S=VT8T7;Z`AlVm*N-_Wme zAf5k1iWQp!M}m!_4ZD@SP4cTrPeXN!j?1Oh@4A0{hg3mhwxay2=6nWo(_=5tl>095iBqy##<0wbqDhWkB-jWxm&mHi&k$XAHGfC{9(4<50u_xJGI#m@8wN10T z*K^v4>B!l>9VQQ#u77b<%+?f0blKC@9E& zSjk)W;Nh2TciErs^<)2{Z-4jRBfTERfFRSjK-SQk>z@brKdzopE@|=f-1}pS z^&HYdZ-3wL-E`pY^r`RiJM<^dTyaa$&WvaIhOUo_Q=1+XB!;o5|87v&Ji{V$>V;2E z7M5)VMMnklG8a0>m#J|qU*c}jDtbtj^}w!8{RKweEt91T9`1dnCc5x|n`>+R)t2e| z7KulT+9FfvTh_(;;M-;`uU}oBXlHsN&8OPzut)2DvsnN6d^`+{&sY>1J2NAf z+0NV1z&<0%A^qKr16S3JyII(pxpUNiY-(TsvNhgp;WDp9O(t>o*stu~`fRb_%HGdB z=}CU2-PIf395nY+X}sJo^CWH8%YypZ4~yLU3=Pue*=^|AZ~WoQ-Rqaim)5hbH+p#J zuK1m6F%iXz!Fnw%c@YyAvbb`snxtTC5>oRa;Kl;QwPKYU7YZdiFHOqXVRCVyzIFEl z@sD?|T+}ZU&{t{QzpJaioy*(iij;?+!M$bI?{oyNiLAWaGkxDO@o1CU?KK_?&SjjF zskV@>sCdItdzd+VTYKk(@ZGTmzhADaujR~J|4v`eFFIVd;QGr_``Gz$jn}UF{w|i^ zlD}@f_1oREiez)oD#tU1IUAdH`#kzD~ZC>p1khARyy}mxCUyV#-rU=UBw1?={v#pFe zs!*CaAC!I03yJg#87XUbdj2XkogcV$mGP<%tN!ZM>gsRH_$ep(HTX7b$}BbMxwBI? z8~+pZPcAXgI%(u&DCRngAv{7Pyr$%)-67HSPAio9*slbqJ?;3s<@!^#X9qT(th~~f z8`<`GqVUysPxspwG5wmBukwD~{rx*x>n-;yyuJUlX7{>=bCr$u;`yJKzDc_AdEM!~ zq4#y?W`6bzH&xkZRKENkPj~mGW|tGcMVkH}XK`3D|Pd*F6`9{vX}teSNvlZ>m1;aoTD9uY6tb z@(T{_LCWzyDyPf-n;zeGK0H)oGDqe2Py2Vi%b#<={NsM5`zIaE`JI%nMstBu&D`X`o}|#u=SwAyJX-$i>h=!-{~B&3Ui}#UL1>Xp z#_}qL*XEyJ{R(JFyHo!)cVEKE(>42!bN`)gXQVNC;hS3*au+?x-~0Nu^xD$iBEAn| zht@@e7C3G>W>-4it@w4+ zM5o-~n0$rZykDQAjORRLnD_9-qSZ_xs)omwGEI3Zs>l106xPbwzGsY6JnKF4-HI*?uU%{X7f0Ox?y-2Lj8u%LT&szC`lj14 z{LO!~CwRUR)roxdInU$fod%P6O6);T>rZGN{PydFM|2yK4iBF0j<-RFH@FeJiTUKV)K5yvR)zd-Fzb*C63+_iH`WY37JX1BPQnZo&(|w>NQS$bkNlI$X?U&+D@rdJ~rn4 zZRr}L?bepdAKx?f`?Do~#*M{y_`{MPRUbT}u#+ccQuwkhGbGOcXI?49FqKi*Sy`6t zQMkCU@MMOA3fuxIv)EQ}`1qV*6am@0>DUnl;p*}&Gc=YSJ96*tzQm;U{4Sx7Y~1JX zVm|z5-tUQC4fUTU^vmW)oT&6F4+!~r`CH_^)uLPvkG^{;FH^XpY<}+fm5~#xrgu#E z^;B8&bf0Lmj@blHCg~{MqU56$ixfSkX0G5_BO&$DKw$pKdEc&_Y!ld=;+&MUNl_w2 zy2yku_q z(Wxq>0g55tZ`Xd`cKPuIch5D=4M*7-gVRkEQ*SoLPH18?@)CAg?wXe%eqM-W zjBlJk0k(Og=uyE{HmfgRuNVHza!?^qAZ3>33XV;;la8KtxY(WBwa*{BV(T6FoJ=!fS4^Zhd)h-3-r?{i!JceV2VXRPzz zY0l}o+Iso!`A4fv=H$sZoSUrHwA7}1eN%n>!K4!%jj!xBt({R<;d`Thr`pu8*iETZ zLfYG3y^^1myJmvy4YtY*uLZ)3cf@k7>s9A#3Ypn_>cG~8C;23+k`-fS&#>iSd)cgT z`;Q~9#)7N%B2vayCmnpxsEf=LK2mG4H(xEH;H>%7Me3htWqB9YOk7cOx|HkQ`pexe zPe0qq*2lG6J^D17`f^$MnqMCl1~C?Tiw zMYn9zgcTp=n;XA;73n0j|H-MRt?~l;mmZeafBmtk`s%Yq$+uloPyJoE=X0`A_4S|c zjvV7X_4CTrR}a{h*;p^{nz3{8q3EiBy$oBl)K@Q7n8}-D`Z*|bqBPerW4?u}Qf0b& zK-vGM?C+qYV~QdvGESlAEtaUI$#k7ze`L4QoZG>C{+d4ZMGXwmvOJB^d^}YXcLoVR zyd^h(YyIJ?grlVGC1Nt@fO~_!`SkP^^{UsXZ&18j;Z=h7wZ1oNWM7r^>)LjlS|S(ujzDZJd*cF zJ3h&gN#cmcXYRRTJ2$4-c=Inhbt#x_8V{(nI)5Zg=xBC*eCNeQESiSi{9K#9ELfHP zGEjK)7nf(uh4b%7PgA*l#D0F$>f#GLX>tzBBCRT1Y}RLeJbZE@+e0oJwov(rtHKX% zw7Dm^EXKI;g6Ca&N)QX9nu?o-`Rek7Rc^ zaR2gg%hvG6b9VewI9GYivPtFq&)OQ%v~0n*Hm@J-U(mn$kL|yWYW3H8I!)g*U*T2? zTk~w5pthymU*99UmI_}LJbx-7b;42Bjb2-W&uxGHF~oXB*2*#^Q0Wo={cUB^Dp`>w zw;V(Lw=Py&cB>N{&&MM=)fX^mpOk!+f7FZd*!iIF%D~v;UPXPs+}0eqFSO~%efNN! z@eU`?&*nIMKtAZ)Ys1gW>QBA9bJ5oJzWKMkdQDOOZL%j$&-Yin)qKb1Mt@UZuPwKA z*x9MSPfm5bC4NN9+~0Di(Y)F0p}OY&DN7DJ{CQQBnv^Fe^5mIg==rmY)t)_rIOKVZ zq@N4JCkD@w-A5|}h2xt~ZTO^oqTb=T$F1$Wk6#O%e1EWS-k}f>N9NQp z?oYetON7+bg;X8<&Gsl{_xq$%Z#{Zu`Di;WbDSi3L}fS6eFu>(%|)lBIv>q!5C~OM zn31>cZe09MS%Ll=uBrwdk=`J=Y?vZ5qEWsxT)PCdm^A5Bhj+?x}h z*y|&FSpr-%>6A&w-1NJ3Wcn!RfF4UyoC=pTC&vv%E3@UOI~divu_ z$-A2m?zbfuf8%)&_FzMQkz@Xc9i0nz7ayPTV7{bI=FJyZN|qbcW-*^i>6oq3xV!t3 zDSMx-#O%#6o=a};o4Q{?v}D%Zf4`TdbO9i8Cy^Ax<6joArPvy$Y_l=FSv9#5ay)3b!9=IoBp<^M|@l~PPnw(NK?{! zaJ4q+8MHqC{A!-eg_h+q3e3DFf91uB`JeKsItsFgB>Q{D>^aDPL-=~_mNnI)HqAHx z`l^S8a9I2{uFWW5uC_8|o9A2E^0M!{*vI-6b~B$;o%VWu?#{<$&ua@#cgjz_YhE|i zASAMRVc>&Jeu^Gu${V~mLk_4-dz+wf#F&XQM6%H+GRcX(4IJJ#k7#O!Sv$C`mVI)h z$H8fWphv=N!4(WfK0fTAlvlf{CS}LQ*|~mEXPP9=>(&~S*(QHDTQDnS6SGplwl_BQ zRfS8IuQ>Jb>D;ar9@<+xUfBxSFW4q@yX4D`qI|XFz+2yr+_lXO)U91RBRF33x70l@ z)x)=ci&;EY+m%`%byD*DL#ADpQq^;^qg5vVIV>|FsXx;Y zYLanvx>_uf*=gCO^to|||2x|`zZ95$&9jqzb?(FNhc*IQrL+EhVfj_waQ%fx=(Uhc z-jIi{iv0IKTKw;>;QF;qtE}sPG(_4C( z%s*9V=fPZ?%t--Tmv~O>zV zzHO$_n-djA%V$XJW!=5)9plW}48Mv=rk*kB;a@=l{T@fB)?44sJS}_qv5rt#+hXh6 zmv!H*%q$L{Yb^A~Bz=nTW4D85<&*x^iuYfezcjgC=7x<+@H)X}URRe@8~#kL+AFcM z?`(s@o^KwG7jNCd*tZMH>y#y=J}Q% zd3!PSvfQQ%0>Rtc;%B60r(6>Jux7>8y|W!n6z1<+yJ>deR<@pH(Or_$W5W0Ot=lxa zc;T%JLCbSLbMOBhC%0aHdUv?qs!1pIGfq(KKTkl$IHA{Hv(cKy6t91o=*rp|Fa~g z@0eKR$qmmYtFzlj-aD_Ja5P-L#5|*&SLjEUy7s2slXM;9vTlB=b(*;I==#3vHxk9}BeTc6nq zok;zARPJDZCeNi$yobVCTpQ+ub@=RkWMy)`H(dsa1+^6%OXCIkzy{N#teZjX5nv7mTIq69Sn9&LpxlT@+yHmTFGmYZmBnQ>>4; zV!-lQqWy`7|4t3tr!rqclx(Li`VvxfA-MNTNcW}SvyT3{mx8su{B^5s7q?H8J|ezE z{Za9S;-?q4YREZReh}!Y;1E6PtidklB*?#TQ3c1-1I`+c6hlP#7s^y{xZ1RIJyM*) z&hPqIS0`&vt7Xr2K{XLqPD=-;BOI=ZPT%TVF7%z)=Igud%;Da*4TU#PImqVcJa@R2 zyF(~v*;{AHExV(-%Fgc#-md&9KX`II+uLleEytIg`OMs)GVA10@Z&$i})6x1gxp|(shLcr@z~zb3>G}Sqo6-Z{%xa$Z{bKf$ z>Q~oK^wfXZBfhC#XlM7AJ=$L9cguX))A{9yz1S7|;tQXxE`8pmVY|Ng!sb>bKG)Xb z4DP9o&f-BSHvioHzg~HJF6YnrxbtCKvO1?Z-K?G-!}k1CW9MS`Ig92M6jdDPoR{BK zwdZ8q$!P-n(lfcYypO!`U7m63LS|0OJ>NTT{cYQIcjnoDH|t;D>}p!qdORjNm1F0& zqKZSkOk%D_wTn2yT`qPlY7(`K2uv>JAT(kU!K!z z1ze6OM!YdU^7L-O_7efe|Epj6;rl4>-;C}oOUoa>zLsS9&sYC;=kF`-zhBpU{hB?) z^3_!_JKp89>$x5(27y*6ME)|aFws3&3)L#HJZLx49UlL&(d18gnU zniylWlLsfijj@OV9Y%<}E}sXy5+6o%$T2V!rW| zrX^G+*T;%kgN#RBf5rutgb`m<85oL7Dsxg%42QW`E $@ + main.elf: main.c startup_stm32f030x6.s system_stm32f0xx.c $(HAL_PATH)/Src/stm32f0xx_ll_utils.c $(CC) $(CFLAGS) -o $@ $^ $(OBJCOPY) -O ihex $@ $(@:.elf=.hex) diff --git a/olsndot/firmware/main.c b/olsndot/firmware/main.c index e4b3935..1b3e054 100644 --- a/olsndot/firmware/main.c +++ b/olsndot/firmware/main.c @@ -3,26 +3,72 @@ #include #include #include +#include /* * Part number: STM32F030F4C6 */ #define NBITS 12 void do_transpose(void); -uint32_t brightness[8]; -volatile uint8_t brightness_by_bit[NBITS]; +uint32_t brightness[32]; +volatile uint32_t brightness_by_bit[NBITS]; +void hsv_set(int idx, int hue, int white) { + int i = hue>>NBITS; + int j = hue & (~(-1<CR |= RCC_CR_HSEON; while (!(RCC->CR&RCC_CR_HSERDY)); - RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk; - RCC->CFGR |= (2<CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk & ~RCC_CFGR_PPRE_Msk & ~RCC_CFGR_HPRE_Msk; + RCC->CFGR |= (2< 50.0MHz */ + RCC->CFGR2 &= ~RCC_CFGR2_PREDIV_Msk; + RCC->CFGR2 |= RCC_CFGR2_PREDIV_DIV2; /* prediv :2 -> 12.5MHz */ RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR&RCC_CR_PLLRDY)); RCC->CFGR |= (2<AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_ADCEN; @@ -32,26 +78,26 @@ int main(void) { | (1<MODER |= - (1<OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_4; /* LED outputs -> open drain */ + GPIOA->OTYPER |= GPIO_OTYPER_OT_6; /* LED outputs -> open drain */ /* Set shift register IO GPIO output speed */ GPIOA->OSPEEDR |= - (3<OSPEEDR |= + (3<AFR[0] |= (1<AFR[1] |= - (2<AFR[0] |= + (2<BSRR = GPIO_BSRR_BR_1; /* clear output is active low */ - /* Configure SPI controller */ /* CPOL=0, CPHA=0, prescaler=8 -> 1MBd */ -// SPI1->CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | (2<CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | (0<CR2 = (7<CR2 = (0xf<CR1 = TIM_CR1_OPM | TIM_CR1_URS; -// TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_URS; - TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_OPM; // | TIM_CR1_URS; - TIM1->CR2 = 0; //TIM_CR2_CCPC; - TIM1->SMCR = 0; - TIM1->DIER = 0; + TIM1->CR1 = TIM_CR1_ARPE; // | TIM_CR1_OPM; // | TIM_CR1_URS; TIM1->PSC = 1; // debug /* CH2 - clear/!MR, CH3 - strobe/STCP */ - TIM1->CCR2 = 1; - TIM1->RCR = 0; - TIM1->CCMR1 = (6<CCMR2 = (6<CCER |= TIM_CCER_CC2E | TIM_CCER_CC2NE | TIM_CCER_CC2P | TIM_CCER_CC3E; -// TIM1->CCMR1 = (6<CCMR2 = (6<CCER = TIM_CCER_CC2E | TIM_CCER_CC3E; -// TIM1->BDTR = TIM_BDTR_MOE; + TIM1->CCER |= TIM_CCER_CC3E | TIM_CCER_CC3NE | TIM_CCER_CC3P | TIM_CCER_CC3NP; + TIM1->BDTR = TIM_BDTR_MOE | (8<DIER = TIM_DIER_UIE; + TIM1->ARR = 1; + TIM1->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 2); @@ -98,88 +133,35 @@ int main(void) { TIM1->EGR |= TIM_EGR_UG; while (42) { - /* - for (uint8_t i=0; i<8; i++) { - brightness[1] = brightness[5] = i; - brightness[2] = brightness[6] = 0; - brightness[3] = brightness[7] = 0; +#define HUE_MAX ((1<ODR ^= GPIO_ODR_6; + /* generate hsv fade */ + for (int ch=0; ch<8; ch++) { + hue = HUE_MAX * (HUE_OFFX + HUE_AMPLITUDE*sinf(v + ch*CHANNEL_SPACING)); + hue %= HUE_MAX; + hsv_set(ch, hue, WHITE*(1<ODR ^= GPIO_ODR_6; - switch (i) { - case 0: - brightness[1] = brightness[5] = (1<= NBITS) idx = 0; - GPIOA->ODR ^= GPIO_ODR_4; - TIM1->CCMR1 = (4<ODR ^= GPIO_ODR_6; /* LED1 */ - SPI1->DR = brightness_by_bit[idx]<<8; + /* Shift out the current period's data. The shift register clear and strobe lines are handled by the timers + * capture/compare channel 3 complementary outputs. The dead-time generator is used to sequence the clear and strobe + * edges one after another. Since there may be small variations in IRQ service latency it is critical to allow for + * some leeway between the end of this data transmission and strobe and clear. */ + SPI1->DR = (val&0xffff); + while (SPI1->SR & SPI_SR_BSY); + SPI1->DR = (val>>16); while (SPI1->SR & SPI_SR_BSY); - const uint32_t period_base = 4; /* 1us */ - const uint32_t period = period_base<BDTR = TIM_BDTR_MOE | (16<BDTR = TIM_BDTR_MOE | (0<CCR3 = period-1; - TIM1->CNT = period-1; - TIM1->ARR = period; - TIM1->CCMR1 = (6<EGR |= TIM_EGR_UG; - TIM1->ARR = 2; - TIM1->CR1 |= TIM_CR1_CEN; + /* Set up everything for the *next* period. The timer is set to count from 0 to ARR. ARR and CCR3 are pre-loaded, so + * the values written above will only be latched on timer overrun at the end of this period. This is a little + * complicated, but doing it this way has the advantage of keeping both duty cycle and frame rate precisely + * constant. */ + const int period_base = 4; /* 1us */ + const int period = (period_base<ARR = period + timer_cycles_for_spi_transmissions; + TIM1->CCR3 = timer_cycles_for_spi_transmissions; TIM1->SR &= ~TIM_SR_UIF_Msk; } @@ -245,3 +221,9 @@ void PendSV_Handler(void) { void SysTick_Handler(void) { } +/* FIXME */ +void _exit(void) {} +void *__bss_start__; +void *__bss_end__; + +int __errno;