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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍7 {8 g4 t' k$ m2 c. |: L% q% {
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)
+ n4 N: F' M3 T0 L8 b) e0 {! `) @1 J+ ~$ g, M
2、GPIO主要特性  f' z! I4 T! E6 x' ?& [) {' F
输出状态: 带有上拉或下拉的推挽输出或开漏输出
6 Y* m) ?% f) Y7 _3 G" E从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
# ?" M! `: R+ A8 B! l  h; _4 Y可选的每个 I/O 口的速度2 u& p7 F4 ^3 e- m' W
输入状态: 浮空、 上拉 / 下拉、 模拟输入
4 e  G0 }& `; X% l从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
: F7 y+ Z$ Z4 ?5 ]8 U8 u& Z位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力+ _0 _+ F% i: j- P3 M, ]5 C# s( }
GPIO端口锁定机制(GPIOx_LCKR) 配置
7 ^8 H1 e& \! n# i+ e5 H模拟功能+ F0 J: J5 z2 ]% @+ c7 M0 a) `
可选的复用功能0 D6 d! g4 `9 ]; U" I6 x6 P# e9 g
每两个时钟周期快速切换I/O值的能力9 P5 ~/ t9 X; r- w$ D+ K
允许GPIO口和外设引脚的高灵活性复用
' I9 D: G5 ?% G' C4 X) F2 |5 e5 [. ]( Y; V, x- y
3、GPIO 功能描述) J7 N" q4 [9 V3 B0 P2 r( U
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
" ]; ?7 U) S& `  O' {$ g4 a置成多种模式:
8 o8 b* w$ e! F( ], M9 \& N
+ X6 ^. D8 _7 q8 }浮空输入
% x8 D  Q/ V( f上拉输入
& e: N$ b1 `7 M4 ~  Y下拉输入7 W& X6 A+ V/ O- Z
模拟输入
' D$ Z8 @8 F5 D9 j具有上拉或下拉能力的开漏输出" _* F/ _, O% D' c7 A, q) ]
具有上拉或下拉能力的推挽输出% L; J9 n6 U) _4 Q1 T# S& S# u/ L
复用功能且具有上拉或下拉能力的推挽输出: G; W( q' F# D3 F# Y6 ]! ?: |) _
复用功能且具有上拉或下拉能力的开漏输出
9 r3 T/ F% [, \/ u2 Y每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_' B, ?9 I# Z2 Q0 ^/ v/ r% `
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之; _5 j/ U6 G3 O3 k+ x
间产生 IRQ 时也不会发生危险。7 o6 s. \9 }( v; n9 N' e1 X5 {

, \2 m* M4 Y1 q' a/ M1 g标准I/O端口位的基本结构
* j9 X9 q- q% |+ l$ K# X+ k3 n/ [' k2 u9 e3 q$ ^# m
20200624112800430.png
! v! c* Y# w" ^5 F( N5 c/ G6 v- e& E

# h' I% \4 J0 ?+ n: P5V 容忍I/O端口位的基本结构
7 H4 w" i% Z$ f( z
6 P: `- g; E/ J9 l3 q
20200624112816556.png
" P' U8 N; v4 z, k, ~( ?, N

5 B6 ?2 `/ `! d' B& L4、GPIO端口配置说明/ E6 w* V* U) p1 P7 k+ Y! Q
① GPIO模式
- y2 y6 n/ x0 O7 G9 C# hGPIO_Mode_IN          输入模式 ( 复位状态 )4 c% z  E+ w9 t5 }* B
GPIO_Mode_OUT      通用输出模式) k/ y; H+ K4 C
GPIO_Mode_AF         复用功能模式
  r4 }& w. O; l9 YGPIO_Mode_AN         模拟模式' S# ^0 V- b# l+ u. p7 B# T# u. t

2 P  ]) v6 Y% ^" v; `6 y* c输出模式类型:
; j6 x- w$ Z" J/ o( B4 y" ~GPIO_OType_PP        推免输出
7 q. n4 g% J) _GPIO_OType_OD        开漏输出" L. t: e0 M( u, N( [" E
  K9 o: P7 q1 Y! u
