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

【经验分享】STM32F0- GPIO 配置STM32F0的stm32f0xx.h中没有CRH和CRL函数

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口
3 E" _. R) j9 i( A0 ^3 ]$ _  I) U' _$ `# t/ K, t- R9 @
20201230164444562.png

' w( H% p, Q& \: x
20201230164505622.png
6 e+ g7 \3 E3 R; Y- s' b# Z8 L

; L/ i' V" K0 x% C# t1 Z( J介绍:
' ]: q5 L: U9 T9 H( Y: \, V. r6 L5 r) l/ q( L/ I
4 个 32 位 配 置 寄 存 器
* j! A4 J8 Q- q
9 H$ d: Z1 f2 H# p# k& tGPIOx_MODER:模式配置寄存器8 H+ w# a; [: S5 i: M8 K! V7 }

+ Z0 F& G5 D' u7 o6 D/ qGPIOx_OTYPER:输出模式配置寄存器# x* b% O7 M1 M" i  I

) Q) l( ^; N0 z8 c8 qGPIOx_OSPEEDR:输出速度寄存器1 S+ C9 X. U7 F) v, Y

/ z9 a/ H+ ]5 }+ P) p6 Q( t, KGPIOx_PUPDR:上拉下拉选择# R! l; ?% s! O1 \

- k4 ]7 L5 p/ c$ r2 个 32 位数据寄存器1 o3 u# d2 L. Q$ i" n2 L( u, _' d

& V8 c$ \7 D! R2 ^- I6 t' UGPIOx_IDR:输入寄存器
, w4 U% U  L3 b6 L7 ?* h, K, t$ C$ e
GPIOx_ODR:输出寄存器
2 H9 y+ @' K9 o* g- \+ F+ Z$ D+ P2 e$ u
1 个32 位置位 / 复位寄存器

