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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍* u( h6 j, Z3 W. V2 u4 f
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)* |+ F* _$ z! t  n( k4 j) \5 ]

, P. |( h* f9 i4 K) w2、GPIO主要特性
9 x! ~! c2 z( P1 }7 C输出状态: 带有上拉或下拉的推挽输出或开漏输出8 z& F0 a& p2 O$ j
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
8 J& r3 `* a+ z) c+ ]可选的每个 I/O 口的速度
8 z* j2 m7 a) C6 W输入状态: 浮空、 上拉 / 下拉、 模拟输入
$ I6 Q- U: g- U* T# B从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
/ g" |8 i& ~6 J' b位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力, f( t5 }. p' j2 A$ o5 Z1 W  R
GPIO端口锁定机制(GPIOx_LCKR) 配置
& l- N2 d* _1 Z, P+ J1 o4 G模拟功能
' h2 \1 X$ G* @7 _+ H可选的复用功能
2 O: B/ i1 y# q% [  M  ?$ J每两个时钟周期快速切换I/O值的能力
; U' U( A1 y, _, W1 n0 N允许GPIO口和外设引脚的高灵活性复用
" G5 t8 m! i% e2 R1 |" u8 c5 I2 a' Z  Y; Y
3、GPIO 功能描述
5 j: `) {; O2 }( M: v, [' L/ Q根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
& z3 V" `; I* l- Y: W- {置成多种模式:
, V# o0 o3 z& V* w' {* f" Q3 [9 a( g& x) n5 @; I' z5 G
浮空输入
3 N( ~3 A% I9 f6 E  I1 C6 S( Q上拉输入* ]- z! n; Q  H$ Q7 Z) |
下拉输入
* u# x0 s7 \+ Z6 _2 i模拟输入+ f6 H; R* t7 D+ g& m6 k+ u$ b
具有上拉或下拉能力的开漏输出: e' C) u/ X, H* W/ k
具有上拉或下拉能力的推挽输出
7 ?( J# Y. i7 g/ q: W! w! n复用功能且具有上拉或下拉能力的推挽输出
0 G* v9 f! r! \) L9 b$ d复用功能且具有上拉或下拉能力的开漏输出
$ i3 ^4 M* v- j& a每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
5 D2 P  @& r3 s0 NBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之% S- @6 g# K) R# g& [: B* o
间产生 IRQ 时也不会发生危险。5 p  W( @) K  {$ U, O
1 ^! J$ F# k# V" y. C1 f8 }' ^
标准I/O端口位的基本结构
: y, [7 V2 S+ R" k
) d0 R5 m  U: M
20200624112800430.png

" f) h1 U, D  S" u# M/ o" X8 w" ]5 D
  q  a! [- C0 k" t5V 容忍I/O端口位的基本结构
/ l( k: w* \* m% x# w8 D( i) C
' D4 c' y; A6 ~  j0 Z  u
20200624112816556.png
' q9 Q# d) J4 M( k

2 f1 i" U' D" K! F1 N8 e4、GPIO端口配置说明: \6 M$ R  C2 M( ~
① GPIO模式
% \' {0 Q% r8 |: KGPIO_Mode_IN          输入模式 ( 复位状态 )3 {* C) R) Z6 P/ V- `! o
GPIO_Mode_OUT      通用输出模式
  ?5 H) B2 |# K8 j& zGPIO_Mode_AF         复用功能模式
) V: q+ ^& C2 x% ^GPIO_Mode_AN         模拟模式
; G, J/ {- I8 l) m; P! F5 F  l4 K% R/ E, b! {" ^) o) ^5 S! L
输出模式类型:
  F9 |5 m, m4 l/ X+ |' {  a0 gGPIO_OType_PP        推免输出" J; \% S+ k+ z) W3 j: z+ v
GPIO_OType_OD        开漏输出
2 ~  R' ^; e. [4 [: C/ v0 d5 `( i8 R7 L7 [0 j1 L
② 是否带上/下拉4 I, y- v4 g# ~% H2 ?$ l5 S5 a
GPIO_NOPULL               不带上/下拉& J! }& X" b* P6 p
GPIO_PULLUP               带上拉1 F1 ?$ U6 z' L5 f. X( [# N; T( p, Q
GPIO_PULLDOWN         带下拉( S3 ]- T" E  ^! w: A1 W( \
6 m* H1 j. x# b7 H/ I8 m! P
③ 输出速度
- Z8 p1 L+ U( H3 `GPIO_Speed_2MHz            2 MHz
/ ~7 k$ n" G' X' NGPIO_Speed_10MHz         10 MHz0 M$ J' D3 Z( J+ [
GPIO_Speed_50MHz         50 MHz, T/ C; T% E2 J, \% b
! T2 ]( h( y: J. N; g9 K* q
5、GPIO工作模式配置8 t5 z& S' k! n1 {# V5 K
5.1【标准库】的配置方式1 u. k: n! h/ U: P7 ]4 m  f
步骤:1 ~. F  i1 j5 S5 Z, C" s8 `) z5 z7 @9 `
1、配置对应端口的RCC时钟4 M8 Y+ n# V/ |8 f3 u0 R! z

; W! @4 V: E! ~! q# w7 r' ~: c
  1. /************************************************: i; F4 v5 I7 [: Z
  2. 函数名称 : RCC_Configuration
    : ?0 l1 F0 N% v. ^
  3. 功    能 : 时钟配置+ V. N8 m5 {1 _
  4. 参    数 : 无
    " Q, S! H  F; T% k
  5. 返 回 值 : 无
    / z1 I5 Z# j2 b5 _( T" |' U7 f
  6. 作    者 : JayYang
    0 j9 F! s0 Y7 B, ^1 o0 |4 z
  7. *************************************************/, R( f8 X# h' D! r
  8. void RCC_Configuration(void)
    6 o+ s6 o/ T  I2 S! q' A
  9. {
    0 C$ ^2 v2 O& m0 }
  10.   /* 使能AHB时钟 */
    7 C/ q4 y* c9 D4 z( i# i) ]3 f
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | * ~- o7 m6 I" z
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);: s3 l. J/ K; g6 J
  13. }
复制代码

' J2 J- H  k+ f8 l2、配置GPIO工作模式! S+ j9 V; B& s  K- G
" `7 R  m, ~# g1 v
  1. /************************************************
    % ^, E3 W( B8 o; N# J0 |9 x5 K
  2. 函数名称 : GPIO_Configuration/ m5 M2 C. ?& d
  3. 功    能 : 基本输入输出引脚配置" [0 V  r4 O# n- B3 R! A
  4. 参    数 : 无* `5 s" C) N9 }8 b8 Q
  5. 返 回 值 : 无
    . Z* J- q$ f! ?( n' D* m' G( U5 s
  6. 作    者 : JayYang
    ( z8 |6 d% E9 [. `% }; j- S
  7. *************************************************// O$ W' u9 ^! X
  8. void GPIO_Configuration(void)6 m; U, r2 w% B! y+ H
  9. {
    $ ~; I% Z; g$ x- m/ ]+ X8 t
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体, I, {$ S2 l) G
  11. # R0 l* y0 u0 S
  12.     //GPIO配置为 推免输出模式% [) P5 C6 O) ]- F* {& L5 D, u
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
    4 d$ z# I- D0 U' d6 V& B
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
    9 v, D, A+ `) p+ y$ }4 X
  15.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
    ' h5 R6 _- E3 Y
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz: c) j9 E$ M$ j3 L: {
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN& ~& j# ?) P% U/ S4 C7 _) t
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式, a2 R  ~. `) g1 l/ i
  19. * Z0 X1 R0 \9 d8 ]% d& r/ f- b5 e
  20.     //GPIO配置为 开漏输出模式
    2 L; y! D/ a. F, o; \" G
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:14 Z8 P' c' W" P( C/ b% V# }! [. l0 r
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
    # p$ D3 o' T+ q, n* U$ w
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出
    , O6 a+ k6 z, P( v. ?6 R0 K
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    # J+ I1 G4 e" u4 r. P  M$ H# M
  25.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    , R0 \6 T2 f% g* M
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式
    9 `; E: l! h6 w4 ~

  27. . t, [- Z7 A5 |7 U4 h
  28.     //GPIO配置为 上拉输入模式. ^) I& f( v* r' Q  m+ w# `
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:12
    2 W& |% c* e4 Q5 b3 e5 T' M
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式' V# ]* r& w% |( S) b" I
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN* w( J5 k" x9 ~, l5 E6 l& @
  32.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式
    3 M& N. e9 P! l

  33. ! Y  W2 e2 R9 B8 {/ x( o# R* i
  34.     //GPIO配置为 下拉输入模式
    7 N# t) g# \/ M( J4 Q
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13
    1 u# l3 j' Y7 l: t. X% N/ \
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
    6 o$ v- G0 Y/ c
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
    0 q4 u) \7 v9 Q" h: j+ u
  38.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式
    + }: k4 A* I3 n1 }9 y! Y

  39.   P9 B* H4 ?8 L% k* O0 N6 A9 O1 T5 {
  40.     //GPIO配置为 模拟输入输出模式& |1 V/ o6 K/ L, x% |
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0+ m! t- o% C" ?0 H
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式
    - H: g: g* F$ W* O& e7 b$ O1 ~
  43.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    * _, U* ]4 N: w
  44.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式
    # f% x# l2 k" Y* Y
  45. # ?# V8 J- _( x) y) d  N
  46.     //GPIO配置为 复用输出模式
    5 |2 E/ T+ K9 v8 X1 ]
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:97 a( e& |6 J7 A" r9 T( _* v9 q
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式
    $ U/ G) r  \6 ^6 c# e
  49.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出+ T3 D# U' E9 e7 t$ X6 U1 H
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
    # Z* i# p/ K$ I3 k4 P- Z, P" K
  51.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
    " f6 @4 E; E$ g: \6 }: `) x3 ~, K
  52.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式
    . q* L! _5 ^! t% s  J9 O
  53.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
    / `1 n' |8 Z1 f. Q9 r
  54. 6 w; J6 S- P% r2 K$ L7 X
  55. }
复制代码

: {. A' g) z& y/ d* g$ @  w4 f4 n" d& I% t+ L* P  a
5.2【HAL库】的配置方式

" a8 d$ ]& j/ }: E$ X3 o步骤:
+ W4 K4 g' p+ d4 x  U8 Y1、通过STM32CubeMX软件配置RCC时钟" Y. s; Y5 v, d6 [

) O' I8 q! [1 P/ l
20200624152114980.png
3 R" \" t  q+ _0 a$ ]

6 k6 K& p# C) |0 l选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
/ N& F) x1 Y. {& J
20200624152258136.png

( w3 d, H, U2 Y4 S, X3 ^4 P2 C, w' ]2 n, d4 Y
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
( V( i9 M, C# x6 t
; S# A( v  P; s, ^% H
20200624153132751.png
3 {8 P* O# y0 o: d6 a# x/ s
  F% R7 W! O9 u0 W' R( k! X
下面进行每个管脚的具体参数配置
' t# H1 D  W4 N. [) \. Q! R' J; C* s8 ]. M: R3 m' Z4 m
2020062415342131.png

) ?6 }% Z" ~; z# T( j. |4 z' J2 q. H9 ~
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
( Y/ s+ `( }) l- r6 i
' e! C, c* A0 o- m9 U: z6 [4 m# g
20200624153642205.png
1 h' H1 ?% P8 v' R  F
# a3 c8 n1 n; ]' z
20200624154553694.png

: I- x# A$ E& Q9 `7 V  u' e! b" z7 ]! y3 m$ u# [
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚* ]$ r# i* O6 Z6 Z- W& w+ N$ v' {
+ _6 j) i: O# l
  1. void MX_GPIO_Init(void)
    3 a; [  X6 C- \( I; `0 a  z. e
  2. {/ H/ ?0 ^0 m, q3 O

  3. + b: @0 @" ~* ]
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    8 d" M. P' U8 N2 U
  5.   ?' n, `9 S$ G: M
  6.   /* GPIO Ports Clock Enable */
    2 ^7 S9 ^4 F: n0 }; c8 W9 O! n
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();( E8 d& T0 ?) y
  8.   __HAL_RCC_GPIOF_CLK_ENABLE();
    5 M3 e* t. A, B1 m
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();; k3 U) v# u/ b3 u! m! ]
  10. $ b! @7 w/ v# I- D0 T% c/ R
  11.   /*Configure GPIO pin Output Level */, S" H5 Z. |( P
  12.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
    & N; t' z% s3 o" G: h6 F

  13. ; A2 e; Z  v) E9 S: Q3 d
  14.   /*Configure GPIO pin : PC13 */
    ' L) |, T: [1 T
  15.   GPIO_InitStruct.Pin = GPIO_PIN_13;
    ) |3 u$ @: A. R" m" e
  16.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    . h4 M" |+ y) D) A2 b
  17.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;5 G7 B) R4 V/ H! L- s6 V3 r% h- I" q
  18.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);, Q4 F7 e! S5 ?

  19. & R+ ]/ @6 D( _5 x# i" W& N: L
  20.   /*Configure GPIO pin : PC0 */" ?$ }- e% Q2 S, C% }& u' @# |
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;) P# K. t) t) [* m  N# [) A1 @
  22.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    1 O4 r8 h: }" t: a) }% J
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    9 K: [: }4 O" I7 ~  F
  24.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);; K7 v0 T  w) I# C: A$ ^# Y
  25. - H+ b) ^4 j+ c* K; w" F+ D
  26.   /*Configure GPIO pin : PA0 */, M0 k  [* n5 m( n0 [: i5 j, Z
  27.   GPIO_InitStruct.Pin = GPIO_PIN_0;, i' i' t" u5 `" w3 y* [- Y
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    6 }: Y! G& c+ `4 Y  ], I/ ?
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;0 \/ r  F. I; }" E6 ?
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    1 p! h% c2 i! F+ ^$ x4 b$ T0 I
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    . @6 |  S" k+ j" [' D! q

  32. 0 K. C. [7 ]6 Y5 g, T& e" w3 F# R8 t
  33.   /*Configure GPIO pin : PA1 */+ e9 O3 F1 U# i6 m& J  k
  34.   GPIO_InitStruct.Pin = GPIO_PIN_1;
    6 X: \" c  Y. L6 V8 e0 @7 y( j
  35.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;" `2 G4 x& S( l" {+ y; g1 D. i
  36.   GPIO_InitStruct.Pull = GPIO_NOPULL;5 s$ y/ |1 H# T/ R1 J
  37.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    # g+ ^1 j; O- v3 K
  38.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);) R7 _' i0 [8 s$ Z" U

  39. 4 ]1 D) R7 H6 p9 {$ E
  40.   /*Configure GPIO pin : PC12 */6 q  J3 h; N) g* r  w# g8 C
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;
    ; d3 c; {5 t8 o# {7 X' l3 m" x
  42.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    & e( k& `4 O1 a9 V
  43.   GPIO_InitStruct.Pull = GPIO_PULLUP;
    * h; `/ n+ V# j  x/ h
  44.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    " S6 y$ o* D7 n9 _1 S: I

  45. 6 w" J' b$ ]$ h" s' j
  46. }
复制代码

' q( t) n" m. ]- _! B至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中! H% \' y( C9 x/ E# K
3 a0 M/ y0 q3 O! M( o+ {
  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
    9 a7 G. V' R- }
  2. {
    ) n* D$ y0 \/ Z- B& ?$ O0 a+ b
  3. # c) Y0 f3 c7 U  [
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    $ C4 B  K: O) N* T# H8 e/ z9 y& x% `
  5.   if(timHandle->Instance==TIM1)7 ^" l; L+ m' t
  6.   {
    : F3 a7 t; s1 e4 {$ G
  7.   /* USER CODE BEGIN TIM1_MspPostInit 0 */2 F3 f# C* ~+ j. A7 {  Q1 M

  8. 7 a9 S$ F, \/ b! o; t; P" w8 y3 M
  9.   /* USER CODE END TIM1_MspPostInit 0 */
    0 e5 y: E3 A) O7 y; G* P8 f

  10. / f( N7 W* J8 R1 _  _. e7 h
  11.     __HAL_RCC_GPIOA_CLK_ENABLE();5 X, ]. V1 `+ Z5 c5 U* P* n; T
  12.     /**TIM1 GPIO Configuration    % U. F0 |9 ^: l# J; _% f, U" t8 S6 L
  13.     PA9     ------> TIM1_CH2 " z7 |  D* S  V( C+ u% b0 s
  14.     */: i+ @; r3 @; l" Q0 u
  15.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚
    : \0 f4 \, D+ n, j! c) H  F3 r
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式$ ^$ ~; Q1 F9 s/ E" @) G3 W
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
    % d0 o5 s! S0 P2 J4 w
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出! G( Q6 L3 E: E: d
  19.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道2, L; P3 t* ?& c  E& L0 A
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);0 B. A9 D- z9 j

  21. : Y3 T2 I# K$ o+ O" P
  22.   /* USER CODE BEGIN TIM1_MspPostInit 1 */7 Q8 u' z# K: m" s% ~# U2 `. _" T1 w
  23. 7 `" B. a. c" t8 W0 A$ e+ B! H
  24.   /* USER CODE END TIM1_MspPostInit 1 */
    7 q" |0 t/ F# h3 Z* z, `" q5 V
  25.   }
    9 z' {% }; H9 t5 W( \
  26. ! H* o+ e7 J/ E9 I+ i' L
  27. }
复制代码
0 |- [, T9 R/ f% B6 N& \
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
* T; Z* r, M4 X4 U- p$ l
/ A* W; C0 |- i5 ?! k8 n1 u1 z
  F0 ]# C, Z/ }1 Q% n* Q* J& V7 k. e

& K! T2 {0 K$ j7 k- G6 d3 ~
收藏 评论0 发布时间:2021-11-21 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版