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

【经验分享】【STM32F0系列学习】之—通用输入输出端口(GPIO)

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍
1 M/ O* X1 V9 {* d5 F6 jSTM32F0x1/STM32F0x2/STM32F0x8系列每个通用I/O口都有4个32位配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和 GPIOx_PUPDR),2个32位数据寄存器(GPIOx_IDR and GPIOx_ODR)和 1 个32位置位 / 复位寄存器 (GPIOx_BSRR)。GPIOA 和GPIOB 还含有 1 个 32 位锁定寄存器 (GPIOx_LCKR) 和 2 个 32 位替代功能寄存器 (GPIOx_AFRH and GPIOx_AFRL)' b. t+ A+ h0 B$ b6 a0 N

' f  X  W5 E; x8 z5 j! p: y( u2、GPIO主要特性
3 S4 s' Z9 _% s! E7 C9 S- b2 e7 @输出状态: 带有上拉或下拉的推挽输出或开漏输出
. W8 |, j2 X7 _从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据1 v  j1 B* t- R1 x- _
可选的每个 I/O 口的速度
9 o- h0 h- I0 S& _' |6 U输入状态: 浮空、 上拉 / 下拉、 模拟输入1 k, R* b: k# E. K2 ?6 v
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
, n) f) Z. B5 Y位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
* I7 f& m+ K  iGPIO端口锁定机制(GPIOx_LCKR) 配置6 l2 N! Q5 K+ L
模拟功能
# w) `  f& r/ d$ c可选的复用功能- d+ E7 Y: R# i( `/ {$ @; c
每两个时钟周期快速切换I/O值的能力( r5 p) V- D: _. g, c
允许GPIO口和外设引脚的高灵活性复用3 T. {7 ?/ [! p0 J( \
( p6 G& P3 |* L+ R
3、GPIO 功能描述; S0 o% G8 P; U, F, ]0 `1 Q
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配" I% z, u, i: Q4 @- i0 O9 Y+ C% [
置成多种模式:9 Z& d# r( O; q5 J

2 U5 f+ c3 o; r浮空输入. T: w5 g- ^- |5 c- h9 {/ R
上拉输入/ C- c1 k/ ~* }
下拉输入
, A9 H& F* ]2 S7 ^; O模拟输入
8 o7 }! H$ v3 F( W2 W具有上拉或下拉能力的开漏输出
( G! a$ d, E% R- U( m具有上拉或下拉能力的推挽输出# y/ c  g! ^7 J( o" `% h
复用功能且具有上拉或下拉能力的推挽输出$ X" a6 H, y1 R( Q- K+ s
复用功能且具有上拉或下拉能力的开漏输出" u  X5 N1 u, A& b$ l% A' X" |
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
: S, s0 L" r0 m8 f6 p( p5 uBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之9 ~; s9 S7 u9 h: x' u+ ~
间产生 IRQ 时也不会发生危险。9 O2 i: A9 Z/ p# J1 L$ b3 [

0 K* S& u: [* B标准I/O端口位的基本结构0 K$ z4 y, Z1 k5 W1 a$ r6 |
. j2 Q& j; u1 b2 b7 l
20200624112800430.png
( [) s* z& j5 C8 E5 L

8 E$ g/ T6 M, U) ^0 b5 G5V 容忍I/O端口位的基本结构4 u9 n& [% x8 T( b

) F9 t# w3 w% X8 B# |: C% [
20200624112816556.png
/ U7 l2 |  W! H5 ?! V3 ?3 _2 l

5 g7 w2 x/ d5 S! f3 k6 \4、GPIO端口配置说明
# |/ r. a5 ]) {7 s" i/ t% t$ c① GPIO模式
5 I, P1 x5 G& b. _GPIO_Mode_IN          输入模式 ( 复位状态 ). f4 p0 e: Z" L# ]) Z8 S& ^
GPIO_Mode_OUT      通用输出模式2 _$ ^: w# X2 o
GPIO_Mode_AF         复用功能模式
# u( r5 D8 `  {- RGPIO_Mode_AN         模拟模式
: J; Q  n; S5 d& I4 {
  J! O) |* B2 y7 l5 y8 k输出模式类型:: U$ |' _/ I4 B: k# U
GPIO_OType_PP        推免输出( X' m3 s+ j7 |3 k
GPIO_OType_OD        开漏输出: o9 d; K9 @$ Y' ]) v& d9 |7 J( B
( G7 f9 V: q  a) s( i% g6 C* K
② 是否带上/下拉
0 F4 i. D& s! M5 P+ v5 GGPIO_NOPULL               不带上/下拉
1 U" J# N8 L/ |6 |. P' c" ]1 cGPIO_PULLUP               带上拉
1 x$ y4 Y  ?3 F/ i9 ?6 U4 iGPIO_PULLDOWN         带下拉
8 A: R, q' `6 B5 G7 l4 _# J" A: @- N& }8 D$ P
③ 输出速度3 u. D8 A+ h2 q6 `3 w( t+ c8 M; V
GPIO_Speed_2MHz            2 MHz
% S- ]8 t5 H0 D- a8 |1 g' ^GPIO_Speed_10MHz         10 MHz& w3 B4 ]* {5 ~2 [9 k: e
GPIO_Speed_50MHz         50 MHz  U5 C3 l% b3 N8 @, D% M- r  I
9 N! A- j7 z6 @! p  |. B1 C
5、GPIO工作模式配置' L4 w6 Q% K9 R6 }; y
5.1【标准库】的配置方式( F$ Y6 s7 Z( E$ d  g3 O8 c
步骤:9 _0 ^. b- B2 Y- K/ m1 r! G* `
1、配置对应端口的RCC时钟
! m2 K7 u6 l3 y3 O' W5 V# f9 u; X3 Z- q5 g
  1. /************************************************& w2 }: z+ _! S+ V4 _
  2. 函数名称 : RCC_Configuration1 T/ `: v7 t! Z$ ~8 z- a7 a- ]
  3. 功    能 : 时钟配置. B8 n9 U0 c& G- E6 B+ h
  4. 参    数 : 无
    - |1 O5 J6 Q! D0 E! a+ Q
  5. 返 回 值 : 无- {! Z1 l; Z5 F' \$ k8 b
  6. 作    者 : JayYang
    3 e5 I$ R9 _0 a# E% k$ g: I3 j
  7. *************************************************/* w5 x( T7 E% h' L$ {8 `* G( ~
  8. void RCC_Configuration(void)* C( a' i  t3 e" Y7 N
  9. {, h3 F9 `0 X/ l* E/ A
  10.   /* 使能AHB时钟 */3 ]9 o) a/ `: U4 ^! }- v. J1 k
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
    ! C3 e- t! r) y5 Z
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);* Y) {$ U, ?9 [2 K) Z
  13. }
复制代码

& q4 W' S$ k9 v- n$ Q' }' h9 [2、配置GPIO工作模式
7 K5 y3 s5 v4 n2 x  s! W$ i( h- P

2 u- z3 o# u  m
  1. /************************************************- |7 @0 \" c7 t
  2. 函数名称 : GPIO_Configuration
    ) t. I- n/ |6 L9 V; q5 H8 x
  3. 功    能 : 基本输入输出引脚配置, y. g5 b/ N# k$ V8 H  T4 p6 u
  4. 参    数 : 无
    3 o4 {( n1 e: P$ P; ]8 M" `3 D
  5. 返 回 值 : 无
    6 H5 |& c1 p# c2 k
  6. 作    者 : JayYang2 _+ P- `. J# s0 T$ A  C
  7. *************************************************/
    : J8 r' M, V9 `/ v+ f
  8. void GPIO_Configuration(void)
    : O1 _# T( E- |% G, k# N' P8 ~, E' E
  9. {9 {" v8 m7 P4 n% o9 n4 [
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体
    ! l/ J8 T& _& u$ c' K

  11. 9 B9 Q, ~. ]: z5 F. t
  12.     //GPIO配置为 推免输出模式% G5 ]  Q" D1 y9 P; Z
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    ' A+ C- a1 ~7 b8 Q- W/ N+ j
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式& K! z' i2 z1 M+ b4 q. O
  15.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
    ! O4 @% B- f/ {' ]( v4 P8 J0 L$ ?* j
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz7 W6 c& ~5 D* c0 s6 e+ h" `- A4 \
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    4 ?3 H: ?- D# @! j
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式# \: S& o) x/ Z( B9 @1 ?

  19.   o& I2 H" R) J
  20.     //GPIO配置为 开漏输出模式  g9 L/ Q2 [: g( l/ i9 |: W- }5 \7 @
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:15 P1 T! \2 P2 }$ s
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式- \* d  O! W; ?/ s" l7 B" i
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出
    / B* W0 G$ F1 m# E. [5 z
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    ( U! ^$ ~) B, a/ v1 y/ }/ _) t* w
  25.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    * ^  o7 ^0 M) Y, @
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式% t7 p$ z' P: w7 h2 n4 n% `& O

  27. $ `2 y% \2 n. X8 L
  28.     //GPIO配置为 上拉输入模式- J/ I% t' F7 N% I" R' }
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:12
    2 |$ M6 R- f  e+ X, s
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
    ' p. v" m/ G' d# S& F1 o7 q8 ]
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN8 C" S- E% Y2 c& x3 J  J
  32.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式
    ( S9 ^  {4 d$ ?+ F% _

  33. & f$ E) L9 b& D6 t2 @( c6 b
  34.     //GPIO配置为 下拉输入模式
    9 q' D* C9 u: j7 Y% H& Y) M1 y
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13) R" O0 x* N) t8 d
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式. c; x% Q9 J# n9 x" a
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
    / p3 B( ?7 ^9 F7 j$ u
  38.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式& W! u7 @+ @+ L' I1 r
  39. : B; |) e3 N' G  Z! p' [4 o
  40.     //GPIO配置为 模拟输入输出模式7 Q; ~! y+ J. ?( M9 F
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    7 X$ G/ \3 `* {8 u& P  d
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式0 l$ {  O$ H8 ?" Q+ a
  43.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    ! ~3 Y* U  J% l! V+ |2 D* v0 u# A
  44.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式
    5 v4 y7 ~% ]9 c5 R
  45. 4 ~1 \; g+ g6 e! C% N
  46.     //GPIO配置为 复用输出模式
    5 [/ k& C, D7 x8 C4 D
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:90 X4 g( h! I9 L3 y8 |+ r% t
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式
    , z6 Q; G$ A- _4 T: V2 Y
  49.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出1 T4 Y$ n+ T. o$ C7 j' Z$ }
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz$ ]( }, T% K* k5 L* {
  51.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    + {3 j2 V1 A# K# ^& ~$ v! c
  52.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式
    9 d, S# w% T' C1 K' ]$ ~
  53.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚7 M) W, [+ h" n! ^, j4 q6 [( e- N

  54. + A" N6 m7 b7 M0 I
  55. }
复制代码

4 w4 m: ~( k1 I+ Q2 @' k( X' d3 q8 H4 n, D* B; D  v
5.2【HAL库】的配置方式
/ s/ B& T9 V) u  H
步骤:# R: r/ D4 d( N& U1 F( R
1、通过STM32CubeMX软件配置RCC时钟4 Y( @: l6 i# _9 m  g" J

! i' m; {  r# p/ e% M2 a
20200624152114980.png
: |( y: j( c; p& ^1 N& \1 @4 e

4 s. T7 C; \7 h5 F0 U选择【Clock Configutration】选项卡进行时钟的设置,如图下图:+ Z' y- M  F0 W& p% E* L  ]0 P/ Z* x2 [
20200624152258136.png
7 ]* k) n8 |# D* {# R" `' f2 i
: v1 c* ~# z. u; o
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出' r  |: q6 {1 v. ]7 R+ |: [8 Z9 Z

$ d2 i1 m, o& k8 G
20200624153132751.png
- T. I! l; c$ @' F' E" F

  C6 T! w& Y3 X# R0 o2 @; P下面进行每个管脚的具体参数配置2 b/ o6 _2 {& Y/ f
. f+ n3 ?) E# g. H8 B
2020062415342131.png

4 a3 P1 n. n: j) q9 |" q$ R1 j6 w: v7 D  \
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
2 I+ u7 m7 S: ?- k0 v
$ ^% t- j" {5 ?6 h5 K7 P
20200624153642205.png

2 z* B, l; o+ O% g5 ~) t7 i  B2 G! N8 D
3 K+ h) }9 _" a- I. R0 L: z
20200624154553694.png

& n3 p" u( r+ b/ @% i3 Z+ X/ g! T2 b) n0 [6 h3 X+ m
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
& I# Z- u. w# e% T: Y* G. t$ o6 G
% O+ O! g' M9 d
  1. void MX_GPIO_Init(void)% f/ F% t* W/ V
  2. {1 B4 W5 W& t0 W( T5 Q0 r: w

  3. 4 m% \9 A2 q% ~
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    3 @5 J# S! X4 d3 u, U4 @
  5. . Q' D. ^; J1 {8 Q
  6.   /* GPIO Ports Clock Enable */
    9 M# d1 s! G5 ?0 Q
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();
    4 [* ?( M1 o( h7 C, K9 d
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    3 {" x2 C! R+ N6 E* {2 n* C8 l/ {1 ?
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();; L; M2 I8 ?, ^

  10. 6 p: x# V# t, a3 }
  11.   /*Configure GPIO pin Output Level */
    " \6 w  k: l- y* z+ j) r" N$ x
  12.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
    . _! c9 N' n3 {0 ]. z
  13. * {8 q9 h2 A& ]& }
  14.   /*Configure GPIO pin : PC13 */
    ' I, x5 k& F; y3 E6 A, j* n
  15.   GPIO_InitStruct.Pin = GPIO_PIN_13;
    7 V7 G5 B! K6 ^$ L9 X3 N* o/ L4 E
  16.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    ; E  ]) h( P& e7 {
  17.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    & c3 O- k& F7 x5 @6 V
  18.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);$ R/ I  n6 D6 e) i1 N

  19.   e& c' o; K4 `2 d$ t
  20.   /*Configure GPIO pin : PC0 */
    ; f& b  c% t0 l9 L" y0 R
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;# O5 m  o6 X# ], x
  22.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    + L& z$ q+ f  g. g2 ?1 |
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;9 U. J* n4 {; R! h+ U9 c9 A
  24.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);1 B- ]" F8 y1 \) A+ J% m" Z. z& L

  25. 8 Y- B+ I* g1 H; x
  26.   /*Configure GPIO pin : PA0 */" I% b0 r# S9 d) |+ y* D
  27.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    , b$ ~3 x/ {) F0 e8 M6 N, K6 e
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;" U+ b: f) P8 i
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    $ W' @6 l5 W. @' F1 A
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ Z* K# w9 o. q* s" Z
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);$ I8 r" E+ O/ e1 x

  32. 5 A7 n" g7 ^+ ~& ^+ C5 a
  33.   /*Configure GPIO pin : PA1 */+ {2 |* W$ t' j  r: T2 k1 ]
  34.   GPIO_InitStruct.Pin = GPIO_PIN_1;) d! L, t, J) |: d, X+ W
  35.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    - U  U3 |  F- ]3 Y1 _- y1 N( R: R, }
  36.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ! W9 ?& o6 _% M' c( K2 w
  37.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ Y/ B1 l2 n. @; x9 o
  38.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);1 i. u8 r, @7 K3 c2 L( X

  39. ) B" A. r5 _3 Q$ M+ e+ n  A$ T5 @
  40.   /*Configure GPIO pin : PC12 *// U: O  }. l2 t) u
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;
    - `% m# Y, c7 G* v, Q5 `; z& `: U% F
  42.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    . {& k& Y3 \' t$ F$ Y' M
  43.   GPIO_InitStruct.Pull = GPIO_PULLUP;
    - I$ X; u/ R+ m4 h" Z" }5 V5 `  ~
  44.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    2 N, j5 x5 c! w: d  I( D- b
  45. * ?0 a) S" o& \$ T! m$ z  ]
  46. }
