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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口9 e& }# s. k8 S9 @) q+ E+ U

5 x- D; k& I" M7 j0 j
20201230164444562.png
7 a5 L5 U, M( [2 \1 H# T
20201230164505622.png
* @& W3 k2 B; N' y' d/ w- ?$ q

$ H( p" n) [% b) ?! u, h介绍:
9 L+ O& V5 {) g% V; m5 e2 x) A# n$ y6 v4 D9 I) x
4 个 32 位 配 置 寄 存 器
$ h2 s& ^) V  n  K" j2 Y2 H  j0 J" a/ w: I( u
GPIOx_MODER:模式配置寄存器/ C# O' }/ _, H% v5 e

1 v' k% L# [6 U; u3 Y4 J" E: k2 bGPIOx_OTYPER:输出模式配置寄存器
6 m8 h8 v: b, \% `6 C, ~6 N. W8 W- @, ^+ d: e7 ?# N
GPIOx_OSPEEDR:输出速度寄存器
4 g6 V0 Y' N" W' [% l; K9 g; ~. M' O! `! O4 ^% R6 i
GPIOx_PUPDR:上拉下拉选择' o9 B; k4 I9 b- Y8 Y
' F8 L& _9 _$ [
2 个 32 位数据寄存器
' S/ I/ P& E  s0 ~# p* K5 P9 g* {
7 z0 j: a6 n" ]/ P# bGPIOx_IDR:输入寄存器' r) `5 B8 B& u8 u4 J

( Z: ~) |& t$ uGPIOx_ODR:输出寄存器
; v8 Z3 X. z% _& O( @* l0 x# B$ f+ I; q2 E
1 个32 位置位 / 复位寄存器
1 g- C5 b. V* m5 v! n- z" `( q3 R

5 A. T, q: g; e/ `GPIOx_BSRR
; I3 N8 l0 E' a! [
9 v5 E8 z9 H: {3 I, R/ T1 a3 LA和B还含有1个32位锁定寄存器& B# w# P1 {% h! E
2 i" d& }( Q7 |' j; @
GPIOx_LCKR- j; y2 D+ q2 \5 _
9 {% d6 N! b- u# J$ G: d
A和B还含有2个32位替代功能寄存器: y4 Z: @: ]+ U" ^- Y1 N
6 E9 G4 n4 j, n7 w
GPIOx_AFRH :复用功能寄存器
' E3 S" M3 i3 J' Y- \! B7 i$ N1 V! S5 P* @7 `) |; x& F
GPIOx_AFRL :复用功能寄存器2 F3 m; {$ }! k1 H
& ?' J. y4 v6 G: g
GPIO口可以配置成如下模式:
# \2 M/ E+ {3 A2 b
( B( G4 _1 P* ^6 B0 U. ~● 浮空输入
7 w' v7 w* B. p' [% o0 w/ \
7 F0 m% w8 _  Z* M5 h/ A/ e● 上拉输入7 `3 _6 C$ T3 [+ Z. X' s& z) x+ x
4 r8 s* e3 p' h6 \, o
● 下拉输入
3 I8 p$ |. W0 X0 n5 ^# u! k8 J
8 r7 X) l5 B5 o" J; b: ]● 模拟输入
1 y% c2 k6 h/ l- t
- B, r. n2 c" }, m+ J5 T  t% a7 C● 具有上拉或下拉能力的开漏输出# [4 ^, V0 s/ d7 E9 g/ X3 {
7 }' b! ]8 R( m- a
● 具有上拉或下拉能力的推挽输出
+ j$ h" s5 P7 S& x) \8 f% n0 S  x: I6 z, M& a4 K
● 复用功能且具有上拉或下拉能力的推挽输出
$ Z8 N3 r8 V! F. V
5 F8 S4 x( k, C● 复用功能且具有上拉或下拉能力的开漏输出" w( y, ]* [: c5 B6 H  {: @

% m, l2 u4 J" j  N8 C注意事项:$ y9 |, t( c( l

  X0 o: J+ z# C+ V; C1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
/ G1 v- i1 D9 ?% C1 l9 P, ]. e' Y8 ]$ O3 v* p  c* G
2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位1 n$ k: N# u4 @

* a/ K! J5 x. a! ?' b8 @, P  N8 [# XBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。
, F$ \# r" I$ ~8 X  Z+ L  e9 M
9 F' {$ P; w3 U/ v! M" s0 i1 w3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个+ x' P/ j( j' D: e# U6 X4 i
. [1 F8 L! }1 P; e
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
* o& L. X& t8 S4 h* \
# Q, e2 G( t* a; K9 U3 V# p配置过程:, S5 [0 t3 a! Y# }5 @

9 W) A+ G9 q! J3 O% F' ^
  1. void GPIOConfigure( void )
    + C7 D, u& m6 O2 F
  2. 7 [' ^6 w4 ^" u
  3. {
    1 O$ `3 H5 \6 ~$ K9 c
  4. GPIO_InitTypeDef gpio_init_structure;( [6 _' f9 v& {0 q
  5. # d7 A0 C, g' L% D1 A
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式& e. E1 Q8 e1 V3 a6 m. A9 b
  7. 2 J" V- H" Q) k3 D( I, y9 v/ w
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度# f  I0 w- S" v! M$ j- y) B

  9. / u. u7 e5 |: o/ I& _% k
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚" I) B( A3 x$ s! @7 G! a
  11. 5 j; S/ V4 A, f- [# _" ?
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
    6 j7 g, F% o/ y0 A3 q: l
  13. 2 V4 r7 C1 w0 |1 m2 c% z: }
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出# `  S! E, q' ?! n" J
  15. 5 Q5 D/ p( N' o  }# s# N) m' w

  16. 7 G$ O9 G9 `( ?
  17. - r8 k" s/ u$ Y
  18. GPIO_Init(GPIOA,&gpio_init_structure);
    . J3 m; P" S. J7 k5 j' Z

  19. # e6 A. v: t+ n: U$ u$ ?; y8 [
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位
    ) K) n& q; P5 `
  2. * m3 F% q% c8 d& h
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位+ r( z) X- t# \; ~2 K5 Z( d

  4. * U5 N( p, D8 h7 u9 C
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)1 {. G( }0 _+ h7 B3 h

  6. * }! F" j3 @+ |  r2 J4 e3 _+ n
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)' q3 I" l. G2 h; X7 l

  8. & Z4 h# P% b! y. f5 \6 |
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)/ v1 o6 G# y3 k/ J" m* v
  10. 3 S6 [& o; z9 e0 E
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

0 s, L8 M9 }/ \' j3 r- w上面是相应的读取和写入函数,看函数名就可以理解此函数的功能3 i: ]' f$ Z! P) J+ _) M. Q9 }: y

1 a$ U- P. A& {
  1. int main(void)
    - l8 P3 K+ e, k; ^3 g/ f. J" ]3 @
  2. {
    & @0 @1 p# t; v! {( t2 Z
  3.         //
    7 N" w! i' d4 |/ j0 }
  4.         unsigned long i;
    # d: ?8 _2 v! H$ Z- y) R
  5. 0 l7 E) o2 p  ~6 i9 y0 T
  6. ! c) V4 E3 m& Y5 E: L
  7.         //
    ) R/ u- N: x$ a* L, u
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟
    ( J' C# ~/ i# W1 x
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口# A1 o9 U! Z6 T1 j
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式. C  ?) S' G7 N( W. ]5 [
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出
    ' h, U. y+ C. K' Z4 B  \' r6 K7 i
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    - Y( k; ?: x3 N0 u( r2 `# I' Y& \$ {" s
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式
    2 o0 W! L" y0 W  Q

  14. % l, Y4 O4 ?: p+ r
  15.         i = 2000000;
    6 x1 P8 T7 f6 V' a2 _# |% e& ^0 o# I
  16.         //3 s" I) x( ?2 I) L2 q1 H
  17.         while(1)
    ( c# \/ F4 ^. e! ^5 V
  18.         {
    ' N8 ?7 Z) U6 }: }5 d8 c& x
  19.                 //
    8 z. I2 u' @8 J
  20.                 if(i > 1000000)0 g. f4 W& l' N) e3 W4 G0 @
  21.                         GPIOA->BSRR = 1 << 1;' s/ `5 ~7 d- a
  22.                 else
    / u. l. p$ S& e/ J# h' K
  23.                         GPIOA->BSRR = 1 << 17;3 m7 y% B' Q' G: A
  24.                 if(i == 0)
    7 B: w; {) }& T$ W
  25.                         i = 2000000;# ]/ n: r9 `* Z3 q
  26.                 else
    ; j/ q8 Y) \: U6 h2 @
  27.                         i--;
    0 d# v; B  x8 d. d  ]
  28. //               
    9 a/ H& m( D) i. E/ w3 `* I
  29.                 //" f9 o. M, Q. S$ k1 p8 ^
  30.         }# c3 Z# v8 e" z# b, {% N
  31.         //) ?3 I2 ~% C7 i2 P2 W
  32. }
复制代码
  1. void I2C_MyInit(void)
    % g) D5 E  \$ T* d
  2. {
    * V& e3 _6 U1 A/ e: H, O
  3.           GPIO_InitTypeDef   GPIO_InitStructA;
    6 Y3 @) F5 K; o* {( S# Q, N( m% k
  4. # C1 i* f$ V8 t0 L. |7 ~4 P
  5.         
    1 D2 c. _+ b/ v1 |
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    + u3 N5 {+ g# O3 R  t
  7. 9 U& V: s3 _# I+ e, R) n$ g/ B
  8. //I2C模拟
    * T. ~" R! j/ H
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;3 D: v6 s5 ?% m$ R3 Y2 e1 I7 I+ h
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    % {/ ]( {) o5 _3 R8 O! h  k
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    ; {: Z3 f7 R$ L
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    ( u1 j. f& u( t% G( _! H
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    : N( H( q' A% u/ z
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高
    , i5 l1 W" n1 {( k2 C: v7 T
  15. }
    / h- s+ ~1 _$ Y# I5 U. A1 Q
  16. void SDA_IN(void)
    9 h9 m, [2 I+ T( X1 B
  17. {2 c% f& O: }0 t- `' j
  18.           GPIO_InitTypeDef   GPIO_InitStructA;
    ! ]% S4 r7 r7 o2 K" i) J0 w) h

  19. $ J# i' c; b* J2 j3 g% U  O* ^
  20.         ( A' n! \0 s' m1 G
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    + @: N& A5 S; }7 B+ ^
  22. 1 u2 S2 k& [2 J3 P( V- h! r4 |
  23. //I2C模拟& X) u$ B' z* M; m3 G  N& N
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;' Y& z( R) ?! \. O" Y$ E# \( T
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    # F$ U) f% ]  z, u
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    , e: F% C6 n" j7 B8 a  O1 d( U) h
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);- V! J4 l& u& H% A
  28. }
    : N- u- O  g7 j5 e2 M
  29. 1 G% B( T8 ?. e+ B* f! s  S
  30. void SDA_OUT(void)* E- p: r% ]% R
  31. {
    7 }8 J3 G( U: P. G. N: C
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    # e$ {3 N! y' Y9 @; n
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    - K  W4 v- x% L$ f7 ?' x" ^
  34. " c7 u3 `/ g& }  \
  35. //I2C模拟
    3 j, \: y4 q6 h+ l# G# @% n
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;2 v- L7 l/ n9 r
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟6 h5 T* p2 a. a; }6 d- ^- B, t
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)4 j4 c$ @2 s/ O& J3 T& M( ^
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        4 Z1 `4 B4 n! ~! j- W# \) X4 X
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);9 K5 w. X& l' M- e4 W5 F$ p* _

  41. 2 f2 z& s% j% \0 v" P- M! G6 D- ~
  42. }
复制代码

8 W+ R6 E3 Z& `+ ~! E% ?1 C& b0 r. y2 C0 a
! x5 A, ]: q+ ^) ~- N1 d6 @4 X
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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