② 是否带上/下拉2 h4 x! }: [+ W0 v$ W
GPIO_NOPULL               不带上/下拉
3 e8 }( J1 G/ m/ _" o" fGPIO_PULLUP               带上拉: ]4 X) j4 ]: Y( t, n/ t; z2 A
GPIO_PULLDOWN         带下拉- c2 ~# V# {. n) |4 g  n

" b: `# W# [( v# n9 ?( u, \1 |- t③ 输出速度
' C% M; z5 I7 S, [, A& t/ lGPIO_Speed_2MHz            2 MHz) p% z' q! p0 H% h* c' r
GPIO_Speed_10MHz         10 MHz
( K. W. M+ _* _8 nGPIO_Speed_50MHz         50 MHz
0 s) N  [7 s  z8 G" k
8 y/ M( }# Z9 _2 B; v5、GPIO工作模式配置
7 `3 @- ]: O% r5 {( B5.1【标准库】的配置方式, V$ x' i( f2 U5 E
步骤:5 M7 d9 g4 `' j* d/ Z( S! @; K
1、配置对应端口的RCC时钟
( y9 e1 w6 z4 K6 s
+ b1 h# {! p! x( f5 p8 U- y& ~: y
  1. /************************************************
    ; _9 Z) `; \/ e5 v* F1 k
  2. 函数名称 : RCC_Configuration
    ' @5 d0 B6 k+ \1 C- K6 j. L% x; F
  3. 功    能 : 时钟配置
    - L2 N- Q. R" H9 W9 L- v
  4. 参    数 : 无! Z9 k* w' O& a0 h, I
  5. 返 回 值 : 无
    + \& x: k6 o* `, r7 t9 D
  6. 作    者 : JayYang3 Q9 S2 t4 P+ ]: E# a) x+ c
  7. *************************************************/3 a# s, w5 u- ?! ?- b! r/ l
  8. void RCC_Configuration(void)# W2 L- k6 A- T: D
  9. {
    . }9 ?+ c4 o0 q8 g: _# y. O8 d( x. c
  10.   /* 使能AHB时钟 */, }8 @# l5 J9 h: Q
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | 2 P+ c( `, ~4 m9 w& A& h
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);% _* P& T2 ~5 @' H6 x! G: |
  13. }
复制代码
* e5 W# E/ O9 {4 y# \' E
2、配置GPIO工作模式2 Q4 {! K2 y! ]0 W7 r  r# w

# [: g/ H  o# ^' U' y1 Q; K
  1. /************************************************
    2 s( u" q) ]- J; f2 h2 D, v
  2. 函数名称 : GPIO_Configuration
    0 v7 y4 F+ b3 j, _
  3. 功    能 : 基本输入输出引脚配置% d9 M& h$ x; M5 [2 k
  4. 参    数 : 无0 r& @0 b1 ?. ?, Y' g' i# C
  5. 返 回 值 : 无
    ! x8 a! ]& C* e( a
  6. 作    者 : JayYang
    # l1 B# N5 o$ @- K* e2 T1 F7 T5 H# W
  7. *************************************************/& m/ u% y) W( s
  8. void GPIO_Configuration(void)
    $ a3 ~- r0 z+ v8 b& |& r
  9. {
    " A# b8 H  `# d$ I' T
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体8 {, ^2 A# b: r2 w" Z5 l

  11. 0 A1 z9 i" y0 O
  12.     //GPIO配置为 推免输出模式
    " h6 ~! v9 W* \: ]$ ]
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    ) V& c1 b- ~" C! M' w" X5 x6 G0 B
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
    ' L) b) g. c' D- O6 I1 [
  15.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出; O  K' S* K8 m6 b& o2 R% |6 q/ y5 h
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    7 I/ \5 b2 T( L
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    1 y9 ~2 V+ u- f
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式
      X6 R& ]6 C/ B+ W$ B

  19. / ]5 S) y2 |4 ?( i2 h
  20.     //GPIO配置为 开漏输出模式1 |2 y0 f* r& @0 X" }" W
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:1
    # M8 i& V4 f# F0 y, H9 g
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式3 z. X  }9 i: e/ h% x
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出  E% o. [* e- L  Q7 L9 J$ q( _
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz: Q) W+ t# u* ^  I6 Z
  25.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN) c6 p; X/ M; t7 m4 z$ L
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式
    : w, h# w% d; X* D% r- M0 y% B
  27. * s% T3 |2 Y: y: A) @0 n
  28.     //GPIO配置为 上拉输入模式
    5 a- W2 \" Y8 [( D  z( S# x7 }$ b
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:12
    * P  K( I) F+ W  E$ W  V8 k
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式4 ^( X: W, k7 x2 N
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
    0 `% r5 O. h9 i+ \  G' r$ z1 h8 ]  s
  32.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式6 C, S5 ^2 N5 a6 i

  33. 6 O- P8 O' d* L- y: a7 o" _- Y4 `
  34.     //GPIO配置为 下拉输入模式9 k& N/ e$ q5 g# K1 l% z% R
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13) c' |3 S) d" f0 o! @$ r
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
    , @$ L5 B; |! J  t1 o3 P
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
    % A2 ?) ~& y* t( C+ v. F
  38.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式' Q8 Q. I7 i- q5 K7 s$ w

  39. / {4 o, _, L& Y8 y! s; R$ W1 T& ~
  40.     //GPIO配置为 模拟输入输出模式
    / a  o4 w5 f: g" Z2 s
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    1 P8 Z' O: z( t5 E; _6 k
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式
    - a2 ~. m5 v8 Q4 c  E, T  r( P
  43.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN! S% t% C" w$ S: v. [+ u9 `2 N
  44.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式; X. d+ j9 F- @# p8 b7 u. J

  45.   F% Z4 S$ G. r' ]" I
  46.     //GPIO配置为 复用输出模式
    : A; d$ u, ]9 W; Y* G' s: K. I" Q
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:9
    ( V) V8 s3 V- r7 A+ D" T8 A
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式! h- K  R9 I) p8 Z
  49.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
    3 N: K* k: \% l1 |! s8 v3 ?( E5 N0 ^$ I
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    % v+ t1 p: V0 ~" ~) X
  51.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN 9 Z: W. n. E$ V! |0 ?
  52.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式2 h6 S+ ?' t6 q" D& K/ s
  53.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
    $ s. k# E+ H7 X
  54. " q5 z! p# J$ J3 y0 y
  55. }
复制代码

' `* a0 y) m& J4 b
0 H& u' z5 @( p& M3 V* B5.2【HAL库】的配置方式

% Q7 _% O; s  p6 r步骤:
: [0 \0 i0 z7 E  s+ o- i# e# ^- H1、通过STM32CubeMX软件配置RCC时钟( D5 m% O* @% u! [

1 I& r0 G9 ^  W3 p) H- J
20200624152114980.png
1 k2 \% k" Y7 @' Y9 |$ D5 V5 \

1 G0 J7 d0 O% Y; G7 W选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
: B1 ~8 S- }7 G% D
20200624152258136.png
0 q; H- ]* w3 p# v

