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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍
. M) c* ?/ ~1 |) a# @STM32F0x1/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)+ X; Q% @9 O% g9 X; Z/ h

% p) h3 H( S; w& Y6 Y: x( _7 g1 m2 U2、GPIO主要特性
3 _3 W  l. d# [( a, Q) g# @输出状态: 带有上拉或下拉的推挽输出或开漏输出
( D; \9 e+ T/ B! r  g/ V# m从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
& z/ K6 A' a* d$ S6 t" k1 K. `可选的每个 I/O 口的速度
7 e" P7 M( |/ B; ]1 \/ o输入状态: 浮空、 上拉 / 下拉、 模拟输入
# s7 H5 q, a- O从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
1 F$ U4 T! `3 p0 Y位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
5 [5 t$ L5 [# D' k- O  }4 w9 @- Q% QGPIO端口锁定机制(GPIOx_LCKR) 配置( }- I% u: e- u1 U
模拟功能
9 f* y% r% v) {5 A% ^; F, o: r可选的复用功能
9 U9 S/ Z  o" m; J每两个时钟周期快速切换I/O值的能力7 d3 U* L/ A/ Q) f
允许GPIO口和外设引脚的高灵活性复用
7 _/ r3 J2 O0 Q4 [5 V( B! G% [. a0 M$ W7 {
3、GPIO 功能描述
! w4 ^4 B, M! l* J根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
3 u* C3 W( u" e/ W( j- b置成多种模式:/ {) u! y) L/ P1 i! F

. |; X- r! u2 Q, Z5 `( M3 h浮空输入* B2 r5 ]8 ?$ H" d; C, G
上拉输入% E, V1 \! y" D2 C: v+ B
下拉输入8 B# b4 `# K) y$ S/ {. o+ v, q* l
模拟输入
# x% ^3 H0 \9 |& E具有上拉或下拉能力的开漏输出/ h# K. V" M9 g" F7 k' D$ }
具有上拉或下拉能力的推挽输出/ W5 Z  [1 J2 c
复用功能且具有上拉或下拉能力的推挽输出5 _6 d# q1 n: G9 c) P
复用功能且具有上拉或下拉能力的开漏输出' O8 `. K; {. b" J/ B
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
3 f6 V: I& r5 |* r% r1 K) F; ]BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之6 b; V' h5 o5 S) c9 m0 H% ]. M# a) ~
间产生 IRQ 时也不会发生危险。
9 q( \: U  Y' ~* p! B* q
0 ?* c5 Q6 x# g  h+ c6 q* Z标准I/O端口位的基本结构
: F- t- o& D6 ?4 ]/ T% C
" F5 @% D0 w6 E  o& E, l' n! w
20200624112800430.png
+ Y% ?, K' s# n- U
$ E: ^# z4 `8 Q% |- t& y3 N
5V 容忍I/O端口位的基本结构2 h  ~% Z$ w4 X( P1 b+ X# [1 S/ q, p

. u2 i; D, p: J
20200624112816556.png

: B2 V. S& u- \0 S- m" k1 c* v5 Z! I3 y' v$ ?7 D" k
4、GPIO端口配置说明
! D8 }- U  g. {. W7 `. b. W① GPIO模式4 C& I0 D9 T/ n5 |
GPIO_Mode_IN          输入模式 ( 复位状态 )1 d1 b* C3 J4 J
GPIO_Mode_OUT      通用输出模式
4 I: e8 H  T0 W! ZGPIO_Mode_AF         复用功能模式- M/ B7 [, i8 W% M6 p% }! f6 g
GPIO_Mode_AN         模拟模式
3 f5 D4 p3 H$ C& w. Q6 m3 c% ^* {! j2 Q' ]/ O5 t4 _5 Y' t& Z
输出模式类型:, |- _! P4 {* V" x
GPIO_OType_PP        推免输出: }! h$ F1 |3 M' o
GPIO_OType_OD        开漏输出, f6 v& I: b# t( S5 [- b* ^3 \
1 r! O% a) R0 T- r8 G* [
② 是否带上/下拉
8 A- H# |+ C9 t% w" Z0 [6 p0 RGPIO_NOPULL               不带上/下拉* _' b8 D$ Y! E6 k' J, K
GPIO_PULLUP               带上拉# f( P7 m1 X$ s% T
GPIO_PULLDOWN         带下拉: e; |- F  q1 e, h, F5 w3 L
, \: T# l) R9 D( o
③ 输出速度3 t. k# E& j# ~0 `
GPIO_Speed_2MHz            2 MHz
) h3 _3 z  r' ^. q- YGPIO_Speed_10MHz         10 MHz2 ~- H: y- h' B, b& z! r
GPIO_Speed_50MHz         50 MHz
. h  C- P" U3 b2 r9 s$ b
" K+ z5 V6 i3 _) m: ?( ~* ~  D5、GPIO工作模式配置$ |+ z( u5 I3 w. ?' ?7 m4 d
5.1【标准库】的配置方式" q# p: v9 _" ]0 d9 E
步骤:
$ C4 t) z# K# ?: F5 E+ b* K1、配置对应端口的RCC时钟1 ^- J+ ~5 X6 O4 I, v
/ ^$ z# r4 k" W: V8 \; |- v% g
  1. /************************************************
    & M6 y7 |" L; D. ^5 x5 @& _# E
  2. 函数名称 : RCC_Configuration% u& I2 V- n. }2 `' K& J. b2 V
  3. 功    能 : 时钟配置
    / Q' ]4 S8 F: ^. S4 f# @
  4. 参    数 : 无
    - g0 K( b  n( k9 J/ l. Y
  5. 返 回 值 : 无/ w$ k4 L9 }6 `% G& E( N
  6. 作    者 : JayYang$ J5 y8 H4 v0 |
  7. *************************************************/
    0 w: K1 j; n# P- z- U
  8. void RCC_Configuration(void)- ~, V" f9 i( C! k
  9. {5 Z) V3 ^: d9 `' y
  10.   /* 使能AHB时钟 */; S# `1 P# D) y4 E" S* J
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
    6 s* S$ e$ t$ A' s! H2 [
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
    + n( W* G: d9 u
  13. }
