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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍
# }: F3 ~( ]! ~1 `; m1 z( M! Y% XSTM32F0x1/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): ~# h1 u* ?) }  I1 ~

$ ?2 `, _! @: A2 j4 L, A* ^2、GPIO主要特性
  O7 |5 D) ]) x$ _输出状态: 带有上拉或下拉的推挽输出或开漏输出
) Z$ J8 m8 ~5 C从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据; c$ ]0 J# N6 \) S8 x* |
可选的每个 I/O 口的速度5 o; m7 u3 E$ Q  V. W+ a
输入状态: 浮空、 上拉 / 下拉、 模拟输入. N$ u# W+ j! }6 T& p9 n& g2 M/ ~
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
/ q$ n. R8 {& v9 o+ d, D- q* I; _位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力  {% _! y  @6 ]& P! G
GPIO端口锁定机制(GPIOx_LCKR) 配置
$ t2 s0 V8 ]5 l0 n  n; G4 ^1 W7 v! d模拟功能. g' y" e  |& L5 u
可选的复用功能
, P1 J4 T* u5 u( Z. I  _: @8 D每两个时钟周期快速切换I/O值的能力
" T4 q* W) _$ q7 t" K允许GPIO口和外设引脚的高灵活性复用1 z1 L0 r7 f% v

4 K" V* M3 J4 ]" m3 U5 P
3、GPIO 功能描述
' z; U) A. C; {/ ^根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配( B5 [9 C$ b8 X; d
置成多种模式:
8 [, E. t. L, ]# E" F; k
- S4 T% t$ g/ _4 ~# t8 A浮空输入& q3 G) K' T9 c
上拉输入
6 g# }: b( f$ {  }2 K3 v4 E/ w下拉输入
" ~; c  q1 E. _8 R模拟输入
9 [1 D* E2 k' ^8 |' x/ F具有上拉或下拉能力的开漏输出
$ K& C: f7 T! s9 w具有上拉或下拉能力的推挽输出
3 Q! L; a7 ?! V5 P  m- s- u- w# @复用功能且具有上拉或下拉能力的推挽输出
$ w5 k; p4 j7 m2 k; I8 T! t) v1 w复用功能且具有上拉或下拉能力的开漏输出, n: T! l" v& x/ G$ @
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
( k( H) D3 ~. F. C  A5 l$ d$ MBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之% G" U4 k  ?( o2 B2 t5 d
间产生 IRQ 时也不会发生危险。+ q0 s, t7 P* P; v9 D
: T4 T+ a) A- ^) x0 j' W; ]
标准I/O端口位的基本结构
/ n3 P) m$ _  c/ _4 q
8 K! b, T$ r4 o- W9 j5 m+ [5 b( q
20200624112800430.png

; V' Q) P# W; J+ _' ^6 k6 A* ~3 f4 r
$ C7 d: A2 N* Z$ c2 ]  p* \, H5V 容忍I/O端口位的基本结构+ P  e. }9 z  y1 R' B# n

1 F) k+ l5 f8 k. B; l0 c
20200624112816556.png
+ n: {2 p8 D+ M* t- x/ `
' x7 `/ R5 _4 ]" [
4、GPIO端口配置说明
! `9 L& f8 N' L# @: ?1 f0 A9 P① GPIO模式( y6 j6 Y' L: F' p
GPIO_Mode_IN          输入模式 ( 复位状态 ). I/ p# \' V9 i' R- r1 [: v; X
GPIO_Mode_OUT      通用输出模式# p' V$ {8 g4 U
GPIO_Mode_AF         复用功能模式" y& f; X! N) a  @  B$ w' x5 N
GPIO_Mode_AN         模拟模式
$ S8 y# g) |( U9 M/ `$ Q* Q& M9 S! X5 B1 s: T% q
输出模式类型:+ E9 Y& n; q2 n) u
GPIO_OType_PP        推免输出  B' B7 R" O- q, i% L+ ?! M
GPIO_OType_OD        开漏输出
9 }! A/ _8 A# [2 p* `
6 d+ h" X. c+ y6 I! N② 是否带上/下拉9 R7 q" i' ~4 {* O( z8 S( [7 N
GPIO_NOPULL               不带上/下拉
  _% n1 L' [: Z$ p# C4 dGPIO_PULLUP               带上拉! ^* Q" p  m' ]% x9 _+ n  z% C
GPIO_PULLDOWN         带下拉1 B8 C$ ?8 V% E' H$ p2 \/ m