' S. V  R9 B9 ~2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
6 r' Q3 A1 K2 P8 C# g; J
$ n+ o& u  ]$ v6 Y
20200624153132751.png
" I) i0 i* a5 U) m: Z3 |

0 w, K7 e% j1 \下面进行每个管脚的具体参数配置; b% b5 O! o" O( h$ d' a

  v& Z' ?! b, }) M
2020062415342131.png
3 g" n2 J! B0 v
2 s0 i! B0 j5 H. k8 ]- s* N
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
% @# p2 _$ Z  j4 h4 L
* J+ e6 u% u; l% j
20200624153642205.png

9 U3 j/ A* ]1 @- a! n! n1 q
& ]: E. k) S" z* k7 f0 A" _9 H: h+ c0 {
20200624154553694.png

5 r5 m0 f, {$ b, ?5 G1 n, W$ A% z, F1 {# K9 k
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚# O# t" f$ \% V+ K6 J
/ X* T- Y' m# z+ l/ ?  H, w+ q/ Q
  1. void MX_GPIO_Init(void)& \2 X7 J! d! C8 v/ m3 ?% q
  2. {& X$ ]& t9 N* T- |9 [3 f

  3. 0 P  b2 s' @% J$ ], R; T* e' v
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};0 l- @* E1 @: h

  5. 7 m+ e. l2 K7 f, q6 N) e& Y
  6.   /* GPIO Ports Clock Enable */
    ; f* ^* h& X! u6 C% Z
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();( l" v3 ~# k, r: o4 s1 L4 r; X7 |
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    6 ?& \4 U: e. r! w
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();" j4 C" z! [* [0 m2 f8 c4 j
  10. 7 |. g6 o, L! `; Q! i
  11.   /*Configure GPIO pin Output Level */
    $ g9 ]. \4 t- C, W
  12.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
    + D6 v, S7 b0 O! {4 u6 V: q% d

  13. 3 l2 f: w% R1 n. J& \4 F* L
  14.   /*Configure GPIO pin : PC13 */, D7 k' @; X( D; L+ ~0 n- E$ l
  15.   GPIO_InitStruct.Pin = GPIO_PIN_13;! {. i7 A; A  r1 C! H6 L9 R0 D
  16.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;$ L. H9 Q# E$ R; d% ?& ?
  17.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    6 x' F% l5 K, S" H
  18.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    / u# o( o% _7 G0 }# O: i( L, w5 D

  19. 0 }6 F' H/ k- v$ J' E7 p1 E
  20.   /*Configure GPIO pin : PC0 */
    6 i) k# @+ {  V
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;% s+ Z) v# E7 t7 a2 ^
  22.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
      U! U7 s6 @0 _* }
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    , Q# H6 v( i$ W2 |+ i
  24.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);% O, B5 j- C! l+ r" v6 {9 ~
  25. . `# P& j" Y+ [: t6 U) d
  26.   /*Configure GPIO pin : PA0 */  m6 p9 b8 U9 [* n/ `5 C9 g9 i
  27.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    # b0 y5 O: }, ^2 V! W4 L
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;8 [4 {3 F. a/ C) U9 d
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;' G7 e  s0 u. a4 G
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    - [+ J1 x# [# v
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' I, Q  E$ q2 u7 ?( x" H

  32. 2 L1 G! O$ b: E- X6 o
  33.   /*Configure GPIO pin : PA1 */, X) X. `* M. f
  34.   GPIO_InitStruct.Pin = GPIO_PIN_1;
    " Y' j% a, S4 S, o0 }
  35.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    & E$ |8 a+ u" F$ |: r
  36.   GPIO_InitStruct.Pull = GPIO_NOPULL;% B% p1 d3 R( R2 [" Q/ r3 O9 w
  37.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;* f$ W# ^, B0 e
  38.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' ]. J( r$ s+ L, ^* _- y0 ~' c% V
  39. , s* _6 O- B# L' R
  40.   /*Configure GPIO pin : PC12 */- n& E. X. c" G! \
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;( v; `7 X! |* O, F& D9 Y
  42.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;2 U  P7 y  X6 a2 W, E. r/ a
  43.   GPIO_InitStruct.Pull = GPIO_PULLUP;% m. U* y% c  M
  44.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);9 U! E3 d; J! q; I7 U* Z: \

  45. 0 o( T( R$ v" x* R! Y. i- W# c# I
  46. }
复制代码

; t; |1 [$ R+ N, @8 Z至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
9 D0 q0 M) s! I  L/ w; y4 P+ u& x: A( [- v1 G8 i: U
  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
    $ E2 V7 i) x% d2 u: Y: t
  2. {/ E3 l" l! \1 Z! T# A+ K9 b
  3. ' ~( \$ S+ A; w" `
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    . T/ q' M' }5 [0 i9 }- S. G
  5.   if(timHandle->Instance==TIM1)
    : ?8 a+ v: K' c6 h
  6.   {
    7 R/ W/ X  _( m9 `3 G
  7.   /* USER CODE BEGIN TIM1_MspPostInit 0 */$ E' ^& i8 ^9 D" w
  8. * _/ y( A0 E2 g  W" O# ^% J
  9.   /* USER CODE END TIM1_MspPostInit 0 */$ m% M$ L, P6 @

  10. # y( K9 A' }0 Z; i) |6 s
  11.     __HAL_RCC_GPIOA_CLK_ENABLE();) S! T) V0 }2 F( P; L
  12.     /**TIM1 GPIO Configuration    % x9 u  K7 s. U
  13.     PA9     ------> TIM1_CH2
    8 p  c' O6 Q' _1 v4 q3 w+ L
  14.     */5 {0 Z& k9 _7 V, |+ j7 S% ~
  15.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚
    - z# t  b' B# g  N! z
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式$ K. q- A$ X; a# Y! ~3 W/ B% ^
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
    2 A9 b' f6 F/ j( B( F  G* l( {
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出
    ( K" G% |# B6 `" w! P
  19.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道27 |. n6 o6 {0 v) J% h4 N6 K' j
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 W: b5 w/ ]' n/ H
  21. ! J7 j! d0 s( O- N
  22.   /* USER CODE BEGIN TIM1_MspPostInit 1 */
    4 v/ J* n) H* D$ U: ]

  23. ' y" G% ]! |6 ^5 V
  24.   /* USER CODE END TIM1_MspPostInit 1 */: _8 q6 v+ @- U
  25.   }& _1 g5 v( ^( ]# x5 {

  26. % l1 r( c) Y1 O" ~* e2 }: j  ^4 H) L1 u
  27. }
复制代码

% e  |) b; e- J  a: D" T2 y至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!5 x6 m6 o% Z7 u$ S& I

) f7 r' N1 s3 e/ z0 W
) u5 f( `9 Y# c0 N1 W+ F- \
& {. J7 f+ j/ ?, k8 `) j
9 E* B8 ~7 W4 h6 |# C, C
收藏 评论0 发布时间:2021-11-21 22:00

举报

0个回答

所属标签

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