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

基于STM32库函数经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:57
1.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
4 Z  {7 B% J! C$ @; ^9 I- Q定义:Init是Initiate的简写,而Initiate有“开始”的意思,所以这个函数就是GPIO的初始化函数。且主要初始化哪一个引脚的工作模式和速度。(根据函数名简写的词得到全写的单词,再根据全写的单词去揣测这个函数的功能,有助于记忆这个函数哦)
* t7 V! A- ]" s; A$ o9 M8 J输入:这个函数的输入包含了两个。①、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。$ r/ }3 y9 H0 v9 ?5 m' v
  1. #define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \1 u. R' g  U5 f( S
  2.                               ((PIN) == GPIO_Pin_1) || \
    + F: J7 R  h  ]8 `) X
  3.                               ((PIN) == GPIO_Pin_2) || \
    2 p  G3 R& R' N3 m
  4.                               ((PIN) == GPIO_Pin_3) || \
    2 _6 |( P' T/ o1 \* Y
  5.                               ((PIN) == GPIO_Pin_4) || \7 ]* V* q. ~. p7 w, _. b8 H
  6.                               ((PIN) == GPIO_Pin_5) || \
    ! D$ d8 y! j" }
  7.                               ((PIN) == GPIO_Pin_6) || \
      G$ s% `4 X" {3 @2 }, {, }
  8.                               ((PIN) == GPIO_Pin_7) || \3 |% B2 A+ _2 |* S* O
  9.                               ((PIN) == GPIO_Pin_8) || \( [* d3 B$ _; z; u2 r" K% i9 O$ ?
  10.                               ((PIN) == GPIO_Pin_9) || \! d9 E. j, z! H4 y* [
  11.                               ((PIN) == GPIO_Pin_10) || \( I4 p. Q. ]) ?8 u# p. r& o
  12.                               ((PIN) == GPIO_Pin_11) || \, i8 R% a, @! U* i8 \
  13.                               ((PIN) == GPIO_Pin_12) || \
    : L3 g; J' z' S3 K: S! @3 }
  14.                               ((PIN) == GPIO_Pin_13) || \
      b; E$ q; s  E( @/ E! t
  15.                               ((PIN) == GPIO_Pin_14) || \% n* G6 _$ t6 U4 F9 Z
  16.                               ((PIN) == GPIO_Pin_15))
复制代码
8 j' e4 Y) p$ P9 [( \6 S
GPIO_Mode:用来指定每个引脚的工作模式,输入输出共有八种工作模式。我们引用内部的代码看看八种模式是怎么书写的。/ ~" [3 o1 b) Q6 t1 U
  1. #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
    ' G; ]' ~. U5 p3 L& W  v0 w: X
  2.                             ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \
    * E* q6 J* D; i0 g$ C! y7 N- l7 K
  3.                             ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \
    + T3 }! x0 Q. `. c
  4.                             ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
复制代码

: C6 D( u3 \* x6 [! ?; x也就是说,我们输入模式的时候,要按照它所要求的格式进行书写!GPIO_Speed:STM32的引脚主要有如下的三种初始化速度。它用枚举法,把具有的三个速度放置在了一个结构体中。我们输入,在当前萌新时期下,输入这三个速度最好,等到大佬时候再其他速度。最后还是要注意书写格式!!!
* w% H; |# _  B
  1. typedef enum
    % A( Z' v1 c: P( _9 `
  2. { " k! P: T# m. G' i+ p4 i$ o
  3.   GPIO_Speed_10MHz = 1,
      c0 p( d0 D, g7 E
  4.   GPIO_Speed_2MHz, . M+ v" L0 P9 @
  5.   GPIO_Speed_50MHz5 \9 a/ c6 {+ ~/ y* r
  6. }GPIOSpeed_TypeDef;
复制代码
+ q2 I* {3 f% x/ H3 h) v
输出:对函数无输出,但是实际上对芯片的若干引脚进行的初始化,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。" k* ]: i( S  `2 D$ \2 G
- U* W% [/ w. N  G& ~: t
例子:
* d# g% R: D6 p* P. [7 n+ \) R4 J0 M. p
  1. GPIO_InitTypeDef GPIO_InitStructure;. {" S* @; n1 R! g
  2.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;5 b  ?) E+ ?& J- X8 v: K/ J
  3.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;- j: L% @8 K" g1 [0 N6 Y) h
  4.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    8 E. d+ r1 g8 |2 t$ v2 h
  5. GPIO_Init(GPIOD,&GPIO_InitStructure);
复制代码

! N2 x. @9 T$ b& S, n可见,这个程序段是对GPIOD口的2引脚进行工作模式(PP)和工作速度(50MHz)的初始化。
) y3 R8 T" j% Y
+ t) P' {. f5 T0 ~" f. l5 B
注意:先设置一个结构体,然后再对结构体里面的内容进行填充,最后把这个结构体输入到初始化函数中。最后但也很重要的是,我们输入到函数里面,对结构体,我们用指针引入进去就好了!!!&+结构体名。
3 a' p' D  P, Y8 b( I
" a: a9 z$ M6 u
2. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
; V( M1 I; ~& ^定义:"ReadInputDataBit"中文直译就是“读”“输入”“数据”“位”,所以这个函数是用来读取某一个口的某一引脚的电平(0或1)。
5 a& n1 y- r' b, c3 D! E) L输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。
2 n  {% ^! y! X: A9 W9 k* F输出:高低电平。
, a1 l/ @$ A/ N: F3 j& P5 D: [' ^) L, I. Q( K) C4 R+ e& _: H' V
例子:: w$ C* `0 F9 o' n
  1. GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8);//读取GPIOD.8的输入电平
复制代码
7 _/ a% k+ M: w- @" P/ l
3. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);& o' R) @( ]  \' |) q  K' T+ U1 M
定义:"ReadInputData"中文直译就是“读”“输入”“数据”,与前面的对比就是他这个函数少了“位”这个符号。所以这个函数是用来读取某一个口所有引脚的电平。5 a" ~9 H- l3 v1 b6 F" q& y# t: A
输入:GPIO_TypeDef* GPIOx:哪一个口。) _5 L3 V* Y5 r+ r! t7 r6 \2 C
输出:一组的高低电平。
3 \3 G% z" d/ m" ^, ~9 E7 P. [$ R. I! W) V  N* G; ]: A
例子:
5 t6 E2 E+ V% s* X6 H; `( y8 r
  1. GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
复制代码
* }' A+ ]+ D: f' ]& F- }+ G

9 k" J) G* s+ A3 `* Q# }- ^/ n- h
4. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);) o1 a9 |0 g' l7 |
定义:"ReadOutputDataBit"中文直译就是“读”“输出”“数据”“位”,所以这个函数是用来读取某一个口的某一引脚的输出电平(0或1)。% A# [9 }0 V1 F& H- e0 y) s
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。
! z' f* o' V2 G输出:高低电平。(指这个函数的输出)
& ^! [  O7 j8 n: g& ]! j例子:
5 L" @3 ^2 \  I) A) r
  1. GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8);//读取GPIOD.8的输出电平