' b. [( c3 M, O1 w2 z2 ~6 L: V9 n# J) E# i% [% m
GPIOx_BSRR
/ L$ f9 |+ Z0 b9 N5 n: s7 r# N8 u$ V* J5 J; Z7 X
A和B还含有1个32位锁定寄存器
# D" r# o5 _$ n9 [) e# c- D0 i: O: x3 ]9 l6 r
GPIOx_LCKR! H: N5 D7 E  L- s
# h: i' x. l1 l9 T# P
A和B还含有2个32位替代功能寄存器; C/ b5 J. f, `( P% i# p+ G' e1 R
6 d  z5 r% D5 T( N: I
GPIOx_AFRH :复用功能寄存器
& P3 ~! h  }$ b. V. r  z( o; g, d. z* n- G0 X1 ~. |
GPIOx_AFRL :复用功能寄存器8 F! X9 k2 E3 @8 a2 A9 d% W
. v" L4 m9 q( X
GPIO口可以配置成如下模式:0 E, F  }9 M: L

/ z6 v, ?& a! E6 _& L% I● 浮空输入
. t3 k+ ~& Y. z( o% v4 q$ Z9 D+ v1 A' D
● 上拉输入1 |) O( K9 }5 [: H8 ?

$ F. D+ o+ X, t; |0 h3 P* p9 t● 下拉输入$ D- Y4 i" i1 L! |& g- ^% x% e+ b  m

9 g/ C% e7 d$ p. `● 模拟输入
" m- h5 `: d+ [+ T! ^1 x$ R
/ j, @& G  {, w, K● 具有上拉或下拉能力的开漏输出6 V( }1 \; Z- @/ D5 V6 \  w

' ^7 z$ L. u' x2 Q● 具有上拉或下拉能力的推挽输出
# u5 E9 `* `/ y
2 Z& {# q# C1 g! u6 v* N● 复用功能且具有上拉或下拉能力的推挽输出
% u7 j' K# ]4 F4 T% X  U1 ~) ^4 K
* y  A2 v% H+ M6 ~) \6 w8 r● 复用功能且具有上拉或下拉能力的开漏输出
4 M# `$ }! w0 y4 _% g3 b9 m; L( F. K. I9 M
注意事项:
- d0 x1 j2 c: p9 `6 M( A' l% v/ i; ]7 I5 ?0 L
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 F9 H" o( L4 ?$ Q
& m+ ~+ Q9 |7 _6 g2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
( o/ T" u! `& }2 F6 n  }- O' K: S4 f! B/ @
& v7 f5 [. K& v! B8 I! l; W2 mBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。; Y+ A: A" _! I

! {! Q. q) L2 Z5 O1 n7 J# ?; q3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
' B5 q1 G8 s, k# K2 L: v0 x0 U" q+ w
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置: L: w$ M$ A2 H6 e

7 P7 y# S+ g: X( b+ g' k配置过程:( ^& |" m% @' B# R; J# ?
" |+ b6 J! W6 E* l
  1. void GPIOConfigure( void )2 g7 O+ F( k, u' ^/ Z2 Q

  2. ' L2 S4 G* f4 \# Q9 p+ x2 _
  3. {
    2 Y/ e) f: F- r: h9 O$ T
  4. GPIO_InitTypeDef gpio_init_structure;
    + |+ g2 w' _, I

  5. % k# w) o0 U4 I% ~
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式/ z0 ~5 t3 Z  ]9 e0 t- R. z

  7. 6 [+ p) ?; x  L6 a: ~& Y/ ]
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
    4 n3 w4 w, [$ n( k

  9. 8 i. t1 Y" |# B* u* V: J! Z# G7 m9 E
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
    & ~3 l# Z! k  Y& w3 {5 ]5 a# Z9 L4 S
  11. $ E  d6 H* Q8 }: m0 Z. z% ^
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
    6 y0 p6 D  R; h' j
  13. ' L6 `) g& k8 m5 O( U% U  \0 `" m
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
    6 {3 x4 Y2 z1 X% c& G& i! ^

  15. " `$ {. J1 ]+ w- v
  16. ) _. ]# {; [7 T

  17. 2 z; D7 v0 W1 ]5 B* U1 X( ?
  18. GPIO_Init(GPIOA,&gpio_init_structure);8 s6 l' i3 K/ t- G( i1 M

  19. 6 F; O- t, \/ V7 T# H  k
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位
    8 Z5 `6 q" X8 S4 }  z
  2. 0 I4 U7 s- E" I9 c+ H
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
    1 b; p4 ^7 c" `4 ~- u

  4. - F( u6 ?0 w; t8 p; @2 D* [) b7 N
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
    ) {# M! L, i/ Q; _" h# H0 G* M; D: l7 G
  6. % c* N/ f9 H* N# ?4 H9 M$ s* p, x
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
    ' O! ?) s* v2 N6 k3 H( n% @

  8. 7 U' c2 _8 Z& @$ Y# K
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)1 h0 g9 v( j# r7 p) Y$ c" t; y4 a

  10.   f% W% D# ^/ Y" d
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

- h& x6 v" \4 s" Z9 `8 I$ m: t上面是相应的读取和写入函数,看函数名就可以理解此函数的功能+ s( ^" M$ A) U, P
' D+ p# G  p, P& j% N5 ?
  1. int main(void)
    0 k' m- E; m% F& y' V
  2. {
    0 {. y. z% m+ q2 i
  3.         //0 \' ~' {/ U5 v1 X  e
  4.         unsigned long i;
    + `7 z$ y. v- L4 m1 c" C
  5.   z* E# ?/ Y4 N2 Y1 R& Y) H

  6. / L) g4 c- z# G* C4 |! }% T
  7.         //% M1 K" S2 f( X& }
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟( j  w6 t+ t' q7 w- V; y
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口
    ' \# h7 S, j: T
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式
    " w1 D$ e2 @9 K5 \( x9 P" ]) X
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出
    . h" C% D" Q) Z  \- R# X
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    ! A1 g6 A* c1 X' e2 i0 x$ Q% u
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式
    ; f5 c+ O* n" `( n6 N) ^
  14. ! i- J5 A5 N) u1 N9 `+ E0 B
  15.         i = 2000000;
    / J) ]* p' n0 Z
  16.         //
    ( b8 C4 k# f% G3 M6 k% b
  17.         while(1)
    7 n4 q% b5 O2 m  @5 ~2 ~4 Y+ k
  18.         {) G2 D: R. J- ~/ _" p( t
  19.                 //
    ; B8 t* \: e( k2 M0 n
  20.                 if(i > 1000000)
    7 q& n* ^8 J/ d8 W
  21.                         GPIOA->BSRR = 1 << 1;" ?0 `+ k* k, Z" ~8 T4 k
  22.                 else
    8 N2 P* ?9 Z8 f
  23.                         GPIOA->BSRR = 1 << 17;
    $ B- e3 D! D' d, h* Z7 d
  24.                 if(i == 0)
    / D8 o$ V0 F  S: ~2 P1 O3 O
  25.                         i = 2000000;
    3 h4 c, W* i* q, x- w$ P6 I
  26.                 else
    1 c- n  B- f; n! B8 J
  27.                         i--;
    ; G. }! |$ F/ x
  28. //               
    3 b: X6 Y9 t0 _! z0 }# p3 z+ |3 u; v
  29.                 //4 J- y* k. a& z
  30.         }
    3 j+ U$ D+ H2 [% b. g4 o' s5 ?
  31.         //* g3 d5 h+ u# V3 _5 A( q
  32. }
