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

基于STM32库函数经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:57
1.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  `( V$ X" }, C) `: o8 e/ X定义:Init是Initiate的简写,而Initiate有“开始”的意思,所以这个函数就是GPIO的初始化函数。且主要初始化哪一个引脚的工作模式和速度。(根据函数名简写的词得到全写的单词,再根据全写的单词去揣测这个函数的功能,有助于记忆这个函数哦)( F9 k" h! D  x0 L& Z& U8 B7 n
输入:这个函数的输入包含了两个。①、GPIO_TypeDef* GPIOx:这个输入变量主要是指GPIOA、GPIOB、GPIOC...等这些,可以从A到G。这就好比C51单片机的PA口、PB口和PC口,但是STM32的“口”比C51多一些。②、 GPIO_InitTypeDef* GPIO_InitStruct:这个输入变量是个结构体,也就是说,你得先构造一个结构体然后才能往这个函数里面输入。这个结构体包含了三个内容:指定GPIO口的哪一引脚(GPIO_Pin)、这一引脚要以什么工作方式工作(GPIO_Mode)、工作速度是多少(GPIO_Speed)。这个也好理解,这个初始化函数可以对每个口的每个引脚设定自己的工作特点。③、GPIO_Pin:用来指定引脚,注意书写格式GPIO_Pin_数字。比如:GPIO_Pin_0;GPIO_Pin_1。3 Q3 O% Z, k! n. v
  1. #define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \5 H9 G& G( [! |( r7 u  @
  2.                               ((PIN) == GPIO_Pin_1) || \
    . L( u8 ^: U; T$ a/ B% Y% }
  3.                               ((PIN) == GPIO_Pin_2) || \
    7 Q8 y6 f( t" D- ^
  4.                               ((PIN) == GPIO_Pin_3) || \
    / f2 B1 F5 `1 _% Z8 T% a
  5.                               ((PIN) == GPIO_Pin_4) || \
    ' J" Y* Q, q; J9 m9 o
  6.                               ((PIN) == GPIO_Pin_5) || \
    * a7 v0 L' r8 ^* S# B
  7.                               ((PIN) == GPIO_Pin_6) || \, b- J+ t! c4 d+ B# R/ p
  8.                               ((PIN) == GPIO_Pin_7) || \/ E3 j3 X, r- _
  9.                               ((PIN) == GPIO_Pin_8) || \. ]. a2 s) {* J
  10.                               ((PIN) == GPIO_Pin_9) || \2 ]! t5 z! q( Q0 {+ z7 X2 T5 a) {& d
  11.                               ((PIN) == GPIO_Pin_10) || \
    / ?! h0 i( [! I$ k0 e# q7 Y
  12.                               ((PIN) == GPIO_Pin_11) || \
    ; W  s+ i4 t) A3 C  L9 j
  13.                               ((PIN) == GPIO_Pin_12) || \
    / \0 y& s* e5 T
  14.                               ((PIN) == GPIO_Pin_13) || \
    # X* ?; Q" s! i
  15.                               ((PIN) == GPIO_Pin_14) || \; E* b, x8 }+ f8 U& K' e
  16.                               ((PIN) == GPIO_Pin_15))
复制代码

9 p! a" A6 f4 r6 x6 BGPIO_Mode:用来指定每个引脚的工作模式,输入输出共有八种工作模式。我们引用内部的代码看看八种模式是怎么书写的。
; o  E: x$ Z' w+ M, ~0 R6 H
  1. #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
    / Y$ X$ I! L; T6 Y9 ]7 Q$ g
  2.                             ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \. B. d8 O! Z* U& _% \1 Z
  3.                             ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \2 y6 f( o2 D! o) ^: X1 o
  4.                             ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
复制代码
& r$ Z6 ^; H1 P, w
也就是说,我们输入模式的时候,要按照它所要求的格式进行书写!GPIO_Speed:STM32的引脚主要有如下的三种初始化速度。它用枚举法,把具有的三个速度放置在了一个结构体中。我们输入,在当前萌新时期下,输入这三个速度最好,等到大佬时候再其他速度。最后还是要注意书写格式!!!. T& T0 g$ |* z7 L7 V1 Z% L- Z
  1. typedef enum
    . u% S: H; V, I
  2. { % Y7 Y6 U3 n* w, z
  3.   GPIO_Speed_10MHz = 1,
    6 V5 c2 f: U& b; x2 w$ m) ~9 k
  4.   GPIO_Speed_2MHz, : l$ K, m$ Q6 l; B8 `% i
  5.   GPIO_Speed_50MHz
    ' T& o& h5 P" p+ r9 K( K
  6. }GPIOSpeed_TypeDef;
复制代码
9 D9 e$ l) R- _% F# X( h( ~: C
输出:对函数无输出,但是实际上对芯片的若干引脚进行的初始化,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。  ^4 O% h% S% t/ h- x

