|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
当初我是如何从51单片机过度到STM32的,希望有同样烦恼的认真看完,绝对能让你受益匪浅。
" `8 E1 H* ]6 u* M6 K* b
# M/ S% i3 G' T2 W, q, o& B我第一份工作是做单片机软件工程师,当时也没什么项目经验,老大自然也不会给我参与什么新项目开发。6 Q. t+ c! A7 g* Z% P! A* ?0 H' B
' f& V1 N: H: V+ `" M* H7 y3 k我每天的工作就是维护公司老产品,改改代码,给定制化的客户升级下功能。
9 ?0 D2 D5 |/ j( z! E% n3 a0 X$ i+ V0 @& H& s5 s1 v& v! `, b
改代码是一件非常痛苦的事,比自己重新写还痛苦,因为要去理解别的工程师的思维。( g: ^( X; z0 s1 w( K* Z
3 U) }- g% y" D. N) N! f: @7 T不过,这是一个工程师必备的技能,现在回想这几年,成长最快的时候就是看那些大佬写的代码,闭门造车,只会让你成为井底之蛙。2 X- b+ r& [& ]2 O6 ^% \+ t
/ i5 B5 H& h9 j# K8 k: j4 {
公司的产品大多数都是用stc 51单片机做的,还有就是NXP的ARM7单片机。8 h" E& s- L7 Y' U" S }
) {$ d* ~' X6 H2 ~7 m8 ]8 K9 ?刚从51单片机过渡到ARM7的时候,那段时间确实掉头发更严重了,太特么烧脑了。
% g6 g) y8 p+ L- d! T' _5 S
; {7 p% X. }" i还好,开发模式基本跟51单片机相同,都是通过配置寄存器使用,只不过寄存器要复杂也多很多,我记得当时用的好像是lpc2103。
_" y3 X% q+ D- |0 U) U9 d( c$ Z& g
还好只是改代码,如果让我看数据手册去配置寄存器,估计我也做不出来。
* {' I* F5 J1 V; Q, F* [ N; M$ o5 T+ o
大概做了3,4个月,我基本上上手了,原来改个功能要半个月,现在改个功能只需要1周左右。
8 Y( b$ p% J3 P+ H' i! ?' T
- J2 G7 c6 p# w3 b& f5 n p那个时候就有点飘了,单片机开发也不过如此。
# O1 i( o7 S8 X. f/ j! T
2 x# j; a9 m7 z# S* Q后来,跟同事相处多了,也熟了,有个同事介绍了一个外单问要不要一起做。, k. N w8 v+ r8 Y
3 V0 F: \, G. P. }/ G. T
当时,我想跟着这些老油条做,即便不挣钱积累点经验也好就答应了。' W# U6 Z6 E( @& x
1 X$ f1 d; P1 K+ a# F& g3 O; t
整个项目需要用到2个单片机,一个51单片机做屏显示,一个做主控,主控这边需要一个类似于ARM7这种资源丰富点的单片机。
% R2 w1 w: v8 k$ G
: _1 R9 p/ s. D _) s这个项目我非常积极,主动要求做工作量最大的主控程序,然后钱平分,同事听到连忙点头叫好。1 D: C8 Q" x" _6 d! t
6 _& L( b6 G& p" j U! e) p硬件选型是他选的,他推荐我们用STM32的单片机,开发起来挺爽,我也不懂,完全听他安排,反正这个项目我完全冲着学东西去的,哪怕是自己亏点钱。
1 r' ^& b: {( B# R" J
+ _' X* \" X! ^4 z在同事设计电路的时候,我就同步开始研究STM32单片机,最好等硬件回来就能开始调试功能。# P* X* b2 j0 u9 u; t, h/ J
1 N! d0 Q; u' [; o% a下图是我最终写好的代码,所有功能代码都写在main函数里,没用单独函数单元,现在看着真的是太渣了。. M3 x$ t$ _' @1 a
0 B% A/ X4 u5 y% J' A* T# i# u& t: N @, d0 a
学习一款新单片机最好的方式就是买一个开发板,所以我自掏腰包买了一个开发板。- d2 X2 R0 L& t2 F7 x& j) s8 r
k. s; r. Z8 |
那个时候开发板还没现在这么完善,只有每个外设使用的例程,没有配套视频教程。- v9 \/ i0 r( j7 S% f
0 b; q( l, _, j; w, _7 r3 d6 p
开发板拿到以后,我就开始从最简单的GPIO开始学习。
1 l. O$ p4 U7 u; E3 ~. m- z, L3 ~2 o7 U* l7 n
但…当我打开GPIO工程的那一刻,我懵逼了…这是什么鬼?用一个IO口怎么都这么复杂?& l* a6 h4 w" I' D0 ?
1 K0 D9 Y( X+ X4 Y! m, I到处都是结构体,指针,回调函数。
/ A3 o! a- T1 a3 U, _5 g9 W* c& N) Z9 p# N w
STM32和51单片机代码架构不一样,虽然底层都是配置寄存器去使用单片机外设,但STM32不用我们自己配置寄存器,而是调用官方固件库直接打开。
% E% X5 f: \) e& V, ]! l8 O7 w5 Y- C' e) J" y! Y9 m# A
所以,原本是学STM32单片机的,最后变成了学固件库,学会固件库你就学会了STM32。. d% J4 a" c; t1 [1 o) M2 H
! M# ^! X+ o, Q* B/ m
但是想要学固件库,需要你有一定的代码理解能力和水平的基础铺垫,比如说你要熟悉指针、结构体、枚举。
" ~3 }2 \6 M4 {3 p% ?
9 P0 w, U) f `5 e7 K) u: p很多人心急,一在开发板上学完51单片机,马上就开始学STM32,连项目都不做一个,有些甚至直接学STM32。
! X- N" |, L: V- ^4 t9 d
( K' X' U$ s4 P( p" ~# f) I导致在学习STM32的时候举步艰难,每学一步都碰到各种问题无法解决。
8 ?3 O1 B( O: @- Q
0 J2 j# y8 Y' o! m+ l这也是为什么我们无际单片机编程要求学员先学51单片机,再做一个项目,做完再学STM32的原因。
& x& @ ?+ v% Y. l$ V) p
+ N6 @7 @+ z7 F& ~学习这个就像我们玩游戏一样,先升级搞装备,再挑战boss。. k9 i4 z9 Q+ @8 c$ p
7 j/ `! W$ o3 Q( E& e; y我在学习STM32之前已经接触过几个项目,所以至少保证了固件库代码都能看得懂。
4 z6 g: o( n/ y' p5 n9 |: O) L; g! I5 |+ z
我一边改开发板的例程,一边在开发板上做实验。/ D7 C. P# r/ z$ B
0 p( T; H9 S& O: ?
我会举一反三去做实验,比如说开发板是配置PA0,那我会改成PB0、PC0试试。
! }0 t# T$ r7 o' w
, A. l/ V3 @; P5 u其他外设同理,开发板开启定时器1,那我会改成定时器2。( Q5 M7 n8 ?9 t \
) k' w6 p$ `/ y1 W5 u
我只研究我这个项目用到的外设,GPIO、定时器、串口、NVIC、DMA、RTC、ADC。
7 R" h' |2 s% l3 R+ g2 L; d: a" p3 |, ]) `$ f6 q; p
其它没用到的我看都不去看。) `/ e5 @( n* W. L4 W
: x; k! i" h* A' W1 b2 @大概花了半个多月的时间,我就把这些外设用起来了,用熟了以后感觉太爽了,比51单片机和LPC爽多了。
0 r' O* m/ U" L8 `8 J# a% X1 v4 ^* c! @( f" l1 k- P+ w+ I
用熟固件库,甚至连数据手册都不用看就能把外设用起来,更别说看寄存器了。! ]; M+ O9 M4 g; Q/ x
; a; ]$ e w6 C% y
项目时间也紧,没时间给我去研究。/ ^3 p8 O" ]* v5 J6 G- C
! e" Y0 g2 q& Q% T! g9 y
时隔多年回想起这件事,我都感觉误打误撞走了捷径,我很庆幸当初没深入去研究寄存器,没深入去看数据手册,不然走的弯路能绕地球一周。
# Y; J/ f/ g: C# R; C
! V8 |5 j1 @: j$ v1 q+ T因为看了也是白看,根本看不懂,还会打击自己自信,有现成代码为啥不用?" F G" j6 K% A3 _8 x
8 G6 e1 n7 l+ ^5 Q1 GSTM32单片机外设用起来以后,后面基本上就没怎么研究过单片机内部的东西了,剩下的时间基本就是完成产品的功能。( @/ F% ~/ _* U2 y
% ~" V5 L; c1 ^- c# b所以,学习STM32最好的方法就是通过项目去学习。: u' f) `# C0 c# x( w: L
7 {3 P& `" L0 R F0 o" i! @1 a/ K Z
等你做开发几年以后,相信你也会明白,虽然我们从事单片机程序开发,但真正的核心不是单片机,而是你的编程水平和思维。
$ `9 t7 b& a- f8 s
- M% }! v# D- O% b0 @' }& n$ W% ]当你连自己写代码实现功能都困难的时候,先不要去想如何把代码写的更好,而是先实现。; K7 u Y, I( I" u: \3 n
! N9 J! c. Y4 n A. ?& I等你实现了以后,再想代码怎么能写得执行效率更高、可移植性、可扩展性更好?+ P( m8 Q2 e. q7 N0 R/ d
( ?: c1 k2 T; i1 [
执行效率讲求的算法,可移植性和可扩展性讲求的是程序架构。2 A! m! e% X9 A! x: I% S3 H- O
. |& \1 ^$ M7 b0 `! }
这块,没经历过几个中大型项目的锤炼是很难领悟的。
" M. u( n1 x% ?: W: U4 x6 h% ?- p S
; L% W* l6 d8 _2 n) g程序架构这块,我在19年录制了一套比较系统的教程,目前看来可能是实用性比较强的。+ ^! H+ n T1 c! h1 K0 Q
; V% x" K5 h; A5 U1 K! B
7 t. w. j* B) |; g, `1 e& K教程讲了指针、结构体、回调函数、任务管理、队列这些高级的应用。& P. j$ G, V& p! J! p4 r. R
0 [% ` V, i0 }( G. P# N, Q- O也可以直接套在自己产品上,至少能提高30%的开发效率。
3 |8 M0 G' q1 F$ o, @: ~* d- G. Q/ }; v4 ^4 }& c& S% k- C
教程都是开源的,不用花1分钱。+ e9 `5 v$ I! k, S9 e* o z
$ f, S: w$ m9 J4 `2 A
最后总结:
" a" r/ u3 V" j9 P6 n1 U
3 E) u- q; `, W! K4 B- V( Z2 |5 k 学习STM32最快的方式就是通过项目去学习。: s7 h" I( O4 f0 Y; m* F
不用每个外设都学,只需要学常用的外设,剩下项目用到再去学。
5 B, S6 F9 @4 K9 q, y 把STM32当作一个工具使用,外设会用就行。2 s7 l3 T/ ^: f" L( ?' C
2 }. c* R& N# m1 l/ ~
) |' y, I/ {, W$ A/ i: t
|
|