复制代码
! f3 R: e) B) L* ^- M
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中3 A( q5 |; C6 }  y7 G3 M
3 ]" Z( i0 b1 l% h2 L
  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)) n8 k$ f1 a/ |& f* t
  2. {5 c; r- O6 ~2 T4 k! A) M$ V# x

  3. 7 E9 K( Z& {- g$ |- N, E
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    4 V. c+ x9 L. U% e4 ~) ~
  5.   if(timHandle->Instance==TIM1)% E( V  ^+ t& _  p9 J& U- h/ ]6 R
  6.   {
    4 n* m* t1 i, k1 L8 \7 ?1 L& s
  7.   /* USER CODE BEGIN TIM1_MspPostInit 0 */" ?8 X' x% E0 X8 J4 e) T- P

  8. : [) d+ T# X7 w: [+ n0 J( ?
  9.   /* USER CODE END TIM1_MspPostInit 0 */9 g' N2 S/ P, I2 c& {) i
  10. . x6 G1 F" B) z" k" Z" h
  11.     __HAL_RCC_GPIOA_CLK_ENABLE();
    * u, C% P4 x+ [, j9 b3 M
  12.     /**TIM1 GPIO Configuration    ( ?9 a' W4 S) I# J7 H# N% C" a& B
  13.     PA9     ------> TIM1_CH2
    ( M1 n  L4 n4 `+ U9 D3 A
  14.     */
    : X( H. F1 q! v8 ^3 i; r
  15.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚
    3 s5 S5 ]8 Z! ]% x7 I
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式
    ! q' B" y2 ^% V( o
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
    . C) h9 T) r  I! \
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出
    5 M# R! a8 o9 v0 s+ @
  19.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道2
    ) B) H$ {4 e4 p, Q2 s) t! R4 y
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    . f1 T1 T& C1 ?
  21. - `' n+ v+ p) S! W
  22.   /* USER CODE BEGIN TIM1_MspPostInit 1 */  B& Y7 z2 K3 i+ T$ ~

  23. / ^7 R6 |8 k' a7 Q, c/ ?) A
  24.   /* USER CODE END TIM1_MspPostInit 1 */2 `& G7 b4 i9 x/ Y% |
  25.   }# T* ?: O' q+ o: v
  26. % T# \  W- |# F2 q4 a/ l5 |
  27. }
复制代码
; W0 L' M( g# ~, r: ?- m
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!/ b3 _& @3 Q, U

' d9 h0 j* F! @" F# C/ {# J* f! }1 c4 t, f
' @; D5 E' v& g" v. k5 Z

& E/ Q9 K& |1 [+ M" G
收藏 评论0 发布时间:2021-11-21 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版