复制代码

0 @3 D4 x' Z) f- ~6 K+ L) X+ B9 N. Y) k* Y/ w- i) }' e
5. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
; x) ]" v. q  e+ N2 v# n3 s* r' @
! p( W  l) h; {  u* e, K9 l
& J! y: s, \: Y
定义:"ReadOutputData"中文直译就是“读”“输出”“数据”,与前面的对比就是他这个函数少了“位”这个符号。所以这个函数是用来读取某一个口所有引脚的输出电平。3 X3 e4 ~; V& x$ x8 n# N& n
输入:GPIO_TypeDef* GPIOx:哪一个口。: s$ M1 B4 }5 j% {
输出:一组的高低电平。(指函数的输出)3 e9 Y% x; p+ H0 y0 l8 r* ~' Z4 I) B7 j
例子:
3 t/ y) j3 h# y' p9 |: {8 {! ?
  1. GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
复制代码
$ @5 h" _) o9 p6 T; \. |
6. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
4 ]5 R, G; [0 _& a. X( F定义:"SetBits"中文直译就是“设置”“位”,所以这个函数是用来给某一个口的某个引脚进行高低电平设置的。
, s. t! \/ F# |% P输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。6 L+ U" G" N3 K7 t
输出:对函数无输出,但是实际上对芯片的若干引脚进行的高低电平设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。. x2 q; ]! g" x! ~6 }( w3 f3 u
例子:- y1 j/ q0 q7 C5 N" @
  1. GPIO_SetBits(GPIOD,GPIO_Pin_2);//给GPIOD口的2引脚设置了高电平。
复制代码
# G9 E' O8 C9 P# z0 [: S

5 @1 g* h- `0 h( [8 d8 E
7. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  f+ ^5 T/ S2 ?5 Z, f定义:"ResetBits"中文直译就是“重设置”“位”,所以这个函数是用来给某一个口的某个引脚进行高低电平设置的。主要是低电平(复位)。; T) `" p- v! G# z
输入:①、GPIO_TypeDef* GPIOx:指的是哪一个“口”,具体啥内容和啥书写格式与前面一样。②、uint16_t GPIO_Pin:指的是哪一个引脚,具体啥内容和啥书写格式与前面一样。" Q5 ?. s6 ]! D+ }# w( ~- G3 D& v
输出:对函数无输出,但是实际上对芯片的若干引脚进行的高低电平设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。# j5 D) B# V- M. O
例子:
6 `: C1 c* y6 Y/ }
  1. GPIO_ResetBits(GPIOD,GPIO_Pin_2);//给GPIOD口的2引脚设置了低电平。
复制代码

  }) u' p- P8 r- T: D
* D2 m" ]& ]9 k
8. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)& Z0 a' p+ w+ j/ @
定义:STM32认为,每个引脚都要有自己的时钟设置,因此我们在进行位操作或者“口”操作的时候,要先对我们即将操作的“口”进行时钟设定。
" x1 }2 {2 l, A* o9 V5 w& n& a输入:①、uint32_t RCC_APB2Periph:这个是用来选中你要进行时钟设定的“口”。例如:RCC_APB2Periph_GPIOD;RCC_APB2Periph_GPIOA。然后注意怎么书写这个变量。②、FunctionalState NewState:这个是一个标记,里面用枚举法告诉了我们只能有两个形式。具体代码入下:% H2 H, y3 @/ w, a) K/ @- h/ S' w
  1. #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
复制代码
可见,我们对于这个变量只能输入ENABLE和DISABLE这两个了。
8 S3 D9 f; j* R2 m% w! W: _0 P/ N3 O" p9 w8 ?# ]# z5 e& O
输出:对函数无输出,但是实际上对芯片的某个口进行了时钟设置,只是这样的结果我们不必在C语言平台里面看到,故对C函数而言是无输出。
* K% F7 h" @+ v& L- ?6 v: b例子:# V# a3 L* ?7 U& l8 z* t+ E2 q
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//对D口以这种时钟设置,使能。
复制代码
! g6 _4 m7 F% E/ j( m
————————————————
. h3 C9 z' X2 J( |: [/ G. V- |版权声明:被大佬糊弄的只会点灯的小菜鸡7 n) T) y4 k, J! ?' e
如有侵权请联系删除
4 ]8 Y% v1 X8 F+ d( O& ~$ L7 p2 L: m1 G+ U7 B
: `4 U: ]( k+ I! V+ d) R0 y

$ k! G8 [. v% P$ t( |8 b' Q
赞 收藏 评论0 发布时间:2023-3-26 15:57

举报

0个回答

所属标签

相似技术帖

官网相关资源

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