复制代码
  1. void I2C_MyInit(void)
    0 |. o7 n6 U2 G6 P% |
  2. {2 R' j8 B1 i5 \/ D% q$ r
  3.           GPIO_InitTypeDef   GPIO_InitStructA;: n" V) l9 i6 T- v: [- v
  4. & B. p" h( @' @
  5.         # l# a4 @" ^5 i) J% O( A
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    1 B4 {! R; ^3 |0 }1 L
  7. - n: i8 X" _1 X* D
  8. //I2C模拟
    8 a. y: s3 |4 ~, Q4 N/ T3 D1 w/ ]
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;4 W% G& g- R" i/ G+ _7 y! h& p
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    + M& e- Q& S$ q  ~/ B5 ?2 L
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)4 \! W# L; `) {7 \
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        4 @# C% F, k  b2 J' p
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    - W7 [; F1 \- |, k- ~
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高1 {- w+ I, U4 ]- X" T
  15. }- m0 R0 H) m7 K  M
  16. void SDA_IN(void): _$ ^. t4 Q( |! |4 `
  17. {
    % n$ O4 @( z+ k0 j& N/ R9 I% p8 Y
  18.           GPIO_InitTypeDef   GPIO_InitStructA;
    # f5 w" [4 J' X$ K) t" s

  19. 2 ~7 z& d0 R) e
  20.         0 Y: D: W+ ^: h) |
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    ! L  j. {  ]  e5 r! h

  22. 2 D& T3 t5 p0 ^1 t2 P! H9 e8 Z
  23. //I2C模拟
    , U  u7 R; v  E0 E
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
    9 D% F  Z+ _- X: ?% @9 _4 o5 ]
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    ! r& M1 L. h. ~" K- t
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    ' Q6 h& z) Q2 T& F( i$ E3 K. o' ]
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);; e: Y  a7 T& H8 ~+ |. _
  28. }! n8 C# }& a0 b% K2 }- w& t! b
  29. ! z- I, c. O& y. I- f; N+ t
  30. void SDA_OUT(void)/ F$ J& _$ K/ w" l! o
  31. {
    * J* ]3 f" F5 _0 x/ O
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    & ^# U7 V3 J9 K$ c
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    - u* N; ~+ E( F; W8 g: a& b' J
  34. * j& S. X* C3 f; G8 b
  35. //I2C模拟
    0 Y; W: W# l% ]& q. [, J
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;6 L1 G9 K! u9 A+ C
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟( R; c- w) U2 g4 ~7 w, ^
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)' a, A; f5 ?' q$ ~- N" j; Z0 k. |  g
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    ; j+ c) U' @/ X8 ?
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    ) ?  I0 V0 B# |9 @$ q1 h
  41. : t6 h! g/ `1 t8 {9 J
  42. }
复制代码

) ^% a$ z9 S( I- }8 L( i% T% U. [- |( v: c1 F8 S
8 ?& ^% S( z9 v0 }2 K8 y! H* q8 F
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

相似分享

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