4 h' y) ?' C2 E# g! Z③ 输出速度
5 \, [& D' S" N6 Y9 E3 s# ^GPIO_Speed_2MHz            2 MHz
+ L+ A! p3 l  G6 \GPIO_Speed_10MHz         10 MHz, T* r- n5 e; R# X
GPIO_Speed_50MHz         50 MHz6 i! D! W" P: ~' |

3 C1 N, o+ o0 D5、GPIO工作模式配置& R* ]* G5 a$ y2 O: m, u
5.1【标准库】的配置方式
& d( z* e! n8 f; O/ m步骤:
2 y- ~: r3 H% @  o4 z1、配置对应端口的RCC时钟; o5 J1 F" P: o; h* c
2 M9 u4 J  G) X& Q7 U+ m( s
  1. /************************************************
    * D# p# ~9 P/ U. Z7 m
  2. 函数名称 : RCC_Configuration$ Z9 @, G* F: ~4 s# x, A( o5 }
  3. 功    能 : 时钟配置' R! D! L7 S$ c; U. y- P
  4. 参    数 : 无
    ) F7 v" |! w  Q1 Y: s% F5 d
  5. 返 回 值 : 无: ~$ |# b  x& j# @
  6. 作    者 : JayYang
    / P  {+ z0 p; @0 [3 }1 x# ?4 K9 b
  7. *************************************************/
    ( C" C$ l) w6 p3 I) ~  P3 {
  8. void RCC_Configuration(void)3 l' s1 T/ y, }* o8 V6 L8 _
  9. {% X; m! u; _/ P, Q  D& `' x+ ~, B
  10.   /* 使能AHB时钟 */6 K4 H; m2 A, a( f6 j6 x: `) P: y
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | - O' p+ ~" f- H( h( ^5 Q" T
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
    3 J9 P) F- _) B. _; D! |+ D7 |5 z
  13. }
复制代码

% W( L  R* C5 \1 i- ^2、配置GPIO工作模式7 o4 [! q2 c0 o  K
+ ~5 r' W( B/ w) u; ?4 M! \7 A
  1. /************************************************( K- h, Q3 ?% c' c# p6 U' E& _
  2. 函数名称 : GPIO_Configuration
    8 x, m+ Y- y4 f. @6 t
  3. 功    能 : 基本输入输出引脚配置$ V- \! M/ v& y0 u- b+ e& X3 F' [
  4. 参    数 : 无
    + i' |  `1 k& G
  5. 返 回 值 : 无- q/ H# S) o7 R  V0 Q
  6. 作    者 : JayYang
    3 f) E( |% z7 B8 ^
  7. *************************************************/9 K8 L6 v4 @) x0 @. \' g
  8. void GPIO_Configuration(void)
      f( L6 f' j$ H
  9. {
    & \# B2 _. [" b+ s0 @+ Q2 U
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体' E5 \3 P' y4 K9 Z; q4 T, e
  11. . z8 Z- R7 o4 l6 [) o9 A
  12.     //GPIO配置为 推免输出模式, h* P/ f7 A+ |! U# A
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0% Z) S3 l9 I4 H4 _& W
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式# s- G- q+ L5 K  K
  15.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出9 L  s. ?! v( [! i3 r7 _7 p
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    9 @6 t! ?# e2 U
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    - s4 e) @+ l7 s( n
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式" P; j, e# g. p0 T; W" v
  19. ' w% F1 s9 m* J) v- a
  20.     //GPIO配置为 开漏输出模式! r# c$ k' [* q. w
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:1
      P! [; _& @+ V+ A) }
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式! P& R, U3 l) J% u9 T6 C  V
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出! L$ N* \  n) A, k; W; X) f; ^$ s
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    6 O% Z+ ~( w& j, e9 ]. W  A2 O2 w
  25.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN% ?! r. v5 i; p' d4 K. |
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式2 v3 e( u/ j" w8 M

  27. 3 W/ |3 z0 E8 ?* A* b6 T* F2 W! H
  28.     //GPIO配置为 上拉输入模式; [# B! N, V9 R' ~3 y
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:121 o" H% p7 `$ T& c6 d
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
    ( r9 \/ s) S8 U# B- U
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN* Z  p6 n+ a# R. O5 M
  32.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式0 V8 O8 z# n' @( l! H$ D
  33. 4 l; O% p' a) t/ ^5 n: m8 }' l6 C/ ^
  34.     //GPIO配置为 下拉输入模式+ A# y! T4 t9 o% }  W7 @# z
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13. |: C! F3 g% q- t' k: Z1 A
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式! c' h- y0 Z/ S6 l9 I1 L
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP2 a8 R$ z; c* w1 s
  38.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式$ M: E7 z  j. _  ]' {& @
  39. 3 h+ k, ]" F& X8 a2 W5 t
  40.     //GPIO配置为 模拟输入输出模式
    ( F2 ?# [8 @% R) I3 `; l; g& I
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0; C  b5 {0 f( W% s7 F" p6 g
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式
    ) A. p  v7 c* J% }( _! h1 l
  43.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN2 N9 M2 ^. t3 `. r8 L7 \- h% i" D4 f
  44.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式+ A. m9 N  l/ U0 I1 Y! {
  45. . w; V# d. ?9 ~7 r7 ^
  46.     //GPIO配置为 复用输出模式
    : |0 |: n/ k8 [; b% \/ J
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:9
    . _. Y+ n# H5 Q! G5 R# i
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式% u5 z( s9 g& P: _5 o8 F8 a; `
  49.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出" c* B+ @% i3 @# m; |& P9 H8 ~, Y
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    2 F) N' x. q  ?+ T" [' a/ c- E+ `) C/ ~
  51.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    6 \* C+ {0 R; q; x" _+ [- X% Q: B3 v
  52.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式
    8 a0 r( G5 X) r, t8 U0 V
  53.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
    9 d1 l! G  F1 q' _5 E7 r2 P0 ]
  54. % D6 W% @/ M- U
  55. }
复制代码
5 C7 l8 }) I( @8 N& _

/ K, F. `9 n, H6 U! y) B) w, C5.2【HAL库】的配置方式
/ V# H- o) E1 n8 R" ^# ^% R
步骤:
+ F: I  k, ]- z- m' z1、通过STM32CubeMX软件配置RCC时钟& b: u8 h* A$ A5 M# t; }