复制代码
! v) L5 K3 s& u, `% {% C" q/ n. M
2、配置GPIO工作模式
: M8 O4 q0 d4 l) j9 ^' V+ j
0 S4 d  {5 @2 d5 T+ h( i! j" ~
  1. /************************************************
    , u+ v. R* M$ W( o
  2. 函数名称 : GPIO_Configuration, a  H' Q+ F5 G- o
  3. 功    能 : 基本输入输出引脚配置  ~9 Z1 m7 R# m# c6 v% ^" |( P
  4. 参    数 : 无
    5 u- k& q. z6 f  m' ^" W
  5. 返 回 值 : 无9 X1 a* e" [/ U% Q1 x( ^, X5 c! l; o$ I
  6. 作    者 : JayYang
    & y: m- ^3 ?  C) m
  7. *************************************************/
    ) i' b9 z6 C, r
  8. void GPIO_Configuration(void)
    : v' G* U% V7 u) O
  9. {
    * f" P7 B2 i* ]6 K8 t, }
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体# I: {6 n6 g$ ]: m7 b8 v/ b* p) }

  11. ' ~: R' x% n5 z1 ~6 e( S: ?
  12.     //GPIO配置为 推免输出模式% Y; H3 t. _/ ]# [' [. U9 e* O
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    3 _7 }4 _: q+ Y) N% h7 `5 E& F
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
    $ u; F6 I$ C! Q4 t7 H
  15.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出1 l# @# `6 V6 j0 s: t
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    9 o2 P& ~) d8 A* N2 K
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN5 y5 z1 _9 D4 @$ A( Y8 Q! P9 c
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式7 F* G+ W7 _% w6 ^8 |/ V' {
  19. ( G) v5 E7 Y2 g
  20.     //GPIO配置为 开漏输出模式
    - j9 K4 l1 |# Z4 u& A
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:1
    + j% S4 z% g6 l5 U' Q. j
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
    , r8 E  A9 z& r
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出9 R( @% s5 P9 D: D. {, [  z
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz& V: b4 L1 u* V7 K
  25.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    , b3 ^- q8 }. b3 p+ H
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式5 I4 T* ?0 I1 Y7 z  s' s* Q0 x
  27. : C6 R7 s+ D% z' }' U* b
  28.     //GPIO配置为 上拉输入模式
    ) X3 n. U) v2 `5 [5 q8 L) G
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:12
    7 w( {; t1 }0 A5 ~# D: V  X# G
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
    6 f' z1 `2 p& I" ~, i$ u
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
    ! g4 A* d0 @7 K& z2 V) u2 h
  32.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式7 p6 Q/ [7 E. w! }$ {: P
  33. 4 S- N: @+ K, x1 \/ X8 V
  34.     //GPIO配置为 下拉输入模式
    6 D) z) h5 g3 R! z% u9 y. i
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13: q9 z! O: ?7 H, j7 R
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式, M, A4 S# W9 b) L7 h6 Y: _* s
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
    0 L7 l, y4 {1 X! {' D
  38.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式
    8 z, ~8 ]  d3 u8 p

  39. : e3 y5 g( W% H4 `$ r$ [
  40.     //GPIO配置为 模拟输入输出模式
    ' ^/ K9 ]% r( Q
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0; [' Q. F1 d& @# K7 ]; B
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式
    : G+ E2 i3 A/ y. \  L% `
  43.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    % ^# Q. u7 s' ?- u4 t$ k/ S  B, i
  44.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式
    6 K0 {" K4 y  I( a; ?

  45. 5 ~" S. v) Q7 o& {. E: b
  46.     //GPIO配置为 复用输出模式. U: t% ^; ~. y; k% G2 A# a' y7 A
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:9, `+ ~3 ^( ~( J. A4 f; E
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式0 \  ~/ `+ b+ }& l3 D
  49.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
    : ?4 [; U1 o8 b
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz4 P9 e- w) i" l
  51.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    7 W5 G) G2 L0 e1 o9 l
  52.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式
    5 i2 W+ V9 W1 D$ E( z7 F+ F5 l
  53.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚, Y6 t6 j* ?$ e, T2 T7 n& Z
  54. + {" S" X! x" p. t2 P$ ^6 L
  55. }
复制代码

* H9 {5 |2 d& e9 q: `% _/ e" f) v0 Q) z: E
5.2【HAL库】的配置方式

5 [2 a: |- {; u* ~$ n1 [, K# q步骤:7 f& E' {+ c  k  T; e4 Z# g0 h
1、通过STM32CubeMX软件配置RCC时钟! _! {" J, B% m( T9 o- m
1 t2 i# R! P9 ]) \7 k, [& W
20200624152114980.png
* B7 ?8 Z0 S; b2 P2 m- }
+ M( e0 W1 F; Z/ ?
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:" m8 f. e( l1 x* }! V* c
20200624152258136.png
& Z% \7 E* ^4 M6 h" u

2 ?/ }$ z& Z! O/ t3 q2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
) b+ b3 L7 g+ |9 \, V. v3 g  Z1 L$ R- d* P. `* K+ ^" U$ Q
20200624153132751.png

- a/ h" F& |: a0 l+ j1 {6 n7 N) K% j+ |; l# p
下面进行每个管脚的具体参数配置4 ~1 R: O' i( Q: F

& V3 ~! T0 a) n6 f
2020062415342131.png

: i# ~  ?# x/ B& o6 R6 c
; ]  V- o' L- Z) P( c* c5 G, @点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
) U, t  j2 {1 A9 K. `( n+ D7 }# d2 _6 ~, x
20200624153642205.png

$ H5 C9 |( \! X1 z
  M! p. s5 U8 ]3 R& x! S* n
20200624154553694.png

, J' P! f/ _3 D9 e6 \) r* I, s! o8 o# r, w  `3 I  {: \
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
" c7 \3 P. F, E) _' Q/ d1 j# `, y6 K% h* E& Z  e- z8 ^7 F
  1. void MX_GPIO_Init(void)0 ?- E  o( K% i0 Z; S! [" m0 a
  2. {
    & l. M9 {4 A9 ^* J* c7 Y& i

  3. ' p( _/ V6 l/ r/ k
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    + J: x$ a8 Z8 n1 c' K( E
  5. : f$ v& ~0 E) ^- e- V1 n
  6.   /* GPIO Ports Clock Enable */
    0 S0 ?# {& z9 r
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();
    / K. m" r" D* E  g5 Z3 a9 {
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    + P" ]" i- e- r/ M3 U
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();
    . [7 T! _0 m. `6 X5 J- s. B1 I' _
  10.   g, T4 e. V, i3 k/ G; M$ R
  11.   /*Configure GPIO pin Output Level */
    # f6 \$ }8 L* R' L$ C9 ?+ E5 c; g
  12.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);( |  d/ j2 r4 Y% B

  13. % B/ z9 N! }5 e5 W5 ~- {
  14.   /*Configure GPIO pin : PC13 */. n, Z9 y1 N+ y. F/ M
  15.   GPIO_InitStruct.Pin = GPIO_PIN_13;
    5 V7 M% A& ~1 z: Z" W5 C
  16.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;1 A( y, g( X8 |4 g1 z- D
  17.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    ; o: [# O$ X$ Q- v
  18.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);4 W  c& k9 v7 j# @# k6 G
  19. ! z8 z, l+ Y0 X. x, @% y9 Q) d
  20.   /*Configure GPIO pin : PC0 */( H1 H9 N- I& e: k$ P+ D
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    $ f! ~. B  P+ e0 v, w& l
  22.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    " X% `4 T# U/ t' ?, U# E2 N
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    2 m1 G  s0 y6 T- d
  24.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    2 {9 P7 G7 H$ r+ m) U' r4 t

  25. # \! ^4 n( W$ W+ F
  26.   /*Configure GPIO pin : PA0 */
    0 @, N% j, D9 Q8 d2 F1 |
  27.   GPIO_InitStruct.Pin = GPIO_PIN_0;7 m: ]) i6 T# P$ p
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    % ^1 w& u7 b0 Z4 V% r
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    . M( o! o  W8 j( W$ U
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    4 |0 e4 C% y% e7 J3 ^9 l8 [
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' n- F) Q0 o. s/ t+ O0 q
  32. $ b, Z5 n' m3 B, y6 @
  33.   /*Configure GPIO pin : PA1 */
    / b0 X, v9 D5 H9 J4 a( w8 V# s
  34.   GPIO_InitStruct.Pin = GPIO_PIN_1;0 P2 L5 }8 k& W3 E
  35.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;1 g% ]: F$ z% E
  36.   GPIO_InitStruct.Pull = GPIO_NOPULL;" w0 J% \( V- v) k) K, ]7 H8 V
  37.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    6 N) x, O! |  @1 v
  38.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    + ]9 A/ Z/ g% p
  39. * U/ d1 @0 h' T3 r, Z
  40.   /*Configure GPIO pin : PC12 */0 b2 _; P9 t2 E' ^% i* T; y* c$ }
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;
    1 [2 V' Y' k1 e5 v1 S, E2 \
  42.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;9 I  d( `8 H6 D! b) ^/ G1 Z0 p
  43.   GPIO_InitStruct.Pull = GPIO_PULLUP;1 Y$ w9 e7 K7 ]
  44.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);$ c) U- f3 y9 R0 ^

  45. 4 K/ G0 L0 W$ B9 M0 I
  46. }
复制代码
" [3 g, q* y/ G/ b
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
$ \5 ?. `& l( M- f- I
- t2 y1 g: ]( f8 Q
  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
    " t, M5 w" b/ a% G  j$ a- F  A
  2. {7 K# s6 a" i' h: L. l( M
  3. / X. M  Y3 y2 T9 U# R  M/ T( Q( t/ u
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    - [0 Z+ |! \, p$ r! D& c
  5.   if(timHandle->Instance==TIM1)
    0 d# D! b1 B- q3 p5 j7 c
  6.   {' b$ l  s7 T- Y' f7 w& {
  7.   /* USER CODE BEGIN TIM1_MspPostInit 0 */
    " K7 r; Y& x3 C; W0 B7 ]5 ^

  8. 4 ?, q& l# M& X8 ^
  9.   /* USER CODE END TIM1_MspPostInit 0 */
    & O) Z6 u, F* W' e1 `8 s& d

  10. % i0 V- k& Z# Q1 V4 A
  11.     __HAL_RCC_GPIOA_CLK_ENABLE();
    4 A5 z7 k6 T" V6 d  s- }
  12.     /**TIM1 GPIO Configuration   
    ; B2 {( s) l9 W& ?( [7 K  d7 y3 q
  13.     PA9     ------> TIM1_CH2   E: m+ N3 ~/ d* ]* y
  14.     */
    + q0 b' B& P$ E& `) O: ^* L
  15.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚
    ' ]5 d8 X. K  [2 ^+ x, a& ]
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式$ K5 r/ d6 a5 Y" `
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
    7 X, Z* n9 E% s: c- p! y
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出
    6 Q. M+ n) m. ~
  19.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道2
    1 ]4 G+ |( H, _) K" V# `
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    . E& Q2 m3 B4 o* q  v+ d

  21. 7 [, d% U3 H9 N; U8 t
  22.   /* USER CODE BEGIN TIM1_MspPostInit 1 */1 n4 X- W% A) k8 P" }9 @5 a4 x
  23. $ [' p( r# C4 P6 ]& s
  24.   /* USER CODE END TIM1_MspPostInit 1 */: {, M7 S9 m0 I) q
  25.   }
    & E# c8 S" X9 _; Y( b
  26. 8 m$ Z" M' P4 b& S* [6 P
  27. }
复制代码
0 E0 Z' g' V$ i0 K$ x3 y
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
0 E7 |$ N/ J* P9 j% d- |  x4 B$ Y+ k$ ]5 j* ~+ C6 O$ _7 ?. R  [9 c) m
- z8 g; a2 [5 u8 I

7 l! w" k( F# t% K7 R4 p* @( a+ s* q1 D# ], }) p& o8 r' {
赞 收藏 评论0 发布时间:2021-11-21 22:00

举报

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