From 85c30c625245079eef15fa848c00e183c0bcbaa0 Mon Sep 17 00:00:00 2001 From: haarer Date: Tue, 14 May 2024 07:22:19 +0200 Subject: [PATCH] use build dir for other arm example --- .vscode/settings.json | 5 - examples/Bluepillpinout-4974006ee90b729a.gif | Bin 0 -> 145506 bytes .../arm-none-eabi-example-baremetal/Makefile | 71 - .../ldscripts/libs.ld | 8 - .../ldscripts/mem.ld | 32 - .../ldscripts/sections.ld | 445 ----- .../arm-none-eabi-example-baremetal/main.c | 63 - .../stm32f10x_conf.h | 77 - .../stm32f10x_it.c | 91 - .../stm32f10x_it.h | 21 - .../system_stm32f10x.c | 1094 ------------ .../.vscode/c_cpp_properties.json | 31 + .../arm-none-eabi-example/.vscode/launch.json | 17 + .../.vscode/settings.json | 14 - examples/arm-none-eabi-example/Makefile | 53 +- examples/arm-none-eabi-example/build/.empty | 0 examples/arm-none-eabi-example/startup.s | 358 ++++ .../arm-none-eabi-example/stm32f10x_gpio.c | 650 ++++++++ .../arm-none-eabi-example/stm32f10x_rcc.c | 1470 +++++++++++++++++ runtests.sh | 8 +- 20 files changed, 2567 insertions(+), 1941 deletions(-) delete mode 100644 .vscode/settings.json create mode 100644 examples/Bluepillpinout-4974006ee90b729a.gif delete mode 100644 examples/arm-none-eabi-example-baremetal/Makefile delete mode 100644 examples/arm-none-eabi-example-baremetal/ldscripts/libs.ld delete mode 100644 examples/arm-none-eabi-example-baremetal/ldscripts/mem.ld delete mode 100644 examples/arm-none-eabi-example-baremetal/ldscripts/sections.ld delete mode 100644 examples/arm-none-eabi-example-baremetal/main.c delete mode 100644 examples/arm-none-eabi-example-baremetal/stm32f10x_conf.h delete mode 100644 examples/arm-none-eabi-example-baremetal/stm32f10x_it.c delete mode 100644 examples/arm-none-eabi-example-baremetal/stm32f10x_it.h delete mode 100644 examples/arm-none-eabi-example-baremetal/system_stm32f10x.c create mode 100644 examples/arm-none-eabi-example/.vscode/c_cpp_properties.json create mode 100644 examples/arm-none-eabi-example/.vscode/launch.json delete mode 100644 examples/arm-none-eabi-example/.vscode/settings.json create mode 100644 examples/arm-none-eabi-example/build/.empty create mode 100644 examples/arm-none-eabi-example/startup.s create mode 100644 examples/arm-none-eabi-example/stm32f10x_gpio.c create mode 100644 examples/arm-none-eabi-example/stm32f10x_rcc.c diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index afe8073..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "iostream": "cpp" - } -} \ No newline at end of file diff --git a/examples/Bluepillpinout-4974006ee90b729a.gif b/examples/Bluepillpinout-4974006ee90b729a.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c5f33085ad8a826d591e6c6cb92e949c2ac85dd GIT binary patch literal 145506 zcmV)5K*_&HNk%w1VLAl&0{8y_009620V@^;1ONzX3k?}82Lna`1sVra3KUHk7#j#5 z3r7QJR|7kC002Y@L|g?X92yo78!=!A0u>u3032cu9zY5oiLL+u8Ye#!C`%D2R7@H; zA}BH|CnP2)Dj6zCE-VBLEoufYc2pw?4liRBHyqsn01GjS2tNr+DJU5->4?VCFK#GJWJq|>N0!Eq=PZuUdZ9YRzgf$UFL_U@- zFCI#QaW+&KS_45ua0ypxe=~hzJCAol4m(U_Z9zX#OE42tnp#IhT1+S!UO+}y27W^< zK2uk2Lvu4!e6BnhQ&LS%Q(i(`MF4EY8+;WPa*r!%u03GZTw-s4U>{>*Wn*JqF>r8| zQ+A|RB{^%Pl2}_uX_0Gf084CdMsq!@Tnbofg8+QrgJw@~Z9~meDtl*TWM{BpZ*^{I zi*j@|Yj1psW21F)Rc3W%aB+08Y5;U}V03hE9h({CWdN>ckPwr%v21P;kmFZ-@jZ@+ z(rHNHWn+_idoGxLv}>_(f|XQ`dwhY0gMfUgf&jvEUss6BT#LPkhjDF^Rgr+6jEP+A zZ$?9u(}RK5nvFEve*kolx21)Y$%Q|%jXYhg0C=G@kdccN!6Ac_rhKOW%#IF@lbDc= z(Aj~4vXW)VjA|#e*|CWD8MyHwy}J2`X2F%2X0ec)pr@Lc{hpzjudM)qux*Z|yKS+r z|Cj*Tm6;RVA^MPdoTs&MvgC=a(y^<9u&!(<&HMe5(f*l{v9On}udDo;ouRVJ>#+c< zv$+44{phkn>92xK)#;nq0Ohoi_=%-u#{W^~wJHiQN7F|Nfrv z`u_a=<^KQtA^8LV00000EC2ui06GNs0ssjA0RIUbNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGiuz(v7^V2AVZ2ANwTELlPFWFT*({Vj%brcUw(Z-vbL-yCySMM(z=I1PPQ1AB3kODFrX_6vU;MP=d*2mI>uUggRSx$)=NT z+UX?)yr45sK2;htW|>Z&ndVmZtfT0nj5g}%qmV`_>7?Sr>zPBTM#^`IFPEa|E${T zK(IOxrdEk+D($q?R%`9GlXB|mwmE^yYptXrWa^gTMzrb}hYtG$B(x%X5TMsE^K7qk zlACIr6gKCAtT}L&m*VMT_mh2q&y?wc2v)FiqZ$O0YrWy6X^=yT%E`vldJ2 zj~`mn+wa7^=1Y*Rz+(KZzWioo@WL?1Ec3z*KWy_$5ua=_K^5=JP&-A0TxzKH-Wq5- za0vZpy&daJ@}GeM3$)S(`6I^DQoTI$)?9a8Y0Wo>ty0cVV=Yk6W-G*rB@NjlYSU#4 zL=DNl79Fh5TiOsNuxp?HrM1_92i`Tp1WrPLC=R%e z1TOF!Vi*Gj7nKTMSnx?Im>~K<6^wueL|_pA9YqZ!sNooj`UWLdu#E~1kx}v>12Htws16ozgT&~<4>mZ$!JY7n z?IW7guCziM9wdhh$p-`MXG4p%V{?~lBi`CkMuGHgA$R;Cq^>ALE-FeM>l#O+P%(ya z@Uc-*+{P=K$UzT2aUJsD1SGl$xDtXfFzc9xCO0_^Y^;nR^57&V(^Z=klJQh5e4Y;z zvM)9o?P<)gQVn0p%9cqjXu;Z;%Yf*|Lo$jQHSpsvANfZzY(pNK*q{}O>5U=?laesA ziBCr{T=uvE&#rQ=Tu!#yYvc{A>M5Q^amJ0D9q?)>n;TZv;j#=K# zZ1&9ICnd-KjErHWcTVgjG1q~LN%GQBiL4+b1i6l7`q3LeU?enWCe3N`WrhNgmq1eC z&4Ot3dKr_(I#q*C)v1#r`B>LJtEmkb^3P|ovnRgr8OJ|~!Jjx}#{Zyo&|fMLN(6vJ zI~U~*7d&YI+xXyT@EJaP>+Pb+)j#Yh<+%vk6yIt;)n7&+8K_8XKz!sB{$ZTR%83j>^ zQZ<@aHB45w+EIddHKZd=%~&a>Jmdi&0A_^MPYF0fL7@keDn%B(cHoN)% z&2WzMllH*VEZe!NTLug@G?At*?{*>Zm;^ekJ2x}4W)^Zzw4xWy=tj5s3x2(`q_v#q zzT~40LZb&94E>K(%&VG}b&Wk7P3lsc`qXNk#y=;`>V$Q;(rvl4&@Rnst`5Z3vOzPd zcg^cwCz{TBY_+f%2J4H`b0BkLh)COoY1-%-Nf@ zB_DtgMKK0UwKFn94ap#e9764yXMdK!2KgYi8?xuz1=68N%k$$yO2esx+xE34mXMFS5X8Fe^-L`(Br&?MSCS!*@ z?#6sl*nj|lfNw^DUJ@$bLx5W{ddNe8R|kSq(L2+S0v8|yYPg1M*oJQShHw~%ayW-{ zSci6ahj=Ih7mxze04Y1jgJJ<{$Yw^%_Ja*qalB_GREUIHr-TLn$S;f7eER?|1Bg5d z2!O?i?DbBpx}pqXcq{l za12*s4;OJ0=XC!UGK0d1(ie90@BsZcf7R0t&QghNA_cn@iC*${ba#bT*k+!Xi2q=K z47h=NvUaHlb|2_-j$#O`D2wQrj_SCMba(-VV2ihC7nzhMR%H+4AP%CEZKz>!F*hv5 zaDR7_gvKZVT&O2+#|a1kg&wGldIgYxB%l~Hm5Z22S&V3u0hjwiV(DLEI^;00f>mtTMZUXV5d!0#GmphqxLq zNq@<3Z)YQvMP`#uxNXZQb=6~aJ-Lux@&l%od~A|;t8#=$nGjFuB-t22VKSN+`GBCO zZl>oXR_R@k5|VSdm1wDkVfmE}u$F3=n_npatT=kV8JD%mhGn^iCODgP36FRA7T2|s z3c+2SMsci>nAB4Sej<$kAdr!%Ks(tbu-7D)nP$=drly$sfGrSh9`)h65s;(sh@JGhWDw51yG-I=#I*{oNhs415r^c zqmQRSop<7Vm?Vry31lXEa~i3dX||#Opn=?TiBAFrjtKzRwt+Ot6!giYZg`)! z>7#9U0SQ``7tjDQ;FUc3mQM1gQ6ivt>V{7LYL`&@FuGQeq39(Yh;>)Gf7}Rre&Bkh zIe@MufAw=cU{{`;c_-+}W@`GW4~Uai=cb=HqvY5qvbm^hXsBL^pgsDdGSHt5kcJWv zsA-6#LRy=`N~?|9D1Z2w)G2OM_Ttrc$Uhp+X{WOa(5yc zeL)ET2f$}r!UMUdiD`DKDyp7P0w;n0cK~w-b~xF2WzvtQ7^{pjtNB{2yt$h}YMTHc z07$E}{FnGHx=}`3JGnaD>-Ds zx(gw4aVw@^`zJ1HZ?qD1(-@OLS#AFYw2LCNQd_)>D!GedwUk?iJYr~Jg+uP=lD;;* z)LXq?(zi+Rx5m4@3W~gvx4aksl?oG-DBoZRO&1%}V7=!7^gTNd9i3!qR6C?*^BFazv6zyz#lsz!Z`G7SkzzYMIE1<;32n!h!Yz6D&t7My18 z`@V`|2)}v(9{j-|9Ks?z!X#Y6CVavuoWd%+!Yph6R6Ds6oFvmAz!zM@H9QM-<|qI# z4ILl=KK#Q#9K=FA#6(=gMtsCboWx4J#7ryzGmyRw8pAX)4LerFR(!=+oW)w~V$*=X zLeV?p00A~U#?=b}n`Mtj2PD8ok2^ZhXh>8^?3J$D&ckc>Kqu z#t3@M$AsJ&eoVm7$SnT<7MixTa#G+boi~Bu(058;HSR`tpmmG{bD{$*$Prw~T7kC* zFe?pVdj!x|vr&!EwwcnvHq7`m`Or;j<#wVlZFy7>(l7{^h;`l+i3d>2KGSwy>dH!@>sa(#qE(1iz>zvRsr7 zU<-$0Vk%`v&OHt0dmvz$c)95S)l?*bR zkjX|JZ<&0N)VtJZ+|*XVUCzl$IOVyoan(2^%vzl#Uv)CwBqxU{h-NKzXkF1&~h1uQz-N}RO*-!!6K)4XAy;0K18m4{QS?$VjLfpcg)r!M5v3)kPEuFcI5V4fs za=ke$UEIp{(zWv67$u1I9oGYHHG^#wg>Aiuy^!79&1-6V5B`|d4b<2z24yEw?Hq3j ziJF@o-s0^PPu&htT~}0{-m9_Rw#5eh=iXXk;9tEDwyh>XQ{Sm~-wDCr63yehJvo&F z-?J;=ffhaO00{%p4);RPLY`6Apy15SzOv=Ai7nw^(sonsBt1=DSxtM|o#7Kc)R(Q3 z`;gSu%h}00;#OhLwnYZ{43zu4D*jyBajLsHemy>v4_)2cH2&uKaN`1Q-cd z+$C?<;Q+ABRL;I={=I5m6{1YaCDtV4Y#S_o)_5*7s~yXI9xOo<+_F9BJ6`BH&fn1a zF?7=8i`Z?%P7Qh8-`@h?C(T{Nz32f4DVff`iQI2j$b4?%vfm!bc+zw{8}4@Ucbc4X z4yn{4KI&3p_#2w4>eI;x|?1H{Dgnql8mfxfZ?SVcJ#Le#}o}w>%=Uc+k>8I_E z$L)YT@r)Mh_bcxsLhpjU-k^r>uKiBOmhiRBLuq~5U@L3+-3|i&=ablMXC&ARZ{sch zPc`}d)O;O)l4I%H{wUo}@jmZn7VpIvk02U<=Pa)0@&MLit=bzxHhw^g|yaMW5OY*AAjE?F!A% zdiBt9%>XP5cMhPj{(kH{WMW7_%DFA_2C>@GAO!#0Wxh~OF@G{eko2L(>`y&8zkuX9 zzu-mDJH;TzY#;ibm4l!B_8b!TFiuv|ys@;5biAvwtf?lnJ=PZ(`^n-6;lSG?Z*Hxx zRbJmKVektDpW}B;KAW$>>ky`*zx+|s13IYY_BamGKmF8S{nmf|*pC;{kNw>L-~HKt zRU$YIPyhgDQ2yqB{^+0n>c9T%-~R6Z{_r3F@-P1Y00mH7`h*Ms>p%qnFa!So{{S&V z;6Q=}4IUf_fYCpO4IMs&7*S$F02M7>#F$azMvD_YevAlU-3$N-O`bH_0RSkFEnU8Z z8B^v=nl)|S#Fh3mViOPp)0P zegzv=>{zm8Z9?FfR;}7EWdV?VJJufBwRP=6*ke}jUcP<({@v>{>(63ms2)a~Sn=Y; zU}6paxfSqa%9Sl&#;g~VUCwnOtb-eR?B>p;H-65XTJ>tyt^WxgTCBghRlmM;d-V0~-{+b===R&$3|OR~nR>EuAef@&nL~+mn6SjCYz`0*mNqJ) zK$UvZ*}%X7nW*Ro3yWIN0&|KYP(!5r15iK=gPErb5lLJ?z}v!uY&`sK#4*R<;=_mn zTl!%L9#jMvK%IQVs7MKa#83jrAcy3LKCqe#i%PI~yhw^|8iJ<_0E#>^$t9cQ63UIF z)G&>BXpR7Rs# zT<}k%5d1@uZU<~MscNr{w2eXZ4ENIAYJ4_defRYUR{*ql6{7*dd1lFC#|-#@Yl3A~ zCII#*sTh!~{AZjVDw@S5iz{LYB8ne+IO3Xc4WJi>1t!>FV-sGufrj~oIcB}0U1wU_ z-o>_EZP{&Q306R4LW)~P1Tn)pkxIvbX0mzl=%a9sR~2sm2efp?doz_eYpvBJ*<=?o z8km`DR$ZCYTn*L;O_#o4X`C6R`G{hbEP@-Pi!I6+* z>a|)t$ZyA;x~}PwpjaoR8CV(|_Ti*#i;k5KqYfIHW+9KP90#MeK3Ye4kK<;Zq~t3K z9)OY?;w1Rti%1rBIu8%$+IQ|p6Z1o_gne0+_2>HuCiq*1c}e88c66|n^4Frqe)*kc9_DTebV z0zHi6g?bn{q28V+nPPMda2gRD;lva^4RX+fu2NhGk(4$G77=po!;R|Zm$?EOWgg*h zViznyE(W>lMHf;U{{V-47vZBr;v+E`PGlB%EQUyELO~vwkB8C#z#HQT#EQ((Wkf_{CiR8H z{)~=9I-_6FOjHX34oH9Yd(a<9v?z5saSoQyqUz%HvjG)g0OG1m1GS<_UiR{a8c~=( zQXzn3F{68v>PPvKrMNoEq!@c(MD(x+5m0>p0go@K<`)QA$ca2Nnjb69MuyiVUja)D z$FxK;DY?uj`O=+h;v}3rxy5ZUaZm?>1&2yyp?gZGL#kL1E#;&@_ys_qvg{%)5p+v? z+3uYWg(yS(RjMC7iAWlxkUGZXq<;u$Rxh*FSis4ZiE4=<{&qWVGKr%eZD&Mf zik^6W$EG*MX;E|uln2h#rxKj#_CWfTk@BRdI|-^#oB30wLW?((%V|`lx|p3trm0tr zU{aL|$XXHgR$H}8Ah9~u%G7kKXGN=2s@fZ}wiR+(1*>$r>XoCWC$4J|t6TLtGu{*f z3TXvwV4DJkWH@xMhuzmK?wS_Vh;*+1T_Me4H3EU2BG$5Eq1ifyB3RA}RvT8~4O=fe zT2EF2u3Iy!hc%4c67;eQkZ1l&MyidB4ITC{+~{ADW5ijf2d*Vx84#&M2w zoP=T+7RHFR1AtdNWFpfd2`!ob290&hUP{PzBFO*)RbHUn>~feV_5c8gqcR8$gQNv0 zCUTflYz8O)xUDps1u&MpW;VCk&F%%pEPQNcy#heYcSf*viJ|5<^8*|){Kz7-oSS4= zc_-Sn$vC1s6>Y=;B;#lUo+UkCZnS~Udqp#!`@CsRcN)HNp7W*2YUfFpTF;t(vvu(> zXsFzx(5zjpSQJf_Mn8HErJi)9MJ-<5q}kK!eMj#qQh{uomlT8G$1(x{i}UJ349rHa zvZ3v4X!GM81^`2}myOx@#7u3VubzAM6hKr0sz~pE|MHDa!b_kdh zm-|G$Ns$px+ymYKa7KXtPn}+Uu)87zPy{{-Zjo(UyH^cQuc|?eAOH|x3?oX%=fve| zLtmFHvpz~K5MUw%S->c@{>V6PZSab?JHX`V6##+|@R!FM0Q1&2zwbecS061vGC23hEtTQm|dXX`qD!Xg+ZC7980QKZN1Cp7eL{ zKoLkkI(j9(EiIU%T&EiYp=88ySXb%eiw4@r9aI357X{@WQMuav?)HGY-Q{lYH{Jbh z1i9PW@Ap84-eKF@Ltdyd`@kcp47R4^j+4 z@z%D1$fG(RsJ8Q(yrV!6EvT1((y3RIiFIHEk(nlk7zc>)8<(($&6t60a)_f+2mrW1 zngBUFk%U38p9@(6MJT;`IK7ETy|ojt^HaS6BZc%shV*+k_v5?UgF)O2g5DcHp8`Iz zE4ri8hvMTuWLt(Ic!#WGzGP!UCxpIaI|6XyI^^qwLjXWb=)ST0zVr&eT?)dcD!;ZH zfqLsf0doQWPq;z#+qodvJNX+h`Ww9aL$&|oKmXIe#nZa3+kieaz?N7wr16<-7=RH$ zkU!x(ncyw};J}c8h(=VdKdJ}_c*K7=D!#D?x1lnK7{P3)fkBxENr0slY(a^5!PPrM zIvg-$C;(?j!vI@D+f&1S!#xmi21^@5A?!6&E4LzCJf%~@Z{q|-c)}&bhhl^}ec%LU zdj}vOwbVF&>!ask9@T;g zkc*xFU>FooGzWh)Jx5Eql>ndn8L36wwr{$m^?TwTta;az-F{Y@B2dZ+D5Bt$(bs{*<-s{yoWVJ26UuBbKE&~ z^fz|oj5}mGgi|Q zt+d1Z%SNh$$2_#j2PjK?{0M!-JO{B92CRogjEP3PL~de;M*JI(pu~!}#7qQ*P23|9 zjItKFhyWM_`1uk6ImL)bMSFw8SggU@)Vmy{xvMP6w);VroK0VP$zL2k&8$gl;{gIF zKx7n90@a7=|>PYG(uxSPG&gE_ymJG`6E9sJEY1PS~ryyASv z!wX9=ctZ6$z*gGF%nOu&oQZXKj=X`$hggS;>455t2pYv0x%7z5@Eb&sI}CNbwsSw(+fW+3J>1+qAgoYL>d#-x%=Fq!FI)x!1x+v|&?fA|f;$BNWDGXa z1Urlf00Atw3C+@X`bLY$x0;(3oLfv`yHi?R$BS?VcO=f?l*fuoIG?Pzdz?J-Je~{D zIHQoxkczdi7{McTkR-J=wY!KuB?m8&x%z~+Jf$}(rNN$K2P~b_GuqM!Wz`6k(^Tyx zQo}Vo6I3@lK(%r}&+9y}sMHHnQWw0nS-mq$sdCQt_m+prbeu_fEGHQTdA+q6~NwPjnjZGj{Ru29q3^qGbhXoESx+q~7=z2)1!_1iXR zfkbi%8chN_Fx@>ZJuIhy?u--Xa=@?)Bd91>f)$-|_9<871HI z?OxQqfc0Hp6L8=6h2QvvU-qTn`eok&C^N5O+OJrG29V$X1>gV%;0q{#SwPGGY;b|jxi~w;v4?AmfO2G z)>Hb!g2ntn9kPfY6t;?}J-)-Yy@Sde&SDEzV=fNj7QTRrFaY-jfJ5G31GoSaxTFSf z;WXyhO9l%w24P9A2udblN0tFd=41e%WG6o2LRM8au3{<8gF2Q{+G7X$133KLJC%%M zcD#pH4zLalu)IShwTwI%S8* z<`7Qkfi7r~MrefwVTSf+8itH>&f!4TXIbfn+y&~%A>1(38MDkX%1(k zZsrkY>XUYAq4rl*ZfRhSOafawIwS`txXpOJ=|8noeY488Lr0&MV4xO5wcby#=HRa( z>jrQE83^bOCLE&{XQ#$86p~1-ZV0=q2p94Q%LafRplpdKVTPz7njq{AZfp)lY{eF6 z4leC#7HoGi=QfUDmxjtUWW_w-gPLx;yUt4gxYNOUuF9Tv>z@|pes1lh9BmFh=z$jK z1~BOjmVm?-XXxN;hL{G-_UwbC%apSo>!j?xM2Zj~Mkmd4?9 zCNTG2zul}qau@+juxp&=J9Fes0n2B?;F`dOn45~wSc$msmFVn<*n^C*hY*wr!fx<^e((feaD!&>6K`q(=cU)SVjj@Y zMsQ_VcFNu6JDIa-{LV^Sr>0 zr|!AQ-yWTtFVK{unsSUGUBZTP^H%8pL~imYFYgXUX(Nvy7+>W^_^46!H#on!QB_R( zyYG3nw+}@IJ_Y29*z3O@?x1G#@f&RmB5TD40HrnoVUqv?2jjGk32+(*8ODn1#%4$# zVMljl5@vKxkMcrSS+>67Qa5!L8}z^yb+kL~Ge&PQ<_a=yiB@-Yv|e>1a`RKybzLWN z*}V01qxD*kbZf2&SqF(=7k1N@^k2`HT;KI)x8h!xVP>~1WKVV(So2sXcG1@KYkzfW z-`ZZQT4*PC9HxbWC2nvxGeb~nZ+~F}SoVhA_L*RJcOPPSSNCv-jB)s~a`$%#ZrEwi z;(VX2>gjfSNA4w9+DYZr0yud8gdb>yC-~gq+7fVri^uqk*Z7U+_>TAZj|cgX7x|GV z`I2{n7Kqznp7`0Ch7@oC`-S`JQKA1F-p(za8Q&fl$ze zqeuFrSNf%A`lfgKr-%Bem-?xvda4hF61W5H6?!wvqhj#-uLt|E7yGd%`*?@-vYH06 zSNpYJd$ZsAG@+SkC;?r7hPt==yT|*y*ZaNa`@Z-4zX$xl7yQA823;rtfmivrSNxVR z_QkJIngInqApFUv{K~id%fEa+$lk_hXxcte&ff2 zydQo(X8uqJ0(qPL;P3m~Pj}y6`BCWwOoxbeAQSH|R^ZqEzej-}i2l02{`S{}<*)lt zKmimee)n&GyT<|)NdEn&`%nM~0(_uB3x#4J!GsDIGHmGZA)iR=CQ_Ve?;pmD8aHz6 z=>@Eo$^A(xgh4 zGL>nsV#P=ZA5yJqm7qag5Ofg?f<*yWT?Dv7!@`FTmV{mviX}_%AT+pF=hAf;5h}%t zP51Kc>-R6Ifz5_%Yf+O%y6Zq-V5 zZ9;s$Hk3%6EAN3IP#E|@n)9oTp`$kX`uxf zh$7VJP(cV{fsL9V>xH4fj_nEnfP&}hY2&q>{5|~m^5?(&jW{@C`ug|t@9%OsRL!X; zTPWw9S6+1mp)gty1_FRWSJPpYo#PV?)mp2h#`vTmwg;1#*uI%s<I2)JX`9SQz3M*N@}L7#oKbdDtS8O*;8xi5s1`QHoDm zc_o%ay-1P&fJe@?BUTXJSm0P_DP-f1Wi7~E30MgfW}04Fm1JI7+Ic6Q#zm>olp0l; zC!m1}y5&S&%2`!-3AJ@2bz{jDCUp+xFyVPvxTW2Bj~+UkM70U}DX5_i)~BeYn%X3x zn8mm$tF5}aTBq%uIxDTUwnVC}x$2r+s)oM$E3h)sY0<958k;Mw$11z5W2u6&YOv8t ztJ$#YEXgdk**cl5w%vMLRI1YeAmp^=n%hu;(_Cilx9z&?AGhzyJ8wy;0#J+sXz05y zzy13AFTeo{JTSop8+x&3q3T^MH_uI(n%Y03IOVQ zYBSVP7e%wwRom(;8A@xtHP>Bx?KK&oIBYf9WvfKB*=Y~DE+~L}{Wjcj%Y8H;Vn3}m z-g#$)w%&a|>8#sx3qCmET-QCe--(mWx8jY92)NO^xZofF2y9Xb0Wq91rfE!u%A z`U8__efZsuOAj;S(_2p;aXii`|Y{!ygd@ee@=kyj3GSYNgx2-LtZY>*FByo@OgHV)%7Asuj)y#g2u_-(YCih z%xUfcDTtpjD&YYK5HEcUG$99j_PO`@0ED|E!7F@*zvJmIgd|9X17i3&DhyA6!xP>U zSQoX5^^w7ESd(Zs5u6t z!Umhz1tWhb0SA3=lFMry&j?`v0~*5(E}UT+DQ7wHIWmNuTcHN)_(KQe0)fi^t6T>c zh%`Scv5>Z$)gW)F%cdNXXo>XRB406uGE_nbkSw7r1!z9uCDV>>P(dnupgS|7v3+R7 zo$e|j00RYJ6Dzb~DttZv_H;iXuGK86X9TKwGGdI9chH9kYBk>5w zVSZC`OAx2-T(N;5>M^3{EE+AJRu@z};Ocp=%z zN_MD2<;7(wTUpIg*0Pr6MKVGgTFZh$4|bS^RuQXOq0fDAm~B+qsshHc7Di`UE@MH$EdL-2K^f1T#$l4nT+*><|5L!x0i!f~@QoG&xI>n%cyDxt8>$8~FiN4!iM=ZPxURzY- z9On>6GKQMe^|Cj;>SZu5ssY~e4z;v)h%ZV6>fa4xq_z6}Fo+HRm(Koj7_sXRg@7Y# zjepof9MhP^f+39A$ufAoys(C2#eoe4mjV=#xUhUnEaZBzEo&h@GLp3xw(JghruLvi zig|I4f2;!=F9wBBYy99EGkD7O7{@e-N>m>MIm1mpvq*5Jvm~>*%|JUv2b}gtG!OL2 zjX8%kticO$6ay4kX2euIo8<<3cFPbJ2bhy_3|k1b$3M11km)Sx4!f)v9oU%4GOg)N zbGp->1_T*8Pz;wnY|@0ZGe*9fj8e=(4|`xlmIJL|85^3xJC21l;&BdNh@!`gu!9~V zZE7^zYZ@Hb0T+_3>}4~%+0K48w4*KUX;Zt}*0%NzIKVLfCJ)<|P{s(JOTmap&=c0B zumw>UJZMpzm%?2BEROrJ4@UD-50NPKM>O1RC$G!ce+UM^11|7^6TILCKRCh@uJDC3 zyx|TH#veE!=UVQ&Z1%YL#V0ZjFi)f7#rSwJW-$vtgMy#*geMgeac66YqTa6-s(6uV z*(|%ev$LKxQYUK*9AktR{j@i}fm3l}uPYW=csSCNuJoldo#|O91-FNOtUmj>pL;+# z6?&lc8F0M=9Qb+y!kz#E5MTlrm_P&~00S6IU;;5%`v*R7gt^oG2vSf(8S-8RO$enQ zc;>|-7~yJIi{cpAkhzu{?CvbfJm-=<#x@$0jKKf@I1-D100cUqd9HJQ23qd{6{vub z#LTnY{3JQaMLr9Vf4t+acm2l45p=2hEmfuXchhsP``zHR|52*zkDr3zxvZx!u6M5ed}vs4AWnJAo~7YUWnV(dk}?$ZA|DwV;1o< zpLH^L0r|$n;;5D9f)w(P{QM_h2hRV24vZc~=s?`5fC}h<0UDqVET9TtfCE0D1IFD0 zwq4srzyxTU@I{dA;a=}`pa*_n(*0i4WnivQ!8QcK8U#WhTmcI%9}8|D491`gZeI=H z01jvYB;=qD=3p-f7-oS2J@r&PC>Hx&mU-3xoOv~xP{|)UV8l8km1)@l7wBEyWkDJI zzzt-f7G|LU{=*Db9}aw>3~GTUtOE&J&jy0v!?nTyutLBc0uBIND>T7*P=F-_Tr-qF z8_MA}9f%gN!XZ!&0K}mhHk=3s-x=nL7o6Z4wBYw?Uk!#K^o3y!R-zKrfD+t*64)RP z)PNS&fG6GnD1xFA=$v?MLp4-GV~7KJEke1W*s2xUXBnaT30k4e-#?^VDZtkrl$_Nu zf)pem2@K;fcHtI|A~GW57G_~4MxQ1^A0{dRB$#0$I!+oEBEzwv8v-00216@EKp=4A z0c_(Tr~n6qqcgMsxOI*?aU@s!GuAA4mMEozy&3EGWe!^P>MY3YHz zMFJ!2!5ggP4#ZssWPk>|qy}{13akJqiefT$;!S4ZLEgYYCgedHFtzGW)*qd)rOPb#D*(t#*wf-jsyJoJO#QKWd0Um5tqB1}R*B-lpU94!vo`kj|$ zt=b}pL$4tfe4Qjet>hc*Km>mOz)Qkp7mfjFg61QPCTWu9^wA{?)Z_{TB@2jvLH+#1Uf<4Tl;vM0;$>L?@rJfC_9RQnws;M3HfCEMV2DoH{{zGES!cfIuXkmk}3Tt;- zgLsYshiWKlx@Jw5ft(IS!!SbVO)IrltF>M$wodDlf+&cHD2)bOiDD%o;^81vKp;e= zgPed>V&wtc;f#L&Yr)y5Oo7A;WPvK&E57EdzV0i(_UpYy+?kF9D5StC6s*A>EW#$N z!Y(YrhFVdE1P2JgB}^>ER;ZXn`ec zLm40{Hb}u1Hs1pJU-N0<7@&hVP%3NQ0BA~q9PAvYHkLK0Vq>8LWnsgNg;}cNXA-*K zyFH#Y>{z3fWE5W5f!1mT;%eM|Ko{k}ukgZi#7`?jz9zOVX%!wd*-&(?$e-Y@>_#K9Hfq!z?O*VZK`j)8iLS2Z-D-+^jl z#e-&z)_EmZt?}5ZW|nC2*n3@=NmkyY^+4aIU9NWF2jpt5!T{ar05Oul4~(bd9^~Xw zu0gv0W@<{ov(^L^c&-vJap%sj=<)~Yerr@Jfg2uzxniY?Vr2zb0#)K+6Rg4PdgB#u zW$wo7SKeqxoPjEg=nx#SM@)l}B^lMkz$Hwt9pCXC!@(Y$L@|_t`2H~<2Xgn80ziet zIM@OFCbA;8uN}B?M@+*Y=&vN>uQuR8P0WCwUV$|3)Z*HLC`dsKAgVYhaBAv+8Y}|p zEkYttZ4FGYIQ#%IvOpM8-wnutcts>e^n(X`YI|)Ys+MrNL6|U87*hS%Rh?vknidSl zumjR?4Z{Ewe1S^hK^z=`4l}S1-@s}TaZpk&vl{W#FtIp~v%WpCWJIwP(;)z`fV(#T z!yuGE9a=&jUL{tZKp02m36LZ1mNCHXF0p`w8ndw@b3`#56q3zx9pkY=FSIP^F&{6M zAV;)Bb8jpZGDsZqB4>0Wx4}SfL^0gLB!_e*U-B{F;}tO94b1W*fMNpIzzUdhkNKjx zEkYUGz#~vFC?g}Lmcba*vi#**W9f3=>6DFqsIA(-eFw>zyZ)R!L_kS6m%sN0OhdG>x@ze83+N;PguPb{bO&_y z0C%hJG8g~=48e8t14j=wNY}$W)PiCEKr_@sEpQVn*zZXDZ#6XH74(8Hl%^$A10;kp zTAJq%r~$j3-X0v)P$hyASOQMt07Bj*7S@1z%HK9HRzF}vZ153sYd)$uL#N02RF2O1@LMsX_BKu1{j$^#SEr>p(}tgy%~C!8T+BJahp7 zC_z8819=xWJtVhA6kMHGR1;krg(p1_2qCo4LzQl5f`AgLbVKhLs#F0%x|oC(dasIx zj&u+K5&S~0DoPO*HDCj=U_-3=x&GIho4K2F*36mn?sxC!++MD zk9XYHpkttpfwL&%pk-o63saE)SKSf4`h{^>G2pCzWLV{7*i4#^0rTPX#8DNd_R2nx zKCz#a2HhKoe9_+=^J_m9f|VVMn1P)C0oE2{YOCm=S#hzVUt$fJiAU2Q0VZ)gw1gje zhEX(GoKeEj3AmTe5hiew5ntm!dFpB8F%nU8aYBqmJh6BvXMehQ-<0Q-4obQ$-EKSK zi!rx~>ajme>z8aJ4FXuA%!~GRLt0G9uCQL^8la$YO>B~;n%6?IcvU+EzI~#~zH*Nq z<6~ie+-KpJFEZe>}4>vWB*#q-)}YJ zaMPr(c6ydh!#cXmnD}lT0uzOcHy}-*qLQv>=|T2RXtO9fDnRRhNk1GWT4p9X&%}0J z8$3A#sQh6M|GJaLZE**euJci8X% zooG-C6-Fiu|MyLLa$FQ}uAq+FaX0(hE0Lby6$+^9UyT1t?&tqc|WpDL6z%H%&@ z5@1<+#J<@nlp!J$w3^Ar&s*Q97YjMfh;Rpuy^_GL#y1 z%tXDJJy(7u3*GbNc)*nzKT2LkXFAJyy{8KojM<=nv%?Yvo%4$U>|RZjDod^zgiu~jMD6FP2r6GSkZ=gUo;&#D zDa}H6rPIG5cuYIdT%z;eO}y901#gwPhsV=E+$|UE=DskSaEHn3Sy4IzM;BEU$^5B;9Mmqp#3w zVts5q!GvF%KquO$t1~QmF8MLG@^x?_eEjD7>;AmvuM}h?V&`!Xaof}bUoP=RU2{G` zQw$Zx_4Ib|p_@|pZSEVJ5{r7!N^vt_2_lV48t!kVNXltBW^7$K$<}$***#)) z)z#PgdQ*ds2QaO!6@5B$QkIqoJUDkcGRoB)H$!_Uul_guj*PE~AaAssg4eb=! z*F8~skbg%btYi2dSVb+{X*SRcz>pTyM!uE2?6O>P*j+3@F01sa+B_x}&8W1q{W(D3 z^)13Bkl+Eq(ShKmxnwG%dNtb57YuMJgntl(cZK9vJvo=F09Y?&&xlHQWoL<~t`yJc zK0_-Umw0m}%}(##!Dltm57N@a;xCgj_eTPc0gFK`8 zws~jt@Pf*haUp2;!Dc4E%%oI!QSSrL#4&EgsfmD`YFL?niDH8gUlWjQCUlc-&u?#< ze!0>=?$6AOYoXo1AM)Z;F^oO4nT1NV;te*79WXn}hG&9u?F#*>!{oVX*NyO@@ zZ#vqI4P3E%D|{s)5}#paws6(53`{J(M%ui&ZuY9MorVAfG+rFE;-j?1Hg!~2nLDdX z;`5+0wr%rQf9>|(_c;_qe+0XDfU4v(dD0bL{Q3Ie^qIfkA4k6U`(v~4OzKZVx)C$* zQAk|F*_iW6o|hYGX)a|QpzKE;^Yud5S6iOv@J8OxSG$Ia@B$Qj zMk9e#m8NJe7}-OS$2SO1HZs)r{px(>H-QY*_i2&__d?e`=W>6m*WLu~&3X8XZgjj6 zJ>6q!KmrwK^xFhZx+9caSbdeN1ZfTBRbwTh_=l(?dgi*O3DaLSaZ7oUPG$6zH&WS> zS}%hwZcr{Q;$|Z3H;Eh%X;`KUM2yu754c@~e)TQWfxiJ4e%VZs-2viMTvU~~;P~K~ zY?1;Y+Lb0cd%W%C^FvXX<`)7Sz#(3?=f4y0zQ^hqC?JG@!^@^{5 znsD*AIvJsjPe8p)@Z-DBk3XokyU^uW`$B(SR~JAC+$+8Mz5nfr&()_dek{HAck+ms zE&=^#=d{e9Tux9^U^xWdAdC!9;N-00>q>yBV6+y_tbAAP6(jS#c#?riCwFn#fz%|u zX$XXj@x(@0hJ!_&qL#n$+bPtK*W1EKlVWJIQtz%r5Ipp|@ zb?<=e_=<5;qT?Mh_p|TCF8bGgD9hqEA)UTIe}fB$?9_YznKPv*F701`uf$Cz^%CHO zC0R5ggm%Ub!_lZSd%f^ku{5kgdcI@_8FtDoT?*%`XPg-<;xlCAxcf$0(9EJx`=BPU zyy)>M=tr@+1F%5rp8L_f3iJRAreK>m?;sXpaazgj%KnnPd2B0x-cX5n5P^z}0wAN` zKd4TXEnFhAVDawtrN+(WYW}!hs4sX$0Ir~T+agI2(x^;OyeY&X z?nt?3;|GD8;JCHyUzYb_d^HzCg5#`2LP<6{`dsxovcwVmb9tT52h+&@rHPj$2x3Q< zuHz9mQE8MT<5KJHGU!$tj{|X$zdhEcRXE=mMsz+V)ucQeOIJ5g<*1&_3krlPkL(BUqg$Lm^@!l6=7&T7{3l~N&+(?cHS$zP!e zWRaMy(n|J`o{gS@5eovRw6m=&pzy#4t?I}zie(sUneX9bSBk|}d!|8yx=1B?XN|Tv_aHZIo_m7z znkkfvQfY3PrWoL=cFbgO1iQBEIOCX-MMrt)5qE^vryPd1mxF)rE?}4NU;K6e;9ZKygdti0a-D6$S zPYOB>_U^gKeZn@1uoH~w5pXRcBo+{FRDEhn`DM&RcYktj3*iY1{`+T-2lV;Q!Ckox z9uVvv|103K9bO|zO&X2Yu%UvY<}t9me-#-Fjd8|dAZfqQ^H(Hbq|OiO0kpRO#b{rO z&9<04*u7W4JsPZC57vwl42k|Q1nWGx1lc|3Y`VwUCMA3h!2bEjn`G3($zvvQ9eur< z#MK06cagQFQD2jyM6`L352!*T3`7#J8Wggcv}rw0 zt)SN%eA1r(f(E~(x{S>OIe|SH+>$_cpMonyP}BHugo>(5g1K;^nBM$;DYQqE&_yGD zkxA&Fuc#@gM+qvdxN8(XLsCE?8tg?{dJ&hRPW|!~^{ca$mb&$j7gcS^*~t9H-rBTu zP_)ERQS%Hgmrik$(+G(=5x2KuL)f3vAj$8aQKB~_+3JvVYlssbvP6J9CunL@pxE=u zqF8Bhho=%6PK^_Y-5_ zl}_vlTGc6iwlbP$7^MQ(a3g+_Y>(3YzH_W%3Crch^N8j1hSVk1O%1hDWwA19fTY-Og#5l7hbB@IPQ z&Eq#T2RDt)OMgk9*SgK^q6cUn#ezLFPhE&TrM{(I>!|ZrF*AzT6h5zEvw6%NYr#gz z7lI8`!B;;X)x9K*YW*Tpfj?5LX?+^RF_b3*O}9|wMH85o$G2csV|ou(Ktfbbq92b! zo&N1otV6F1gN&K|8r*+ad-sJ7z>WG@ynr@Iavs}Id%{T93IOfMHWnm^|WC}kO9bW2bRxg?K9sm zocVe4%vS*p2MX_-@6rH+Uz(hX5xhu`Bp>$^Z)I?9;r-;|{1gZLRQLUq2N10kUsW)0 z2hTw~7GM?^U^x(A%@GW<2QiFg)RFKD(UQO9sfQVKVM{HtinGQ?Buuv zz~b+V&HY=*h1-;A-h{+{#R3!??Gnymkln2tqLi6rfGGO$TQCE!@7fgfh|FDJ!3|jV zaCW9<%LprdGIBYLnNF!8+EqlIm%&xbWz6Mi{P#UFZ;xRA9U_nPCMt*m(Q@ZzkVPF; zd1v=w(`&R-!mDk^9_cdn^%6wCoE4v}!!a;CcgPhdnCWw}rf&rg*Q^XS$PD%c!s$?{ zQyS^Ik_j2qI%BrMPN=Fu%F=6pRxgLptB0=IY;p{(@;@g}pR>vszfkibB*uF@k1d6+ zkIlKbB|nUhg>Sx6yW2%{=E z5>!-3L2r|J_wYA_jH*(BhNB-;KnaF30O10opIYs$PDaEsg$C9jSUh~~8_ef6&HFcU z3urm}6osV#4{tU)cJ7Drz>yko*(%6v57z~O>oM-v??bt3YdG@?IpYAhO<7x0#4nM_ zvpi-|gHN1?pR`ZtjZAquPuFxFq9->zu7qfGCHi$8t?&AvXZ_iud!qlU^Kv&^1OmC- zRi{ya5_LxZ=F~D0Yx{+ptTUd+_l-{fT44$jJa4$>q6>gHx?thKJA2Q`Wj_RVo~gz* zOIl5Tx=tpGTGb)EMB(#98Xo{(0ls0Gp$q#r9m^pJxABE|)J0Ek*9b(?u4MkOOQkk!kD~N^pily3>OJi_n225s z#38AO`Ki~<45|bjFqH1T_47>JM{?{(0NPx`-F)nb6zt)~OaQezW@Uk>mfJt?pJFbl zw+V6?7nGJq5qNarU#0=4P+IEY@Yq{zk+y#*CzH zXnUHJP|>N3>ubw>{M90wSInjX(eN=rtdZj?1vLb~rwL$rJi6yW_yvZD;3mq)i!b2U zRD={-mmiL&q6{d5>Wn_sfXu@bG@x1IYUe=F4gDPu@J8GC#3HGY=o8UO5p`<>S}`4(pk-oUyR`R-Ay zh#dX(0&Vs3OZa;EygGR`oV?AJ9e!e;|BgOaS~!J!a!Mcp-cK;#nfK8hrA zo?KLU^VH`mBO@t1gL!r4DtVbNC?lajR%rUp@rMf|_kzYdg4kjdJzXPg9`kI4RPHw_ zADMU}xc23fJa9!2`uY6bie_%N%}17gVo5ax%6<$;ozOHZOk)9y-wdOt3H=IqT#35j z{OPM>;hs%nFxyo`|HHRPW|%}eRO5!^!bPwjQ}8eo<;yBRjzxF=K{?3*(=)+CAy#X0lFsV?Khyk5Y zH=e--OH~+9tDmIr|8pOqe|{nCJf;_C5KAkcDIQ}ld3{Ef$j+HSObf&`)EX8qO##BU z6K`N?uDbcR{CakpMX?6STOEzkmA$@>t-$x6-{dLP8arOn!JKn~Y2hk3t?vQWYn?FL z2#gcPPQ5Ms>F`CAPS@1`$(a_P^hFbYKeVR*wF zr{Teu3C^1JK4YX>3Bx#`9z?KK*X$4wF>m^SBm$$amVrV*VY5*Cn*~ee1kaysaER`E znS8*wq{6@4#V0$k!sFarV5LtghkV7pjcK!xu@^0Nc9A~ebzh`;2HqJ*H zDimPnWbY}Ozrw|NqQDVKh18H!dK`{rV6zT>oFYY3Yv<2V1FUgltPeKQkH zg2@SZxd=>7gQ6I67`Fi5?@+YGQq+c_EH=WE8RGM_jt>*m^JS#Z|)7%MH*6;(qaS?#<@wr*WasyDD?;NS9Oy+ z5NW!3RYGaHlL2`k8Wi2ipd#7~o=>8!u7J`7eS1tZgboR^T(KikQ^%f`8I7ygYyg&Y zr6=HIJB~ynG&NdL>*=~{b>NN?NoZAR^+P06rRYY1v8C(GckLo2Am-Y9fJuXAeHibQG8>Z z67b$^Up$z%)tE~cN5zd$(r|PWE>dO|515Y9$JfzZ*7|U%m)m?+IMiOS}%> z+=cY>=}Jzofz|X18?dTU9IA6U!O6|?%Me}xiPz+KhL~#X3n^n&*nqUos z&2J8qv*%aF!7sr1<+$DkGy{&MA}0mr@fq(iD*6Ls+`y%%bh8mE?;L$fCC48XJ+cW$ zi&a6{mSY*6WQN*9V!~`19;3uh6b%SAaoh)?=ZlPvmTq$Sn`_oQX4@G5o~!0j*CHO> z2E^C!B3!fylzl6MODSS&x&A_NNXnQrgPgwFTz0dwJk!GCTNX}%p-s@p)D6tAp1X1h-4y1oda9o%0D1KcR3}OXCa77P`gjN*d=`$rg|M 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%0D3bo=fkeLELurw91sa7Xh)0zz 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 link project ..." - $(CC) $(AOBJ) $(OBJ) $(LIBS) $(LFLAGS) -o $@ - - -# build rule for assembler files -%.o: %.s - $(CC) -c $(AFLAGS) -Wa,-adhlns=$<.lst $< -o $@ - -# clean project -clean: - rm -f $(OBJ) $(AOBJ) *.hex *.bin *.elf *.map *~ *.lst - -# calculate sizes for program -size: $(TARGET).elf - $(SIZE) $(OBJ) $(AOBJ) $(TARGET).elf - @echo "" - $(SIZE) --format avr --mcu $(CPU) $(TARGET).elf - -# print target info and generate lss -info: $(TARGET).elf - $(OBJDUMP) --headers $< - $(OBJDUMP) -h -S -z $< > $@ - -%.bin: %.elf - arm-none-eabi-objcopy -O binary $< $@ - -flash: $(TARGET).bin - st-flash write $< 0x8000000 - -debugserver: - st-util - -gdbgui: - /c/tools/python27/python.exe -m gdbgui --gdb $(GDB) --gdb-args="-se='$(TARGET).elf' --eval-command='target extended-remote localhost:4242'" diff --git a/examples/arm-none-eabi-example-baremetal/ldscripts/libs.ld b/examples/arm-none-eabi-example-baremetal/ldscripts/libs.ld deleted file mode 100644 index 70fea89..0000000 --- a/examples/arm-none-eabi-example-baremetal/ldscripts/libs.ld +++ /dev/null @@ -1,8 +0,0 @@ - -/* - * Placeholder to list other libraries required by the application. - -GROUP( -) - - */ diff --git a/examples/arm-none-eabi-example-baremetal/ldscripts/mem.ld b/examples/arm-none-eabi-example-baremetal/ldscripts/mem.ld deleted file mode 100644 index 16508fe..0000000 --- a/examples/arm-none-eabi-example-baremetal/ldscripts/mem.ld +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Memory Spaces Definitions. - * - * Need modifying for a specific board. - * FLASH.ORIGIN: starting address of flash - * FLASH.LENGTH: length of flash - * RAM.ORIGIN: starting address of RAM bank 0 - * RAM.LENGTH: length of RAM bank 0 - * - * The values below can be addressed in further linker scripts - * using functions like 'ORIGIN(RAM)' or 'LENGTH(RAM)'. - */ - -MEMORY -{ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K - CCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 0 - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K - FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 - EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0 - EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 - EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0 - EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0 - MEMORY_ARRAY (xrw) : ORIGIN = 0x00000000, LENGTH = 0 -} - -/* - * For external ram use something like: - - RAM (xrw) : ORIGIN = 0x68000000, LENGTH = 20K - - */ diff --git a/examples/arm-none-eabi-example-baremetal/ldscripts/sections.ld b/examples/arm-none-eabi-example-baremetal/ldscripts/sections.ld deleted file mode 100644 index 9ef139f..0000000 --- a/examples/arm-none-eabi-example-baremetal/ldscripts/sections.ld +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Default linker script for Cortex-M (it includes specifics for STM32F[34]xx). - * - * To make use of the multi-region initialisations, define - * OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS for the _startup.c file. - */ - -/* - * The '__stack' definition is required by crt0, do not remove it. - */ -__stack = ORIGIN(RAM) + LENGTH(RAM); - -_estack = __stack; /* STM specific definition */ - -/* - * Default stack sizes. - * These are used by the startup in order to allocate stacks - * for the different modes. - */ - -__Main_Stack_Size = 1024 ; - -PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ; - -__Main_Stack_Limit = __stack - __Main_Stack_Size ; - -/* "PROVIDE" allows to easily override these values from an - * object file or the command line. */ -PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ; - -/* - * There will be a link error if there is not this amount of - * RAM free at the end. - */ -_Minimum_Stack_Size = 256 ; - -/* - * Default heap definitions. - * The heap start immediately after the last statically allocated - * .sbss/.noinit section, and extends up to the main stack limit. - */ -PROVIDE ( _Heap_Begin = _end_noinit ) ; -PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ; - -/* - * The entry point is informative, for debuggers and simulators, - * since the Cortex-M vector points to it anyway. - */ -ENTRY(_start) - - -/* Sections Definitions */ - -SECTIONS -{ - /* - * For Cortex-M devices, the beginning of the startup code is stored in - * the .isr_vector section, which goes to FLASH. - */ - .isr_vector : ALIGN(4) - { - FILL(0xFF) - - __vectors_start = ABSOLUTE(.) ; - __vectors_start__ = ABSOLUTE(.) ; /* STM specific definition */ - KEEP(*(.isr_vector)) /* Interrupt vectors */ - - KEEP(*(.cfmconfig)) /* Freescale configuration words */ - - /* - * This section is here for convenience, to store the - * startup code at the beginning of the flash area, hoping that - * this will increase the readability of the listing. - */ - *(.after_vectors .after_vectors.*) /* Startup code and ISR */ - - } >FLASH - - .inits : ALIGN(4) - { - /* - * Memory regions initialisation arrays. - * - * Thee are two kinds of arrays for each RAM region, one for - * data and one for bss. Each is iterrated at startup and the - * region initialisation is performed. - * - * The data array includes: - * - from (LOADADDR()) - * - region_begin (ADDR()) - * - region_end (ADDR()+SIZEOF()) - * - * The bss array includes: - * - region_begin (ADDR()) - * - region_end (ADDR()+SIZEOF()) - * - * WARNING: It is mandatory that the regions are word aligned, - * since the initialisation code works only on words. - */ - - __data_regions_array_start = .; - - LONG(LOADADDR(.data)); - LONG(ADDR(.data)); - LONG(ADDR(.data)+SIZEOF(.data)); - - LONG(LOADADDR(.data_CCMRAM)); - LONG(ADDR(.data_CCMRAM)); - LONG(ADDR(.data_CCMRAM)+SIZEOF(.data_CCMRAM)); - - __data_regions_array_end = .; - - __bss_regions_array_start = .; - - LONG(ADDR(.bss)); - LONG(ADDR(.bss)+SIZEOF(.bss)); - - LONG(ADDR(.bss_CCMRAM)); - LONG(ADDR(.bss_CCMRAM)+SIZEOF(.bss_CCMRAM)); - - __bss_regions_array_end = .; - - /* End of memory regions initialisation arrays. */ - - /* - * These are the old initialisation sections, intended to contain - * naked code, with the prologue/epilogue added by crti.o/crtn.o - * when linking with startup files. The standalone startup code - * currently does not run these, better use the init arrays below. - */ - KEEP(*(.init)) - KEEP(*(.fini)) - - . = ALIGN(4); - - /* - * The preinit code, i.e. an array of pointers to initialisation - * functions to be performed before constructors. - */ - PROVIDE_HIDDEN (__preinit_array_start = .); - - /* - * Used to run the SystemInit() before anything else. - */ - KEEP(*(.preinit_array_sysinit .preinit_array_sysinit.*)) - - /* - * Used for other platform inits. - */ - KEEP(*(.preinit_array_platform .preinit_array_platform.*)) - - /* - * The application inits. If you need to enforce some order in - * execution, create new sections, as before. - */ - KEEP(*(.preinit_array .preinit_array.*)) - - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - - /* - * The init code, i.e. an array of pointers to static constructors. - */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - - /* - * The fini code, i.e. an array of pointers to static destructors. - */ - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - - } >FLASH - - /* - * For some STRx devices, the beginning of the startup code - * is stored in the .flashtext section, which goes to FLASH. - */ - .flashtext : ALIGN(4) - { - *(.flashtext .flashtext.*) /* Startup code */ - } >FLASH - - - /* - * The program code is stored in the .text section, - * which goes to FLASH. - */ - .text : ALIGN(4) - { - *(.text .text.*) /* all remaining code */ - - /* read-only data (constants) */ - *(.rodata .rodata.* .constdata .constdata.*) - - *(vtable) /* C++ virtual tables */ - - KEEP(*(.eh_frame*)) - - /* - * Stub sections generated by the linker, to glue together - * ARM and Thumb code. .glue_7 is used for ARM code calling - * Thumb code, and .glue_7t is used for Thumb code calling - * ARM code. Apparently always generated by the linker, for some - * architectures, so better leave them here. - */ - *(.glue_7) - *(.glue_7t) - - } >FLASH - - /* ARM magic sections */ - .ARM.extab : ALIGN(4) - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > FLASH - - . = ALIGN(4); - __exidx_start = .; - .ARM.exidx : ALIGN(4) - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > FLASH - __exidx_end = .; - - . = ALIGN(4); - _etext = .; - __etext = .; - - /* MEMORY_ARRAY */ - /* - .ROarraySection : - { - *(.ROarraySection .ROarraySection.*) - } >MEMORY_ARRAY - */ - - /* - * The secondary initialised data section. - */ - .data_CCMRAM : ALIGN(4) - { - FILL(0xFF) - *(.data.CCMRAM .data.CCMRAM.*) - . = ALIGN(4) ; - } > CCMRAM AT>FLASH - - /* - * This address is used by the startup code to - * initialise the .data section. - */ - _sidata = LOADADDR(.data); - - /* - * The initialised data section. - * - * The program executes knowing that the data is in the RAM - * but the loader puts the initial values in the FLASH (inidata). - * It is one task of the startup to copy the initial values from - * FLASH to RAM. - */ - .data : ALIGN(4) - { - FILL(0xFF) - /* This is used by the startup code to initialise the .data section */ - _sdata = . ; /* STM specific definition */ - __data_start__ = . ; - *(.data_begin .data_begin.*) - - *(.data .data.*) - - *(.data_end .data_end.*) - . = ALIGN(4); - - /* This is used by the startup code to initialise the .data section */ - _edata = . ; /* STM specific definition */ - __data_end__ = . ; - - } >RAM AT>FLASH - - /* - * The uninitialised data sections. NOLOAD is used to avoid - * the "section `.bss' type changed to PROGBITS" warning - */ - - /* The secondary uninitialised data section. */ - .bss_CCMRAM (NOLOAD) : ALIGN(4) - { - *(.bss.CCMRAM .bss.CCMRAM.*) - } > CCMRAM - - /* The primary uninitialised data section. */ - .bss (NOLOAD) : ALIGN(4) - { - __bss_start__ = .; /* standard newlib definition */ - _sbss = .; /* STM specific definition */ - *(.bss_begin .bss_begin.*) - - *(.bss .bss.*) - *(COMMON) - - *(.bss_end .bss_end.*) - . = ALIGN(4); - __bss_end__ = .; /* standard newlib definition */ - _ebss = . ; /* STM specific definition */ - } >RAM - - .noinit_CCMRAM (NOLOAD) : ALIGN(4) - { - *(.noinit.CCMRAM .noinit.CCMRAM.*) - } > CCMRAM - - .noinit (NOLOAD) : ALIGN(4) - { - _noinit = .; - - *(.noinit .noinit.*) - - . = ALIGN(4) ; - _end_noinit = .; - } > RAM - - /* Mandatory to be word aligned, _sbrk assumes this */ - PROVIDE ( end = _end_noinit ); /* was _ebss */ - PROVIDE ( _end = _end_noinit ); - PROVIDE ( __end = _end_noinit ); - PROVIDE ( __end__ = _end_noinit ); - - /* - * Used for validation only, do not allocate anything here! - * - * This is just to check that there is enough RAM left for the Main - * stack. It should generate an error if it's full. - */ - ._check_stack : ALIGN(4) - { - . = . + _Minimum_Stack_Size ; - } >RAM - - /* - * The FLASH Bank1. - * The C or assembly source must explicitly place the code - * or data there using the "section" attribute. - */ - .b1text : ALIGN(4) - { - *(.b1text) /* remaining code */ - *(.b1rodata) /* read-only data (constants) */ - *(.b1rodata.*) - } >FLASHB1 - - /* - * The EXTMEM. - * The C or assembly source must explicitly place the code or data there - * using the "section" attribute. - */ - - /* EXTMEM Bank0 */ - .eb0text : ALIGN(4) - { - *(.eb0text) /* remaining code */ - *(.eb0rodata) /* read-only data (constants) */ - *(.eb0rodata.*) - } >EXTMEMB0 - - /* EXTMEM Bank1 */ - .eb1text : ALIGN(4) - { - *(.eb1text) /* remaining code */ - *(.eb1rodata) /* read-only data (constants) */ - *(.eb1rodata.*) - } >EXTMEMB1 - - /* EXTMEM Bank2 */ - .eb2text : ALIGN(4) - { - *(.eb2text) /* remaining code */ - *(.eb2rodata) /* read-only data (constants) */ - *(.eb2rodata.*) - } >EXTMEMB2 - - /* EXTMEM Bank0 */ - .eb3text : ALIGN(4) - { - *(.eb3text) /* remaining code */ - *(.eb3rodata) /* read-only data (constants) */ - *(.eb3rodata.*) - } >EXTMEMB3 - - - /* After that there are only debugging sections. */ - - /* This can remove the debugging information from the standard libraries */ - /* - DISCARD : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - */ - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* - * DWARF debug sections. - * Symbols in the DWARF debugging sections are relative to the beginning - * of the section so we begin them at 0. - */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } -} diff --git a/examples/arm-none-eabi-example-baremetal/main.c b/examples/arm-none-eabi-example-baremetal/main.c deleted file mode 100644 index c40c5b7..0000000 --- a/examples/arm-none-eabi-example-baremetal/main.c +++ /dev/null @@ -1,63 +0,0 @@ - -/* a simple blink example */ -#include "stm32f10x.h" - -GPIO_InitTypeDef GPIO_InitStructure; - -static volatile uint32_t sysTickCount = 0; - - -void SysTick_Handler() -{ - if (sysTickCount != 0) { - sysTickCount--; - } -} - - -void myDelay(uint32_t nTime) -{ - sysTickCount = nTime; - while(sysTickCount != 0); -}; - -int main(void) -{ - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); - - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_Init(GPIOC, &GPIO_InitStructure); - - SysTick_Config(SystemCoreClock/1000); - - while (1) - { - - GPIOC->BSRR = GPIO_Pin_13; - myDelay(200); - - GPIOC->BRR = GPIO_Pin_13; - myDelay(200); - } -} - -#ifdef USE_FULL_ASSERT - -void assert_failed(uint8_t* file, uint32_t line) -{ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - - /* Infinite loop */ - while (1) - { - } -} - -#endif - diff --git a/examples/arm-none-eabi-example-baremetal/stm32f10x_conf.h b/examples/arm-none-eabi-example-baremetal/stm32f10x_conf.h deleted file mode 100644 index ebccb7e..0000000 --- a/examples/arm-none-eabi-example-baremetal/stm32f10x_conf.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - ****************************************************************************** - * @file GPIO/IOToggle/stm32f10x_conf.h - * @author MCD Application Team - * @version V3.5.0 - * @date 08-April-2011 - * @brief Library configuration file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CONF_H -#define __STM32F10x_CONF_H - -/* Includes ------------------------------------------------------------------*/ -/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */ -#include "stm32f10x_adc.h" -#include "stm32f10x_bkp.h" -#include "stm32f10x_can.h" -#include "stm32f10x_cec.h" -#include "stm32f10x_crc.h" -#include "stm32f10x_dac.h" -#include "stm32f10x_dbgmcu.h" -#include "stm32f10x_dma.h" -#include "stm32f10x_exti.h" -#include "stm32f10x_flash.h" -#include "stm32f10x_fsmc.h" -#include "stm32f10x_gpio.h" -#include "stm32f10x_i2c.h" -#include "stm32f10x_iwdg.h" -#include "stm32f10x_pwr.h" -#include "stm32f10x_rcc.h" -#include "stm32f10x_rtc.h" -#include "stm32f10x_sdio.h" -#include "stm32f10x_spi.h" -#include "stm32f10x_tim.h" -#include "stm32f10x_usart.h" -#include "stm32f10x_wwdg.h" -#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Uncomment the line below to expanse the "assert_param" macro in the - Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT - -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function which reports - * the name of the source file and the source line number of the call - * that failed. If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#endif /* __STM32F10x_CONF_H */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-none-eabi-example-baremetal/stm32f10x_it.c b/examples/arm-none-eabi-example-baremetal/stm32f10x_it.c deleted file mode 100644 index 370881a..0000000 --- a/examples/arm-none-eabi-example-baremetal/stm32f10x_it.c +++ /dev/null @@ -1,91 +0,0 @@ - -#include "stm32f10x_it.h" -/** - * @brief This function handles NMI exception. - * @param None - * @retval None - */ -void NMI_Handler(void) -{ -} - -/** - * @brief This function handles Hard Fault exception. - * @param None - * @retval None - */ -void HardFault_Handler(void) -{ - /* Go to infinite loop when Hard Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Memory Manage exception. - * @param None - * @retval None - */ -void MemManage_Handler(void) -{ - /* Go to infinite loop when Memory Manage exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Bus Fault exception. - * @param None - * @retval None - */ -void BusFault_Handler(void) -{ - /* Go to infinite loop when Bus Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Usage Fault exception. - * @param None - * @retval None - */ -void UsageFault_Handler(void) -{ - /* Go to infinite loop when Usage Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles SVCall exception. - * @param None - * @retval None - */ -void SVC_Handler(void) -{ -} - -/** - * @brief This function handles Debug Monitor exception. - * @param None - * @retval None - */ -void DebugMon_Handler(void) -{ -} - -/** - * @brief This function handles PendSV_Handler exception. - * @param None - * @retval None - */ -void PendSV_Handler(void) -{ -} - - diff --git a/examples/arm-none-eabi-example-baremetal/stm32f10x_it.h b/examples/arm-none-eabi-example-baremetal/stm32f10x_it.h deleted file mode 100644 index 2917219..0000000 --- a/examples/arm-none-eabi-example-baremetal/stm32f10x_it.h +++ /dev/null @@ -1,21 +0,0 @@ - - -#ifndef __STM32F10x_IT_H -#define __STM32F10x_IT_H - - -#include "stm32f10x.h" - - -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); - -#endif /* __STM32F10x_IT_H */ - diff --git a/examples/arm-none-eabi-example-baremetal/system_stm32f10x.c b/examples/arm-none-eabi-example-baremetal/system_stm32f10x.c deleted file mode 100644 index eb70e9d..0000000 --- a/examples/arm-none-eabi-example-baremetal/system_stm32f10x.c +++ /dev/null @@ -1,1094 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f10x.c - * @author MCD Application Team - * @version V3.5.0 - * @date 08-April-2011 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. - * - * 1. This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier - * factors, AHB/APBx prescalers and Flash settings). - * This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f10x_xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * 2. After each device reset the HSI (8 MHz) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to - * configure the system clock before to branch to main program. - * - * 3. If the system clock source selected by user fails to startup, the SystemInit() - * function will do nothing and HSI still used as system clock source. User can - * add some code to deal with this issue inside the SetSysClock() function. - * - * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on - * the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. - * When HSE is used as system clock source, directly or through PLL, and you - * are using different crystal you have to adapt the HSE value to your own - * configuration. - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f10x_system - * @{ - */ - -/** @addtogroup STM32F10x_System_Private_Includes - * @{ - */ - -#include "stm32f10x.h" - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Defines - * @{ - */ - -/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) - frequency (after reset the HSI is used as SYSCLK source) - - IMPORTANT NOTE: - ============== - 1. After each device reset the HSI is used as System clock source. - - 2. Please make sure that the selected System clock doesn't exceed your device's - maximum frequency. - - 3. If none of the define below is enabled, the HSI is used as System clock - source. - - 4. The System clock configuration functions provided within this file assume that: - - For Low, Medium and High density Value line devices an external 8MHz - crystal is used to drive the System clock. - - For Low, Medium and High density devices an external 8MHz crystal is - used to drive the System clock. - - For Connectivity line devices an external 25MHz crystal is used to drive - the System clock. - If you are using different crystal you have to adapt those functions accordingly. - */ - -#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) -/* #define SYSCLK_FREQ_HSE HSE_VALUE */ - #define SYSCLK_FREQ_24MHz 24000000 -#else -/* #define SYSCLK_FREQ_HSE HSE_VALUE */ -/* #define SYSCLK_FREQ_24MHz 24000000 */ -/* #define SYSCLK_FREQ_36MHz 36000000 */ -/* #define SYSCLK_FREQ_48MHz 48000000 */ -/* #define SYSCLK_FREQ_56MHz 56000000 */ -#define SYSCLK_FREQ_72MHz 72000000 -#endif - -/*!< Uncomment the following line if you need to use external SRAM mounted - on STM3210E-EVAL board (STM32 High density and XL-density devices) or on - STM32100E-EVAL board (STM32 High-density value line devices) as data memory */ -#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) -/* #define DATA_IN_ExtSRAM */ -#endif - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ - - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Variables - * @{ - */ - -/******************************************************************************* -* Clock Definitions -*******************************************************************************/ -#ifdef SYSCLK_FREQ_HSE - uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_24MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_36MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_48MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_56MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_72MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */ -#else /*!< HSI Selected as System Clock source */ - uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */ -#endif - -__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_FunctionPrototypes - * @{ - */ - -static void SetSysClock(void); - -#ifdef SYSCLK_FREQ_HSE - static void SetSysClockToHSE(void); -#elif defined SYSCLK_FREQ_24MHz - static void SetSysClockTo24(void); -#elif defined SYSCLK_FREQ_36MHz - static void SetSysClockTo36(void); -#elif defined SYSCLK_FREQ_48MHz - static void SetSysClockTo48(void); -#elif defined SYSCLK_FREQ_56MHz - static void SetSysClockTo56(void); -#elif defined SYSCLK_FREQ_72MHz - static void SetSysClockTo72(void); -#endif - -#ifdef DATA_IN_ExtSRAM - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemCoreClock variable. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -void SystemInit (void) -{ - /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ -#ifndef STM32F10X_CL - RCC->CFGR &= (uint32_t)0xF8FF0000; -#else - RCC->CFGR &= (uint32_t)0xF0FF0000; -#endif /* STM32F10X_CL */ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ - RCC->CFGR &= (uint32_t)0xFF80FFFF; - -#ifdef STM32F10X_CL - /* Reset PLL2ON and PLL3ON bits */ - RCC->CR &= (uint32_t)0xEBFFFFFF; - - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x00FF0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#else - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) - #ifdef DATA_IN_ExtSRAM - SystemInit_ExtMemCtl(); - #endif /* DATA_IN_ExtSRAM */ -#endif - - /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ - /* Configure the Flash Latency cycles and enable prefetch buffer */ - SetSysClock(); - -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value - * 8 MHz or 25 MHz, depedning on the product used), user has to ensure - * that HSE_VALUE is same as the real frequency of the crystal used. - * Otherwise, this function may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0; - -#ifdef STM32F10X_CL - uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) - uint32_t prediv1factor = 0; -#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL or STM32F10X_HD_VL */ - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock */ - - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - -#ifndef STM32F10X_CL - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1) * pllmull; - } - else - { - #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - #else - /* HSE selected as PLL clock entry */ - if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) - {/* HSE oscillator clock divided by 2 */ - SystemCoreClock = (HSE_VALUE >> 1) * pllmull; - } - else - { - SystemCoreClock = HSE_VALUE * pllmull; - } - #endif - } -#else - pllmull = pllmull >> 18; - - if (pllmull != 0x0D) - { - pllmull += 2; - } - else - { /* PLL multiplication factor = PLL input clock * 6.5 */ - pllmull = 13 / 2; - } - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1) * pllmull; - } - else - {/* PREDIV1 selected as PLL clock entry */ - - /* Get PREDIV1 clock source and division factor */ - prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - - if (prediv1source == 0) - { - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - } - else - {/* PLL2 clock selected as PREDIV1 clock entry */ - - /* Get PREDIV2 division factor and PLL2 multiplication factor */ - prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4) + 1; - pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8 ) + 2; - SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; - } - } -#endif /* STM32F10X_CL */ - break; - - default: - SystemCoreClock = HSI_VALUE; - break; - } - - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. - * @param None - * @retval None - */ -static void SetSysClock(void) -{ -#ifdef SYSCLK_FREQ_HSE - SetSysClockToHSE(); -#elif defined SYSCLK_FREQ_24MHz - SetSysClockTo24(); -#elif defined SYSCLK_FREQ_36MHz - SetSysClockTo36(); -#elif defined SYSCLK_FREQ_48MHz - SetSysClockTo48(); -#elif defined SYSCLK_FREQ_56MHz - SetSysClockTo56(); -#elif defined SYSCLK_FREQ_72MHz - SetSysClockTo72(); -#endif - - /* If none of the define above is enabled, the HSI is used as System clock - source (default after reset) */ -} - -/** - * @brief Setup the external memory controller. Called in startup_stm32f10x.s - * before jump to __main - * @param None - * @retval None - */ -#ifdef DATA_IN_ExtSRAM -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f10x_xx.s/.c before jump to main. - * This function configures the external SRAM mounted on STM3210E-EVAL - * board (STM32 High density devices). This SRAM will be used as program - * data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ -/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is - required, then adjust the Register Addresses */ - - /* Enable FSMC clock */ - RCC->AHBENR = 0x00000114; - - /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ - RCC->APB2ENR = 0x000001E0; - -/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ -/*---------------- SRAM Address lines configuration -------------------------*/ -/*---------------- NOE and NWE configuration --------------------------------*/ -/*---------------- NE3 configuration ----------------------------------------*/ -/*---------------- NBL0, NBL1 configuration ---------------------------------*/ - - GPIOD->CRL = 0x44BB44BB; - GPIOD->CRH = 0xBBBBBBBB; - - GPIOE->CRL = 0xB44444BB; - GPIOE->CRH = 0xBBBBBBBB; - - GPIOF->CRL = 0x44BBBBBB; - GPIOF->CRH = 0xBBBB4444; - - GPIOG->CRL = 0x44BBBBBB; - GPIOG->CRH = 0x44444B44; - -/*---------------- FSMC Configuration ---------------------------------------*/ -/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ - - FSMC_Bank1->BTCR[4] = 0x00001011; - FSMC_Bank1->BTCR[5] = 0x00000200; -} -#endif /* DATA_IN_ExtSRAM */ - -#ifdef SYSCLK_FREQ_HSE -/** - * @brief Selects HSE as System clock source and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockToHSE(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - -#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 0 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - -#ifndef STM32F10X_CL - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; -#else - if (HSE_VALUE <= 24000000) - { - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; - } - else - { - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - } -#endif /* STM32F10X_CL */ -#endif - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - - /* Select HSE as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; - - /* Wait till HSE is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_24MHz -/** - * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo24(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { -#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 0 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; -#endif - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL6); - - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6); -#else - /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_36MHz -/** - * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo36(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 1 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - - /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL9); - - /*!< PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - -#else - /* PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_48MHz -/** - * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo48(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 1 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL6); -#else - /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - -#elif defined SYSCLK_FREQ_56MHz -/** - * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo56(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 2 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL7); -#else - /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7); - -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - -#elif defined SYSCLK_FREQ_72MHz -/** - * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo72(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 2 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; - - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL9); -#else - /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | - RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#endif - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-none-eabi-example/.vscode/c_cpp_properties.json b/examples/arm-none-eabi-example/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9ace004 --- /dev/null +++ b/examples/arm-none-eabi-example/.vscode/c_cpp_properties.json @@ -0,0 +1,31 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**", + "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc", + "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc", + "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport", + "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x", + "../../toolchain-arm-none-eabi-current/arm-none-eabi/include", + "../../toolchain-arm-none-eabi-current/arm-none-eabi/include/c++/13.2.0", + "../../toolchain-arm-none-eabi-current/arm-none-eabi/include/c++/13.2.0/arm-none-eabi", + "../../toolchain-arm-none-eabi-current/lib/gcc/arm-none-eabi/13.2.0/include" + + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.19041.0", + "cStandard": "gnu89", + "cppStandard": "c++17", + "intelliSenseMode": "linux-gcc-arm", + "configurationProvider": "ms-vscode.makefile-tools", + "compilerPath": "c:/tools/msys64/home/mac/toolchain68k/toolchain-arm-none-eabi-current/bin/arm-none-eabi-gcc.exe" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/examples/arm-none-eabi-example/.vscode/launch.json b/examples/arm-none-eabi-example/.vscode/launch.json new file mode 100644 index 0000000..88cb512 --- /dev/null +++ b/examples/arm-none-eabi-example/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Arm Debugger", + "type": "arm-debugger", + "request": "launch", + "serialNumber": "${command:device-manager.getSerialNumber}", + "program": "${command:arm-debugger.getApplicationFile}", + "cmsisPack": "${command:device-manager.getDevicePack}" + } + + ] +} \ No newline at end of file diff --git a/examples/arm-none-eabi-example/.vscode/settings.json b/examples/arm-none-eabi-example/.vscode/settings.json deleted file mode 100644 index a78a188..0000000 --- a/examples/arm-none-eabi-example/.vscode/settings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "C_Cpp.default.compilerPath": "../../toolchain-arm-none-eabi-current/bin/arm-none-eabi-g++.exe", - "C_Cpp.default.systemIncludePath": [ - "../../toolchain-arm-none-eabi-current/arm-none-eabi/include", - "../../toolchain-arm-none-eabi-current/arm-none-eabi/include/c++/13.2.0", - "../../toolchain-arm-none-eabi-current/arm-none-eabi/include/c++/13.2.0/arm-none-eabi", - "../../toolchain-arm-none-eabi-current/lib/gcc/arm-none-eabi/13.2.0/include", - "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/Include", - "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/ST/STM32F10x/Include", - "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc", - "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport", - "../STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x" - ] -} \ No newline at end of file diff --git a/examples/arm-none-eabi-example/Makefile b/examples/arm-none-eabi-example/Makefile index 8a80136..c0308b5 100644 --- a/examples/arm-none-eabi-example/Makefile +++ b/examples/arm-none-eabi-example/Makefile @@ -22,47 +22,59 @@ INCLUDES += -I$(STMLIBDIR)/CMSIS/CM3/DeviceSupport/ST/STM32F10x CDEFS :=-DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DUSE_FULL_ASSERT -DDEBUG -CXXFLAGS += -mcpu=$(CPU) -mthumb $(INCLUDES) $(CDEFS) -Wall -Werror -O2 -std=c++17 -g -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -CFLAGS += -mcpu=$(CPU) -mthumb $(INCLUDES) $(CDEFS) -Wall -Werror -O2 -std=c99 -g +CXXFLAGS += -mcpu=$(CPU) -mthumb $(INCLUDES) $(CDEFS) -Wall -Werror -O0 -std=c++17 -g -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics +CFLAGS += -mcpu=$(CPU) -mthumb $(INCLUDES) $(CDEFS) -Wall -Werror -O0 -std=c99 -g -LFLAGS += -Os -Wl,--gc-sections -mcpu=$(CPU) -Tmem.ld -Tlibs.ld -Tsections.ld "-Wl,-Map,$(TARGET).map" "-Lldscripts" -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols +LFLAGS += -O0 -Wl,--gc-sections -mcpu=$(CPU) -Tmem.ld -Tlibs.ld -Tsections.ld "-Wl,-Map,$(TARGET).map" "-Lldscripts" -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols LIBS += -lm -lgcc # determine the object files -OBJ := main.o stm32f10x_it.o system_stm32f10x.o $(STMLIBDIR)/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.o $(STMLIBDIR)/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.o $(STMLIBDIR)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.o +OBJ := build/main.o \ + build/stm32f10x_it.o \ + build/system_stm32f10x.o \ + build/stm32f10x_gpio.o \ + build/stm32f10x_rcc.o \ + build/startup.o # link the program -$(TARGET).elf: $(OBJ) $(AOBJ) +build/$(TARGET).elf: $(OBJ) $(AOBJ) @echo "---> link project ..." $(CC) $(AOBJ) $(OBJ) $(LIBS) $(LFLAGS) -o $@ # build rule for assembler files -%.o: %.s - $(CC) -c $(AFLAGS) -Wa,-adhlns=$<.lst $< -o $@ +build/%.o: %.s + $(CC) -c $(AFLAGS) -Wa,-adhlns=$@.lst $< -o $@ +# build rule for cpp +build/%.o: %.cpp + $(CXX) -c $(CXXFLAGS) -Wa,-adhlns=$@.lst $< -o $@ + +# build rule for c +build/%.o: %.c + $(CC) -c $(CFLAGS) -Wa,-adhlns=$@.lst $< -o $@ # clean project clean: - rm -f $(OBJ) $(AOBJ) *.hex *.bin *.elf *.map *~ *.lst + rm -f $(OBJ) $(AOBJ) *.hex build/*.bin build/*.elf build/*.map *~ build/*.lst build/*.dis + # calculate sizes for program -size: $(TARGET).elf - $(SIZE) $(OBJ) $(AOBJ) $(TARGET).elf - @echo "" - $(SIZE) --format avr --mcu $(CPU) $(TARGET).elf +size: build/$(TARGET).elf + $(SIZE) $(OBJ) $(AOBJ) $< # print target info and generate lss -info: $(TARGET).elf +info: build/$(TARGET).elf $(OBJDUMP) --headers $< $(OBJDUMP) -h -S -z $< > $@ %.bin: %.elf arm-none-eabi-objcopy -O binary $< $@ + arm-none-eabi-objdump -d $< >build/$(TARGET).dis -flash: $(TARGET).bin - st-flash write $< 0x8000000 +flash: build/$(TARGET).bin + st-flash write $< 0x8000000 debugserver: st-util @@ -71,4 +83,13 @@ gdbgui: /c/tools/python27/python.exe -m gdbgui --gdb $(GDB) --gdb-args="-se='$(TARGET).elf' --eval-command='target extended-remote localhost:4242'" unpack: - ( cd .. && [ -d "STM32F10x_StdPeriph_Lib_V3.5.0/Libraries" ] || unzip ../binary_assets/en.stsw-stm32054.zip ) \ No newline at end of file + ( cd .. && [ -d "STM32F10x_StdPeriph_Lib_V3.5.0/Libraries" ] || unzip ../binary_assets/en.stsw-stm32054.zip ) + +# doesnt work , cannot write to windows. +# why cant we just specify the chips dir ? +installstlink: + ( cd .. && [ -d "stlink-1.8.0-win32" ] || unzip ../binary_assets/stlink-1.8.0-win32.zip ) + ( [ -d "/c/Program\ Files\ \(x86\)/stlink/" ] || mkdir -p "/c/Program\ Files\ \(x86\)/stlink/" ) + ( cd ../stlink-1.8.0-win32 && [ -d "/c/Program\ Files\ \(x86\)/stlink/st-util.exe" ] || cp bin/* "/c/Program\ Files\ \(x86\)/stlink/" ;\ + cp -r "/c/Program\ Files\ \(x86\)" "/c/" ; \ + cp /mingw64/bin/libusb-1.0.dll "/c/Program\ Files\ \(x86\)/stlink/" ) diff --git a/examples/arm-none-eabi-example/build/.empty b/examples/arm-none-eabi-example/build/.empty new file mode 100644 index 0000000..e69de29 diff --git a/examples/arm-none-eabi-example/startup.s b/examples/arm-none-eabi-example/startup.s new file mode 100644 index 0000000..4b4a050 --- /dev/null +++ b/examples/arm-none-eabi-example/startup.s @@ -0,0 +1,358 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md.s + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief STM32F10x Medium Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Medium Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-none-eabi-example/stm32f10x_gpio.c b/examples/arm-none-eabi-example/stm32f10x_gpio.c new file mode 100644 index 0000000..93dbcd7 --- /dev/null +++ b/examples/arm-none-eabi-example/stm32f10x_gpio.c @@ -0,0 +1,650 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the GPIO firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_gpio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup GPIO + * @brief GPIO driver modules + * @{ + */ + +/** @defgroup GPIO_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------------*/ +#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE) + +/* --- EVENTCR Register -----*/ + +/* Alias word address of EVOE bit */ +#define EVCR_OFFSET (AFIO_OFFSET + 0x00) +#define EVOE_BitNumber ((uint8_t)0x07) +#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4)) + + +/* --- MAPR Register ---*/ +/* Alias word address of MII_RMII_SEL bit */ +#define MAPR_OFFSET (AFIO_OFFSET + 0x04) +#define MII_RMII_SEL_BitNumber ((u8)0x17) +#define MAPR_MII_RMII_SEL_BB (PERIPH_BB_BASE + (MAPR_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) + + +#define EVCR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) +/** + * @} + */ + +/** @defgroup GPIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + if (GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if (GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if (GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if (GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if (GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } + else if (GPIOx == GPIOF) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); + } + else + { + if (GPIOx == GPIOG) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); + } + } +} + +/** + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * @param None + * @retval None + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/** + * @brief Initializes the GPIOx peripheral according to the specified + * parameters in the GPIO_InitStruct. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO peripheral. + * @retval None + */ +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) +{ + uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); + assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); + +/*---------------------------- GPIO Mode Configuration -----------------------*/ + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + /* Check the parameters */ + assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); + /* Output mode */ + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } +/*---------------------------- GPIO CRL Configuration ------------------------*/ + /* Configure the eight low port pins */ + if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CRL; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + /* Get the port pins position */ + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding low control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << pinpos); + } + else + { + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CRL = tmpreg; + } +/*---------------------------- GPIO CRH Configuration ------------------------*/ + /* Configure the eight high port pins */ + if (GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CRH; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + /* Get the port pins position */ + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding high control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CRH = tmpreg; + } +} + +/** + * @brief Fills each GPIO_InitStruct member with its default value. + * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO input data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO input data port value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->IDR); +} + +/** + * @brief Reads the specified output data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The output port pin value. + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO output data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO output data port value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->ODR); +} + +/** + * @brief Sets the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BSRR = GPIO_Pin; +} + +/** + * @brief Clears the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BRR = GPIO_Pin; +} + +/** + * @brief Sets or clears the selected data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be one of the BitAction enum values: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @retval None + */ +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_BIT_ACTION(BitVal)); + + if (BitVal != Bit_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BRR = GPIO_Pin; + } +} + +/** + * @brief Writes data to the specified GPIO data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param PortVal: specifies the value to be written to the port output data register. + * @retval None + */ +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + GPIOx->ODR = PortVal; +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint32_t tmp = 0x00010000; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + tmp |= GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Reset LCKK bit */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; +} + +/** + * @brief Selects the GPIO pin used as Event output. + * @param GPIO_PortSource: selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * @param GPIO_PinSource: specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EVENTOUT_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmpreg = AFIO->EVCR; + /* Clear the PORT[6:4] and PIN[3:0] bits */ + tmpreg &= EVCR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->EVCR = tmpreg; +} + +/** + * @brief Enables or disables the Event Output. + * @param NewState: new state of the Event output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) EVCR_EVOE_BB = (uint32_t)NewState; +} + +/** + * @brief Changes the mapping of the specified pin. + * @param GPIO_Remap: selects the pin to remap. + * This parameter can be one of the following values: + * @arg GPIO_Remap_SPI1 : SPI1 Alternate Function mapping + * @arg GPIO_Remap_I2C1 : I2C1 Alternate Function mapping + * @arg GPIO_Remap_USART1 : USART1 Alternate Function mapping + * @arg GPIO_Remap_USART2 : USART2 Alternate Function mapping + * @arg GPIO_PartialRemap_USART3 : USART3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_USART3 : USART3 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM1 : TIM1 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM1 : TIM1 Full Alternate Function mapping + * @arg GPIO_PartialRemap1_TIM2 : TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PartialRemap2_TIM2 : TIM2 Partial2 Alternate Function mapping + * @arg GPIO_FullRemap_TIM2 : TIM2 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM3 : TIM3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM3 : TIM3 Full Alternate Function mapping + * @arg GPIO_Remap_TIM4 : TIM4 Alternate Function mapping + * @arg GPIO_Remap1_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap2_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap_PD01 : PD01 Alternate Function mapping + * @arg GPIO_Remap_TIM5CH4_LSI : LSI connected to TIM5 Channel4 input capture for calibration + * @arg GPIO_Remap_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ETH : Ethernet remapping (only for Connectivity line devices) + * @arg GPIO_Remap_CAN2 : CAN2 remapping (only for Connectivity line devices) + * @arg GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * @arg GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled + * @arg GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP) + * @arg GPIO_Remap_SPI3 : SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) + * When the SPI3/I2S3 is remapped using this function, the SWJ is configured + * to Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST. + * @arg GPIO_Remap_TIM2ITR1_PTP_SOF : Ethernet PTP output or USB OTG SOF (Start of Frame) connected + * to TIM2 Internal Trigger 1 for calibration (only for Connectivity line devices) + * If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected to + * Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output. + * @arg GPIO_Remap_PTP_PPS : Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) + * @arg GPIO_Remap_TIM15 : TIM15 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM16 : TIM16 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM17 : TIM17 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_CEC : CEC Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM1_DMA : TIM1 DMA requests mapping (only for Value line devices) + * @arg GPIO_Remap_TIM9 : TIM9 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM10 : TIM10 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM11 : TIM11 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM13 : TIM13 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM14 : TIM14 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_FSMC_NADV : FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM67_DAC_DMA : TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) + * @arg GPIO_Remap_TIM12 : TIM12 Alternate Function mapping (only for High density Value line devices) + * @arg GPIO_Remap_MISC : Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, + * only for High density Value line devices) + * @param NewState: new state of the port pin remapping. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_REMAP(GPIO_Remap)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + tmpreg = AFIO->MAPR2; + } + else + { + tmpreg = AFIO->MAPR; + } + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->MAPR &= DBGAFR_SWJCFG_MASK; + } + else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + + if (NewState != DISABLE) + { + tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10)); + } + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + AFIO->MAPR2 = tmpreg; + } + else + { + AFIO->MAPR = tmpreg; + } +} + +/** + * @brief Selects the GPIO pin used as EXTI Line. + * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * @param GPIO_PinSource: specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/** + * @brief Selects the Ethernet media interface. + * @note This function applies only to STM32 Connectivity line devices. + * @param GPIO_ETH_MediaInterface: specifies the Media Interface mode. + * This parameter can be one of the following values: + * @arg GPIO_ETH_MediaInterface_MII: MII mode + * @arg GPIO_ETH_MediaInterface_RMII: RMII mode + * @retval None + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); + + /* Configure MII_RMII selection bit */ + *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-none-eabi-example/stm32f10x_rcc.c b/examples/arm-none-eabi-example/stm32f10x_rcc.c new file mode 100644 index 0000000..4b2ec1f --- /dev/null +++ b/examples/arm-none-eabi-example/stm32f10x_rcc.c @@ -0,0 +1,1470 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.c + * @author MCD Application Team + * @version V3.5.0 + * @date 11-March-2011 + * @brief This file provides all the RCC firmware functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RCC + * @brief RCC driver modules + * @{ + */ + +/** @defgroup RCC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BitNumber 0x00 +#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) + +/* Alias word address of PLLON bit */ +#define PLLON_BitNumber 0x18 +#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) + +#ifdef STM32F10X_CL + /* Alias word address of PLL2ON bit */ + #define PLL2ON_BitNumber 0x1A + #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4)) + + /* Alias word address of PLL3ON bit */ + #define PLL3ON_BitNumber 0x1C + #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* Alias word address of CSSON bit */ +#define CSSON_BitNumber 0x13 +#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) + +/* --- CFGR Register ---*/ + +/* Alias word address of USBPRE bit */ +#define CFGR_OFFSET (RCC_OFFSET + 0x04) + +#ifndef STM32F10X_CL + #define USBPRE_BitNumber 0x16 + #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4)) +#else + #define OTGFSPRE_BitNumber 0x16 + #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* --- BDCR Register ---*/ + +/* Alias word address of RTCEN bit */ +#define BDCR_OFFSET (RCC_OFFSET + 0x20) +#define RTCEN_BitNumber 0x0F +#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) + +/* Alias word address of BDRST bit */ +#define BDRST_BitNumber 0x10 +#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x24) +#define LSION_BitNumber 0x00 +#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) + +#ifdef STM32F10X_CL +/* --- CFGR2 Register ---*/ + + /* Alias word address of I2S2SRC bit */ + #define CFGR2_OFFSET (RCC_OFFSET + 0x2C) + #define I2S2SRC_BitNumber 0x11 + #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4)) + + /* Alias word address of I2S3SRC bit */ + #define I2S3SRC_BitNumber 0x12 + #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* ---------------------- RCC registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CR_HSEBYP_Set ((uint32_t)0x00040000) +#define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CR_HSEON_Set ((uint32_t)0x00010000) +#define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +/* CFGR register bit mask */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF) +#else + #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF) +#endif /* STM32F10X_CL */ + +#define CFGR_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* CSR register bit mask */ +#define CSR_RMVF_Set ((uint32_t)0x01000000) + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/* CFGR2 register bit mask */ + #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) + #define CFGR2_PREDIV1 ((uint32_t)0x0000000F) +#endif +#ifdef STM32F10X_CL + #define CFGR2_PREDIV2 ((uint32_t)0x000000F0) + #define CFGR2_PLL2MUL ((uint32_t)0x00000F00) + #define CFGR2_PLL3MUL ((uint32_t)0x0000F000) +#endif /* STM32F10X_CL */ + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR register byte 4 (Bits[31:24]) base address */ +#define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCR register base address */ +#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) + +/** + * @} + */ + +/** @defgroup RCC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Variables + * @{ + */ + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/** + * @} + */ + +/** @defgroup RCC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Functions + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @param None + * @retval None + */ +void RCC_DeInit(void) +{ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifdef STM32F10X_CL + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#endif /* STM32F10X_CL */ + +} + +/** + * @brief Configures the External High Speed oscillator (HSE). + * @note HSE can not be stopped if it is used directly or through the PLL as system clock. + * @param RCC_HSE: specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: HSE oscillator OFF + * @arg RCC_HSE_ON: HSE oscillator ON + * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock + * @retval None + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_HSE)); + /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ + /* Reset HSEON bit */ + RCC->CR &= CR_HSEON_Reset; + /* Reset HSEBYP bit */ + RCC->CR &= CR_HSEBYP_Reset; + /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ + switch(RCC_HSE) + { + case RCC_HSE_ON: + /* Set HSEON bit */ + RCC->CR |= CR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + /* Set HSEBYP and HSEON bits */ + RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; + break; + + default: + break; + } +} + +/** + * @brief Waits for HSE start-up. + * @param None + * @retval An ErrorStatus enumuration value: + * - SUCCESS: HSE oscillator is stable and ready to use + * - ERROR: HSE oscillator not yet ready + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + ErrorStatus status = ERROR; + FlagStatus HSEStatus = RESET; + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); + + if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + return (status); +} + +/** + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * @param HSICalibrationValue: specifies the calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * @retval None + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue)); + tmpreg = RCC->CR; + /* Clear HSITRIM[4:0] bits */ + tmpreg &= CR_HSITRIM_Mask; + /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ + tmpreg |= (uint32_t)HSICalibrationValue << 3; + /* Store the new value */ + RCC->CR = tmpreg; +} + +/** + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * @note HSI can not be stopped if it is used directly or through the PLL as system clock. + * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the PLL clock source and multiplication factor. + * @note This function must be used only when the PLL is disabled. + * @param RCC_PLLSource: specifies the PLL entry clock source. + * For @b STM32_Connectivity_line_devices or @b STM32_Value_line_devices, + * this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry + * @param RCC_PLLMul: specifies the PLL multiplication factor. + * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5} + * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16] + * @retval None + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); + + tmpreg = RCC->CFGR; + /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ + tmpreg &= CFGR_PLL_Mask; + /* Set the PLL configuration bits */ + tmpreg |= RCC_PLLSource | RCC_PLLMul; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the PLL. + * @note The PLL can not be disabled if it is used as system clock. + * @param NewState: new state of the PLL. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; +} + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/** + * @brief Configures the PREDIV1 division factor. + * @note + * - This function must be used only when the PLL is disabled. + * - This function applies only to STM32 Connectivity line and Value line + * devices. + * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source. + * This parameter can be one of the following values: + * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock + * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock + * @note + * For @b STM32_Value_line_devices this parameter is always RCC_PREDIV1_Source_HSE + * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor. + * This parameter can be RCC_PREDIV1_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source)); + assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV1[3:0] and PREDIV1SRC bits */ + tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); + /* Set the PREDIV1 clock source and division factor */ + tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} +#endif + +#ifdef STM32F10X_CL +/** + * @brief Configures the PREDIV2 division factor. + * @note + * - This function must be used only when both PLL2 and PLL3 are disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor. + * This parameter can be RCC_PREDIV2_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV2[3:0] bits */ + tmpreg &= ~CFGR2_PREDIV2; + /* Set the PREDIV2 division factor */ + tmpreg |= RCC_PREDIV2_Div; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + +/** + * @brief Configures the PLL2 multiplication factor. + * @note + * - This function must be used only when the PLL2 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor. + * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL2Config(uint32_t RCC_PLL2Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL2Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL2MUL; + /* Set the PLL2 configuration bits */ + tmpreg |= RCC_PLL2Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL2. + * @note + * - The PLL2 can not be disabled if it is used indirectly as system clock + * (i.e. it is used as PLL clock entry that is used as System clock). + * - This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL2Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState; +} + + +/** + * @brief Configures the PLL3 multiplication factor. + * @note + * - This function must be used only when the PLL3 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor. + * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL3Config(uint32_t RCC_PLL3Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL3Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL3MUL; + /* Set the PLL3 configuration bits */ + tmpreg |= RCC_PLL3Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL3. + * @note This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL3Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the system clock (SYSCLK). + * @param RCC_SYSCLKSource: specifies the clock source used as system clock. + * This parameter can be one of the following values: + * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock + * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock + * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock + * @retval None + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); + tmpreg = RCC->CFGR; + /* Clear SW[1:0] bits */ + tmpreg &= CFGR_SW_Mask; + /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ + tmpreg |= RCC_SYSCLKSource; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Returns the clock source used as system clock. + * @param None + * @retval The clock source used as system clock. The returned value can + * be one of the following: + * - 0x00: HSI used as system clock + * - 0x04: HSE used as system clock + * - 0x08: PLL used as system clock + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask)); +} + +/** + * @brief Configures the AHB clock (HCLK). + * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * This parameter can be one of the following values: + * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK + * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 + * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 + * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 + * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 + * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 + * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 + * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 + * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 + * @retval None + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_HCLK(RCC_SYSCLK)); + tmpreg = RCC->CFGR; + /* Clear HPRE[3:0] bits */ + tmpreg &= CFGR_HPRE_Reset_Mask; + /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ + tmpreg |= RCC_SYSCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the Low Speed APB clock (PCLK1). + * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB1 clock = HCLK + * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE1[2:0] bits */ + tmpreg &= CFGR_PPRE1_Reset_Mask; + /* Set PPRE1[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the High Speed APB clock (PCLK2). + * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB2 clock = HCLK + * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE2[2:0] bits */ + tmpreg &= CFGR_PPRE2_Reset_Mask; + /* Set PPRE2[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK << 3; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the specified RCC interrupts. + * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @param NewState: new state of the specified RCC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(RCC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Perform Byte access to RCC_CIR bits to enable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +#ifndef STM32F10X_CL +/** + * @brief Configures the USB clock (USBCLK). + * @param RCC_USBCLKSource: specifies the USB clock source. This clock is + * derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB + * clock source + * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source + * @retval None + */ +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource)); + + *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource; +} +#else +/** + * @brief Configures the USB OTG FS clock (OTGFSCLK). + * This function applies only to STM32 Connectivity line devices. + * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source. + * This clock is derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @retval None + */ +void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource)); + + *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the ADC clock (ADCCLK). + * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * This parameter can be one of the following values: + * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 + * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4 + * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6 + * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8 + * @retval None + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_ADCCLK(RCC_PCLK2)); + tmpreg = RCC->CFGR; + /* Clear ADCPRE[1:0] bits */ + tmpreg &= CFGR_ADCPRE_Reset_Mask; + /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */ + tmpreg |= RCC_PCLK2; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +#ifdef STM32F10X_CL +/** + * @brief Configures the I2S2 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S2 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S2CLKSource: specifies the I2S2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry + * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry + * @retval None + */ +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource; +} + +/** + * @brief Configures the I2S3 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S3 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S3CLKSource: specifies the I2S3 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry + * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry + * @retval None + */ +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the External Low Speed oscillator (LSE). + * @param RCC_LSE: specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: LSE oscillator OFF + * @arg RCC_LSE_ON: LSE oscillator ON + * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock + * @retval None + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_LSE)); + /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ + /* Reset LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Reset LSEBYP bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ + switch(RCC_LSE) + { + case RCC_LSE_ON: + /* Set LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + /* Set LSEBYP and LSEON bits */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @note LSI can not be disabled if the IWDG is running. + * @param NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the RTC clock (RTCCLK). + * @note Once the RTC clock is selected it can't be changed unless the Backup domain is reset. + * @param RCC_RTCCLKSource: specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock + * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128 selected as RTC clock + * @retval None + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); + /* Select the RTC clock source */ + RCC->BDCR |= RCC_RTCCLKSource; +} + +/** + * @brief Enables or disables the RTC clock. + * @note This function must be used only after the RTC clock was selected using the RCC_RTCCLKConfig function. + * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; +} + +/** + * @brief Returns the frequencies of different on chip clocks. + * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * @note The result of this function could be not correct when using + * fractional value for HSE crystal. + * @retval None + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + +#ifdef STM32F10X_CL + uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t prediv1factor = 0; +#endif + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & CFGR_SWS_Mask; + + switch (tmp) + { + case 0x00: /* HSI used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & CFGR_PLLMull_Mask; + pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; + +#ifndef STM32F10X_CL + pllmull = ( pllmull >> 18) + 2; + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + { + #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18; + + if (pllmull != 0x0D) + { + pllmull += 2; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13 / 2; + } + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + + if (prediv1source == 0) + { /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1; + pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2; + RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F10X_CL */ + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + } + + /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ + /* Get HCLK prescaler */ + tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + /* Get PCLK1 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get PCLK2 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get ADCCLK prescaler */ + tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + /* ADCCLK clock frequency */ + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/** + * @brief Enables or disables the AHB peripheral clock. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @arg RCC_AHBPeriph_ETH_MAC_Tx + * @arg RCC_AHBPeriph_ETH_MAC_Rx + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_FSMC + * @arg RCC_AHBPeriph_SDIO + * + * @note SRAM and FLITF clock can be disabled only during sleep mode. + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBENR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2ENR |= RCC_APB2Periph; + } + else + { + RCC->APB2ENR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1ENR |= RCC_APB1Periph; + } + else + { + RCC->APB1ENR &= ~RCC_APB1Periph; + } +} + +#ifdef STM32F10X_CL +/** + * @brief Forces or releases AHB peripheral reset. + * @note This function applies only to STM32 Connectivity line devices. + * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH_RESET(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} +#endif /* STM32F10X_CL */ + +/** + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2RSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2RSTR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1RSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1RSTR &= ~RCC_APB1Periph; + } +} + +/** + * @brief Forces or releases the Backup domain reset. + * @param NewState: new state of the Backup domain reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_BackupResetCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Clock Security System. + * @param NewState: new state of the Clock Security System.. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Selects the clock source to output on MCO pin. + * @param RCC_MCO: specifies the clock source to output. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * @arg RCC_MCO_PLL2CLK: PLL2 clock selected + * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected + * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected + * @arg RCC_MCO_PLL3CLK: PLL3 clock selected + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * + * @retval None + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCO)); + + /* Perform Byte access to MCO bits to select the MCO source */ + *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO; +} + +/** + * @brief Checks whether the specified RCC flag is set or not. + * @param RCC_FLAG: specifies the flag to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready + * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * @retval The new state of RCC_FLAG (SET or RESET). + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_FLAG(RCC_FLAG)); + + /* Get the RCC register index */ + tmp = RCC_FLAG >> 5; + if (tmp == 1) /* The flag to check is in CR register */ + { + statusreg = RCC->CR; + } + else if (tmp == 2) /* The flag to check is in BDCR register */ + { + statusreg = RCC->BDCR; + } + else /* The flag to check is in CSR register */ + { + statusreg = RCC->CSR; + } + + /* Get the flag position */ + tmp = RCC_FLAG & FLAG_Mask; + if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the RCC reset flags. + * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + * @param None + * @retval None + */ +void RCC_ClearFlag(void) +{ + /* Set RMVF bit to clear the reset flags */ + RCC->CSR |= CSR_RMVF_Set; +} + +/** + * @brief Checks whether the specified RCC interrupt has occurred or not. + * @param RCC_IT: specifies the RCC interrupt source to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * @retval The new state of RCC_IT (SET or RESET). + */ +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_GET_IT(RCC_IT)); + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the RCC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the RCC's interrupt pending bits. + * @param RCC_IT: specifies the interrupt pending bit to clear. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval None + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_CLEAR_IT(RCC_IT)); + + /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt + pending bits */ + *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/runtests.sh b/runtests.sh index c3fe712..44b4055 100644 --- a/runtests.sh +++ b/runtests.sh @@ -25,12 +25,12 @@ case $TARGETARCHITECTURE in "arm-none-eabi") [ -d "binary_assets" ] || git clone https://github.com/haarer/binary_assets.git ( cd examples && [ -d "STM32F10x_StdPeriph_Lib_V3.5.0/Libraries" ] || unzip ../binary_assets/en.stsw-stm32054.zip ) - ( cd examples/arm-none-eabi-example ; make clean && make arm-test.bin ) - test_build_result "examples/arm-none-eabi-example/arm-test.bin" + ( cd examples/arm-none-eabi-example ; make clean && make build/arm-test.bin ) + test_build_result "examples/arm-none-eabi-example/build/arm-test.bin" ( cd examples/arm-none-eabi-example ; make clean ) - ( cd examples/arm-none-eabi-example-cpp ; make clean && make arm-test.bin ) - test_build_result "examples/arm-none-eabi-example-cpp/arm-test.bin" + ( cd examples/arm-none-eabi-example-cpp ; make clean && make build/arm-test.bin ) + test_build_result "examples/arm-none-eabi-example-cpp/build/arm-test.bin" ( cd examples/arm-none-eabi-example-cpp ; make clean ) ;; "m68k-elf")