你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32:从菜鸟到牛人就是如此简单!

[复制链接]
nenoyaji 发布时间:2020-12-15 10:00
STM32:从菜鸟到牛人就是如此简单!
# d. }* U& x& D  d5 p

6 x+ A( R% o4 F2 @: E
为了学习单片机而去学习单片机的思路是不对的
你问
如何系统地入门学习stm32?
本身就是一个错误的问题
假如你会使用8051
会写C语言
那么STM32本身并不需要刻意的学习
你要考虑的是
我可以用STM32实现什么?

5 T( G1 t; P  B  j% Y" r

4 K2 a* H* y9 g9 E. h$ Q. K5 _( h- V
为什么使用STM32而不是8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA?是51的内存太小而你要存储的东西太多?
2.1.png
  g6 h5 U1 M! F
( \% u# q7 U! X4 f: Z
, }# J6 f. a: [

- R2 U0 n( u: W' a7 x
当你需要使用STM32某些功能,而51实现不了的时候,那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等……

1 P$ |5 h8 _; L6 Q: t0 u9 S4 B* ~6 w. E2 J$ d* E) R

9 X1 E' j7 x& d! o0 G
01
从菜鸟到牛人的学习步骤

* m; \( k* h) ?, z1 }. }% a6 m
我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。

! C# X: E5 j  n% g% Y
英文好的同学,请不要以为你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处的。

0 m, {4 [  k2 J/ C1 Q
8 P" e9 s/ K2 ^1 t
STM32处理器进入国内市场时候,ST官方(或者第三方)的推广工作做的非常好。翻译了大量的英文文档,迎合了国内的很多工程师的思维。

% ^( t' u" W' L$ ~. i- c
学习的时候,关注两个比较重要的文档:《STM32F103xxx参考手册》,《STM32固件库使用手册》。这是针对有充足的时间、精力的同学,建议去下载需要查阅的文档,以获取更多信息。

2 b8 |1 g6 H. T4 X/ b6 f/ {
. [8 V" D- q" k- n
阅读《STM32F103xxx参考手册》,一定要注意,不需要全部阅读——没有时间的。建议选读,但是前几章必读。存储器和总线架构、电源控制、备份寄存器、复位和时钟控制,通用和复用功能I/O,中断和时间等等前几章一定要花时间阅读。
3 k7 Q. t6 v, A3 V* c0 U0 g
后面章节,讲述的是具体的功能模块设计。如果我们用到哪个模块,就可以去阅读哪个模块。比如在使用AD的时候,就需要去阅读第10章ADC。其他不举例。相信每个初学者都有自己的研究方向和判断。
/ L. q) w0 l9 B" w
8 M, u4 D: d" E2 q/ u6 t8 B) B* j. ^/ l
阅读《STM32固件库使用手册》,主要是为了简化编程。STM32给我们提供了一个非常好的固件函数库,我们只要去调用即可。当然,我们也可以不去碰这些固件库——传说使用它会使得代码效率变低,是有道理的。网络上也出现了很多网友自己写的代码,没有使用带固件库函数。如何取舍,在于您的选择。
+ c6 F4 S+ k- M- G" r9 O! d
1 [; W# e3 Z8 \* Z) r- C* V/ |) A+ k
这里我主要强调的是,阅读《STM32固件库使用手册》的时候,前面几章也是必须阅读的。比如第一章文档和库规范中的命名规则,编码规则,这些都是需要注意的。第二章是最关键的,希望大家熟读。第二章描述了固件库的架构,我们如何去使用固件库的步骤等。有了第二章的基础,我们就可以借助固件库写出自己的代码了。第四章开始之后,就可以根据大家的需要来阅读。实际上,后续的章节,都是描述某个模块有什么什么函数,每个函数如何使用等。

" k5 t- z/ p9 S/ D
# l% {$ `/ }6 y: C
关于后面的章节,建议对GPIO库函数、中断部分库函数、复位和时钟设置的库函数要比较熟悉,因为平时经常会用到。

' y) r; N- g" ~, e/ z+ g
以上提到的这两个文档,已经足够您看的了,呵呵。希望您能从中获取大量的STM32基础知识。

4 e& G1 Q0 @8 ]% z
% P2 S3 p& S% _& `9 v0 h
# m1 w" Z$ A* x/ u0 A+ U  d, ]' R$ _
02
设定一个不错的两周入门计划

8 r% U& C4 ?+ n
(1)这里所谓的“入门”,指的是能理解并掌握一些常用的STM32外设,真正想掌握一款处理器,两周根本说明不了什么问题。只能说,你已经有所了解了。但是,这对我们初学者来说已经足够了。

9 x* k- g% }( w2 h- T7 K( {6 M  k
(2)这里所谓的“两周”,根据每个人的时间安排不同而不同。
  i8 p  r2 Z  ?+ z% U

5 b4 P) v' B- k* I1 [
如果您每天有充足的时间学习,那么可以规定自己尽快地能独立地进行简单的STM32开发。

# N4 O+ i! Z0 l7 J( {4 y( b. n
如果您每天只有业余时间来学习STM32,建议根据您的具体情况安排时间。毕竟计划时间如果安排太紧,反而收不到良好的效果,只能进入恶性循环,这是我们要避免的。
% R  t# Y2 y& O5 a1 q/ f6 J* \0 x; g& q
9 o8 w/ L' ?1 A2 t
但是建议,不管您有无充足的时间,都必须给自己做一个计划!!

. _) l, Y- g/ \
这里列出一个思路,仅供参考。
3 l. Y$ Y9 Z& t/ P& D1 _) [
- d  g5 _7 j/ _7 H. l
步骤一,安装完STM32学习的软件,比如J-Link、Keil for ARM(MDK)、ISP(如果需要从串口下载的话)。这些软件安装的详细步骤,可以参考我们推出的相应教程进行。

# f, P, d# ^+ m' }) o
9 Y8 `3 O9 ^& L' x
步骤二,挑选部分例程的HEX,比如LED灯的例程HEX文件,下载到芯达STM32开发板中,观察两个LED灯的闪烁情况。这部分的操作,可以参考我们推出的相应的教程进行。
  Z% O& B" b; C$ R* P( j1 Q

& K  O+ F9 j4 R' c- L: y# F) Y# I
实际上,以上两个步骤,是为了熟悉要使用的工具软件而已。属于找感觉的阶段。其实我们还没开始STM32的学习呢!

- v, |" V  i: b  p: H6 ~, h* f" C* M! _! a: m7 N3 u# Q
步骤三,准备几个常用的文档,比如《STM32的用户手册》,《STM32固件库使用手册》等文档。用于平时查阅。这些文档,在光盘中的芯片手册目录中均可找到。

1 I6 ]/ H9 v$ x' K9 |$ `) @5 X
) a" D- d' G) e! `& ^, F
步骤四,开始查看例程的编写,看看例程是如何写的,自己可否修改下例程,达到自己想要的效果呢?
: e6 n: x3 b; J# k1 N9 L
7 [  N) Z& {; L5 L
步骤五,Ucos-II的移植,是否需要试一下?
$ Y3 F  a" z+ Y) g0 l
恭喜你,至此,你已经可以自如进行独立的开发了。最后一步,给自己一个目标(项目),把它实现出来!

& _: M& `; h- Z: l% o& L9 K* b) G; p! N
6 s; E4 K5 I9 J/ X! Z
再次强调,以上只是一个学习STM32的思路,供大家参考。下面列出了前面关键的步骤,希望大家能尽快入门。
7 p' o7 I; a* \# T3 n" ~- E$ L  ]
+ d! B5 s6 m( }
第1步:熟悉调试软件

$ s% s! T, t4 S' `
对初学者来说,我们至少需要安装两个软件:J-Link驱动软件、MDK(就是原来的Keil)软件。

8 i1 v) v5 f5 p, ~. R, V7 ~' w
这两个软件在安装软件的过程可以查看神舟开发板用户手册,这里不再重复,大家可以参考我们推出的教程《如何安装J-Link驱动软件》以及《如何安装MDK(Keil)软件》。如何验证自己已经熟悉调试软件的操作了呢?很简单,神舟STM32开发板光盘里附带了很多HEX格式的文件,可以选择一些HEX文件,来观察运行结果。

9 [9 a; J9 V1 x
该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。
- e* r6 C' J8 {% \- \% {; y8 O

9 [' {3 ]4 H7 C+ n! ?1 ~2 g- X
第2步:GPIO编程

7 \* [  a5 z) H+ q) ~
这是第一次接触固件库的编程,一定要硬着头皮去了解固件库。建议大家尽量去用固件库。而不是避开固件库自己写代码——这样只能在学习中才会发生。实际的项目中,代码成百上千个,如何一个一个自己写?调用固件库中的函数来完成,才是王者之道。

- \# ?. f2 C. U2 O# I2 w' A/ O4 r+ N0 @4 R" v3 @
GPIO本身的编程实际上很简单
2 ~1 ?0 e3 r9 r- y+ S! S
1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。

+ h" x; @: J" U8 k" W' P
2、操作寄存器,往寄存器里置1或者清零操作——这个步骤,固件库已经提供了专门的GPIO_SetBits函数和GPIO_ResetBits函数,我们只要去调用即可实现对IO口的置1和清零。

( S' z: s1 L; H3 Z0 b3 B, b# @1 U5 c
3、实现多种花样的LED闪动,使得自己熟悉GPIO的编程过程。
; V+ w! l" o! K% j" ~+ n  E
9 i& d$ s% l1 y& N6 O8 m
该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。

* `+ }. N' g; K- |- e5 U6 T1 c% r+ C! z  S' j# B6 S* X, U
第3步:开始全新的STM32深入研究
) I! E9 {. |+ P
经过以上调试软件的熟悉和GPIO口的编程调试后,相信您已经对STM32有一定的了解。
# O& m" G8 I# M% {4 \; p% S
至少知道如何利用STM32的固件库去写一个代码。在这个阶段,将要接触到串口编程、TFT液晶屏驱动编程、定时器编程、串行外设接口SPI编程、存储器编程、SD卡与文件系统移植、USB读写、UCOS移植等,有精力还可以研究其他外设。

! o! `/ z$ d, i7 \7 m# I: k, d, ~8 _

8 _  q# G( p; i7 G" d2 [+ k$ c9 x% T1 w; v$ F1 A
03
GPIO的8种工作模式详解

9 {: D) \0 |9 s, g. d" V# g

2 }% C2 S" D$ Z! y5 v
推挽输出
可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。

) P) \5 o1 D; `5 A( U2 D8 T; [2 ?
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

/ U% f4 ^- [: s7 y8 E
$ h  k) d2 p# p! z- c- A1 g# f8 X' @  L! R
开漏输出
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:
' t( ^' ^0 l/ I5 i" B

( N3 [+ _3 U) F* `3 v' G8 D) Y
1、利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。IC内部仅需很小的栅极驱动电流。

/ g8 G. a- v! q% K' j$ q
2、一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
' C  _1 V8 l1 d6 Z9 o
3、开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
9 `1 Y. ]3 C, I% W# z
4、可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

; R2 F4 T3 {& p/ y6 Y
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

/ Y' d  S) e7 l( N* ?
2.2.png

0 b. w% t! ~/ C; G, F, j
4 z+ l: s; ^4 |& [% Y! X
6 M/ D# C! r: x3 L# I$ @3 ]$ Z) S9 b8 b' h0 f- C) X# Y$ q
浮空输入
! g" G/ w. f5 I+ a1 D: h9 E
对于浮空输入,一直没找到很权威的解释,只好从以下图中去理解了
% E" {7 ]; \; x) N2 H- L, @
2.3.png
) h! E0 K' X: g& V% t% N5 X4 ^6 ?
& m+ y6 i/ r! P6 j* p+ a$ m

+ R3 Z- b8 u0 g1 d1 h0 A: C& O" i
* D2 n3 G" o( y* m" G2 I( j
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
4 d  N# O3 g& d, \
# i  A* R. P! \3 ~  C: K. w
7 \; E) r8 X( y" P5 k

4 @" ?7 U3 W8 b2 U4 ^: L; [
上拉输入/下拉输入/模拟输入
3 l; O0 t2 n9 m. T
这几个概念很好理解,从字面便能轻易读懂。

0 x) K, t3 w( [9 F  J
, c$ h9 Q5 R# w2 a; g# ]( i
复用开漏输出、复用推挽输出
5 |! d, s6 J" ?) L" x, n3 _) F
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
: c) t6 T+ A2 t+ J$ q" i2 L
总结在STM32中选用IO模式

& g8 |1 [' S1 w9 h4 M7 x9 y
1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
! U6 ~  F9 }, Y' N8 p' r7 @' H
2、带上拉输入GPIO_IPU——IO内部上拉电阻输入
1 i+ G) v$ n2 y. t- T0 O3 T
3、带下拉输入GPIO_IPD——IO内部下拉电阻输入
6 q' e- Q2 F; g, ~7 I
4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电

. h& {* V& e& q9 C( `7 x/ F
5、开漏输出GPIO_OUT_OD——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
7 {  C0 c. [! i# Q  m5 ~+ Z; o
6、推挽输出GPIO_OUT_PP——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的

, |% u: ^$ |. Z
7、复用功能的推挽输出GPIO_AF_PP——片内外设功能(I2C的SCL,SDA)

7 m2 K: _  S' L! X
8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
' s0 y* s' h! S; U+ A2 v' J
, @4 m, i" I0 a) r* l2 ^/ c: c

* [; Q$ P. w" E( S
04
STM32设置实例
& C: u! G8 E2 ^- J3 t: u# ~
1、模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
2 l$ E" D1 v/ _1 n5 J* C
2、如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
8 d  L( \; I3 |
通常有5种方式使用某个引脚功能

. X3 L  e  P/ W$ F$ j
4 P6 ?9 q$ l0 e6 L; |
它们的配置方式如下:
  i% @- l" |, m! K/ Q
1、作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。

! n: q8 c& P) ^# u) O
2、作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
8 i! g' p- _, }0 o9 ^
3、作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。

! g2 r- E0 S# m/ _  U$ O1 s8 a  X/ l
4、作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。

, B% E, M6 H) {0 Y9 U5 N
5、作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
; [  v( p) D5 N$ K! X  m

5 w7 V% {7 d7 ^4 H2 Z0 L
注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。比如要使用STM32F103VBT6的47、48脚的USART3功能,则需要配置47脚为复用推挽输出或复用开漏输出,配置48脚为某种输入模式,同时使能USART3并保持I2C2的非使能状态。如果要使用STM32F103VBT6的47脚作为TIM2_CH3,则需要对TIM2进行重映射,然后再按复用功能的方式配置对应引脚。
# B  Z$ j/ H" C4 I7 k, A

1 a1 I3 U- M% _$ |* x
---------------------END---------------------
7 |3 Y0 d. W" U  j
文章出处:嵌入式ARM
/ w8 z: [4 b; s2 T/ n7 k! B

3 U1 s7 |$ L3 S5 n' W6 W$ J6 F/ r1 W
收藏 2 评论1 发布时间:2020-12-15 10:00

举报

1个回答
kylixyao 回答时间:2020-12-15 12:10:53

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版