$ E- U0 Q9 k) f" z
20200624152114980.png

- {- X4 ^% R* F3 B& c0 i: m; [& p9 |/ R" g- _$ b0 p# B
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:  E5 D7 @, s% R7 Q" O! D9 P; }
20200624152258136.png
( ^/ a# p% v7 X/ c! ]% n1 e

% y# ^+ ?3 W! T/ K- v6 B, N6 t2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出9 p( ]  k* `$ {1 u/ x- ^% z- c

# R$ C/ a* Y0 Z
20200624153132751.png

8 x: V; h( I' E8 ?" \$ _# m2 \, p3 u1 e5 E) b+ }* O* I
下面进行每个管脚的具体参数配置
+ |4 V- e' ?0 P, p5 s% [% n. M
0 Y9 |% ^; F& N3 W" h) C
2020062415342131.png
) m4 c* {  v6 M, ^9 L4 T- P3 C
" q7 h4 b/ s; ?
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
, N3 X1 S9 {0 d" @3 Q* t
* V# F% |/ E% w6 T4 H* X3 A
20200624153642205.png

  b: h; ^, e8 U" I9 N! Z7 v; K
20200624154553694.png
. Z& H( `5 o: O/ g
7 z4 ?, p, o2 _$ w" f! ?$ A
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚8 s6 F9 C7 o0 v
; D* ^$ ^  [! M7 G/ O6 v
  1. void MX_GPIO_Init(void)
    % ]6 ?! C, b3 J  q' Z, B8 w! p
  2. {( q. P6 d* }" y3 I

  3. 6 P% ?$ @9 V. @: J' _
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    7 ~% r% k; H) S$ W! ]$ Z. \% V" B
  5. " i0 f4 K1 s+ k4 o" g! |
  6.   /* GPIO Ports Clock Enable */
    % T" `$ S( q6 ], x& J5 X
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();
    , X' [: C# I7 V: q) d. e7 m' n5 \
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    + b) I% F  ]" d. {
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();
    . c5 T  T. X+ z

  10. $ K" B! p9 f; K1 _) S; E' N3 W
  11.   /*Configure GPIO pin Output Level */$ o5 V$ l! L4 @
  12.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);5 ~1 p6 Y3 F$ t, k+ D6 J

  13. 2 d+ q. ~4 l0 ?( {
  14.   /*Configure GPIO pin : PC13 */
    . j5 n# n- x9 @/ ^8 W# G% I
  15.   GPIO_InitStruct.Pin = GPIO_PIN_13;
    1 {- N# ~1 x* c/ ^
  16.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  V/ C3 W5 s  {! F  X/ `  A
  17.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;* ~. U  o3 g: x% h: l' a6 j; e
  18.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);. u6 H" ?$ d, ?- l' l
  19. $ H4 w( |+ ]0 o8 f3 D. h' \! p% d
  20.   /*Configure GPIO pin : PC0 */4 j& |* ~/ F" V. e$ U
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    ' Z6 p5 ~! L! K" h9 A1 g
  22.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;2 P" Z- M% u- R- K9 ]( ^5 g5 ?
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    6 }: Q8 w7 l; K; t' \: @
  24.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    % _8 M4 B; {8 ^7 R( G7 C* x
  25. 5 e1 [5 j* S; q- |
  26.   /*Configure GPIO pin : PA0 */; L0 H6 A& U% l; Y% I' K
  27.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    & b4 z9 P7 M; y5 H1 r
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;4 l2 P+ @8 ~0 s
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    % a2 w2 k- J) M/ Q
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    0 i2 C( o+ c  [0 S5 g& ?8 h
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);5 b1 K" v8 ]; |7 {- b

  32. + Q* K$ `# r  z- y: w
  33.   /*Configure GPIO pin : PA1 */
      Q0 Q% d" q/ f0 D1 H& G8 f' \
  34.   GPIO_InitStruct.Pin = GPIO_PIN_1;
    / z$ J# M! P/ w! X
  35.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;$ D  S0 O, m5 o0 e
  36.   GPIO_InitStruct.Pull = GPIO_NOPULL;3 a/ J7 i3 ^8 Z! e: n8 U: D! @
  37.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ j: x" C, X0 V) Y- q
  38.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);" S: W- p7 W3 D$ y

  39. 0 m  k- s  O% Q$ p7 V
  40.   /*Configure GPIO pin : PC12 */- T7 c) k# x1 h  u/ W
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;$ S/ g: K! H7 |* a" R1 c- ~
  42.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    , @6 f2 g2 y% b9 n$ `8 k
  43.   GPIO_InitStruct.Pull = GPIO_PULLUP;. Q8 C+ w; L  K" ~  _3 z
  44.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    5 z' y& [- |4 U: Q
  45. - v& o  g) ^+ L0 `/ g
  46. }
复制代码

  o6 z6 I. ~/ I( E至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中: l. x% R" I0 i: f* t. X) [

0 y: s4 B! W4 ?" a! `# _6 X
  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
    1 @: ?) i0 x( d9 H/ G
  2. {9 L% }* Q% n3 h% d8 f. @( N
  3. ' f: W% x7 r3 |3 q
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};2 G" d+ t2 ^2 j. \- G( o
  5.   if(timHandle->Instance==TIM1)* e' M4 F% W8 N! j+ j' v& r0 b: M# D
  6.   {
    & b/ T- I' j5 M4 k! X: i1 X1 Y  s2 A
  7.   /* USER CODE BEGIN TIM1_MspPostInit 0 */, n( c6 p% ]0 I; G& `: {" A7 y. q

  8. 2 [" E0 b7 s+ m& a5 @2 t# h6 q& Q4 R
  9.   /* USER CODE END TIM1_MspPostInit 0 */
    & Y1 a, F" j) J

  10. & r  j5 q+ R6 @; A
  11.     __HAL_RCC_GPIOA_CLK_ENABLE();
    & q: z& j1 A7 H' M- |
  12.     /**TIM1 GPIO Configuration   
      J4 K1 A, b+ p3 C" U. Y/ f
  13.     PA9     ------> TIM1_CH2 - r( l3 }3 i6 Z$ O2 m) X4 Z* h* ^
  14.     */( c) @2 h: \; ~  |
  15.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚: d5 ~+ T6 X- Z6 F
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式) r7 _  N/ l% a6 ^4 Z- J" n
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
    9 C  E% M* A$ d7 s8 t* D: A
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出
    2 m' Z/ t  t( m) ?' P
  19.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道2
    # ^& [  a2 u2 r9 X9 l
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);; S; L" @& j' e9 Y, ?
  21. # K1 U5 p! U6 {; w- }! ?% ]! b( D
  22.   /* USER CODE BEGIN TIM1_MspPostInit 1 */) U+ \  }7 S! V/ f# [+ {

  23. 4 r# B# b0 }7 j# J
  24.   /* USER CODE END TIM1_MspPostInit 1 */! p) z0 j! e' Q
  25.   }/ L6 F% V& o! n, @
  26. ; |% |5 g. ]: ^2 n8 V& b% g# C, g
  27. }
复制代码
$ M7 N, |- q. ]  e: }9 ?
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!: W$ L* ?) _  ]' x) S- L
; @* P& I- Y' s% }, H: j
4 M' P4 R; N# U; a4 L8 H' c
9 |2 s3 N! z1 A% m' m. N  Y
0 i' D. V; Z3 _1 j
收藏 评论0 发布时间:2021-11-21 22:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版