$ H* S& f8 i  _8 i5 @( G+ X
例子:
; K3 E: v) [# {% U: X
  1. GPIO_InitTypeDef GPIO_InitStructure;' B" M" o" S" x. i, H& N
  2.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    $ I' D& C1 k+ N1 U- t1 p
  3.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
      i, B, T) ^: {! [
  4.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    . y1 {7 G$ p4 N/ N; D1 E3 s) X- o" u
  5. GPIO_Init(GPIOD,&GPIO_InitStructure);
复制代码

" ], p1 d2 H2 h- p可见,这个程序段是对GPIOD口的2引脚进行工作模式(PP)和工作速度(50MHz)的初始化。0 T1 G4 e: n! i2 Z, H/ w, O4 [- @

: g+ t: f$ {) u# m: P- O9 Z0 z  V注意:先设置一个结构体,然后再对结构体里面的内容进行填充,最后把这个结构体输入到初始化函数中。最后但也很重要的是,我们输入到函数里面,对结构体,我们用指针引入进去就好了!!!&+结构体名。
% x) k$ k. y1 P1 g9 X" L3 I, w! Z7 n  ]5 T1 t$ P5 k4 L" x7 I
2. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);2 S! j8 N& {0 z3 t
定义:"ReadInputDataBit"中文直译就是“读”“输入”“数据”“位”,所以这个函数是用来读取某一个口的某一引脚的电平(0或1)。4 y1 ?# K0 f2 y: s/ i/ j7 v3 a
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。
+ a2 _4 Z! x1 d& B" }输出:高低电平。
, K" z; r( D- p" e3 j" \  Q- T( Y
例子:
( E& N5 G; \2 m8 o* t4 k
  1. GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8);//读取GPIOD.8的输入电平
复制代码
) |/ b  v2 O) t+ m6 Q6 H# P
3. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);6 E: e" ?# c* F7 N% F; [5 D
定义:"ReadInputData"中文直译就是“读”“输入”“数据”,与前面的对比就是他这个函数少了“位”这个符号。所以这个函数是用来读取某一个口所有引脚的电平。
. z( G1 L; u- }& |输入:GPIO_TypeDef* GPIOx:哪一个口。
* [5 B* }) J4 k0 |  y+ g2 v输出:一组的高低电平。; _$ m4 B. J2 _
8 n, }- Q% X( w( p3 y6 m+ O0 c
例子:
6 A" q2 O  A+ K4 |+ b9 k
  1. GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
复制代码
- w; Q0 @. s* S! U% w5 H* P
+ @, z0 B$ Z0 f0 B7 {; {
4. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);. z6 j( \8 ?6 o- @& I
定义:"ReadOutputDataBit"中文直译就是“读”“输出”“数据”“位”,所以这个函数是用来读取某一个口的某一引脚的输出电平(0或1)。$ @# b  V- b. m7 n/ M# G
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。
+ Z7 t$ m& C% C: e8 ^输出:高低电平。(指这个函数的输出)
4 ]! V3 l7 ^$ H" X) `4 A例子:+ F$ o0 f/ n; o  o5 q' I
  1. GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8);//读取GPIOD.8的输出电平
复制代码

; s: q9 p7 ]0 X/ ~4 D: ?5 q9 Q5 I/ c: A# n$ q5 O
5. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
0 r5 C6 N% ~) x( ^
: [: _/ m8 D5 \: ~' Y" J

5 J5 z6 _  t" @4 y# ~5 L& \定义:"ReadOutputData"中文直译就是“读”“输出”“数据”,与前面的对比就是他这个函数少了“位”这个符号。所以这个函数是用来读取某一个口所有引脚的输出电平。9 u# a" }) z9 P) m1 j$ U3 W' Y% h
输入:GPIO_TypeDef* GPIOx:哪一个口。1 X5 C* m* s) b, B, i  t
输出:一组的高低电平。(指函数的输出), O2 j" Y0 h7 }2 s1 h! T
例子:
5 T7 ~# z: \$ i. S: w( j( q
  1. GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
复制代码

4 r1 G$ P: U1 W7 Q6. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);* X/ s' x% q5 V# a( |# h& d: t5 d
定义:"SetBits"中文直译就是“设置”“位”,所以这个函数是用来给某一个口的某个引脚进行高低电平设置的。1 ~4 y- A- x6 ?( n6 p" n$ F
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。% c4 T; ?  H6 Z$ i: ?
输出:对函数无输出,但是实际上对芯片的若干引脚进行的高低电平设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。; `6 l0 g: I& o' `- t$ ?0 g
例子:
/ E( Y* j& Z9 T) e# `! u& C# A
  1. GPIO_SetBits(GPIOD,GPIO_Pin_2);//给GPIOD口的2引脚设置了高电平。
复制代码
$ \0 N: J0 l- Q
$ e  a# K1 _; f
7. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);4 B3 P' e# [* q3 e# M5 ?0 B8 w! S
定义:"ResetBits"中文直译就是“重设置”“位”,所以这个函数是用来给某一个口的某个引脚进行高低电平设置的。主要是低电平(复位)。( [7 p' P# ~( j, y+ E3 k
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。
& X# |, `3 L) D" H; K输出:对函数无输出,但是实际上对芯片的若干引脚进行的高低电平设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。3 |3 d% R0 w; i" R0 s4 t5 \0 e$ i
例子:' [; j; y, O% z- r% l5 |2 u  n# m/ f
  1. GPIO_ResetBits(GPIOD,GPIO_Pin_2);//给GPIOD口的2引脚设置了低电平。
复制代码

0 ?- \6 `0 k% E
2 s$ s+ t% v6 F7 U
8. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
1 p1 R# V0 C2 ~8 ~定义:STM32认为,每个引脚都要有自己的时钟设置,因此我们在进行位操作或者“口”操作的时候,要先对我们即将操作的“口”进行时钟设定。! I& P% q3 u  f9 u
输入:①、uint32_t RCC_APB2Periph:这个是用来选中你要进行时钟设定的“口”。例如:RCC_APB2Periph_GPIOD;RCC_APB2Periph_GPIOA。然后注意怎么书写这个变量。②、FunctionalState NewState:这个是一个标记,里面用枚举法告诉了我们只能有两个形式。具体代码入下:
# Y# [# c" w# Q! M1 F; u, [
  1. #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
复制代码
可见,我们对于这个变量只能输入ENABLE和DISABLE这两个了。6 b6 T! i- G5 ~4 e( J4 c/ R

8 W0 U" @6 w' r) N% ^/ a. y输出:对函数无输出,但是实际上对芯片的某个口进行了时钟设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。
. V. u3 ?7 E, v: L! J. ]例子:  ?* @" m+ i) _1 k3 F
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//对D口以这种时钟设置,使能。
复制代码
# K  {& g1 O) `! V! z
————————————————
$ m9 p& t! p5 H) a, M5 G版权声明:被大佬糊弄的只会点灯的小菜鸡
8 @4 x& {( R: H" N; e. c2 Y, y如有侵权请联系删除
0 q/ M5 A3 r. W: X% Y0 v: {" w/ Q
. V  |  e# ]9 s0 P3 a) Q
$ r/ G( }) i# C' p0 r% d0 S( k3 ?- B: D2 ]1 S8 Z! r
赞 收藏 评论0 发布时间:2023-3-26 15:57

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版