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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口
- J( F  y( n% Q& j  C0 {$ Z
- n) B- o& C+ A7 o& d2 L
20201230164444562.png

) \- e: i% O# f6 w' E
20201230164505622.png
* {* G% S; M/ k$ ~% y6 q: t7 O

. A( w8 {( a0 v+ n介绍:! b4 {- Z( p5 {

) y, s: t7 X3 r4 个 32 位 配 置 寄 存 器
) \0 v& p* Z! g, s0 g2 ^0 ^& K8 z1 ?4 ~+ D5 W* J* Q
GPIOx_MODER:模式配置寄存器
3 @# Y1 K8 F& F. E4 E) K
$ E* L+ z/ W1 m" E* h7 Y; Z) ^GPIOx_OTYPER:输出模式配置寄存器
- z% r+ @" ~9 V
) B. @, W& N" SGPIOx_OSPEEDR:输出速度寄存器5 x; I  H& O7 Y& v- r! w, J
& z# B4 l, |  p- h
GPIOx_PUPDR:上拉下拉选择, j: h( g- R0 A1 D/ k- _8 d
5 `# S; k: e' N7 i" M4 h: o
2 个 32 位数据寄存器) l. z6 Z: i* I7 Y
+ y( x$ ^/ D$ f
GPIOx_IDR:输入寄存器
9 [4 v% s; {- I% E: w$ ?6 h$ l0 d3 E6 Z! O& o
GPIOx_ODR:输出寄存器
) v" J( {: ]& C; V7 w% ?, A8 Q" w; h/ T: S2 j- i
1 个32 位置位 / 复位寄存器

3 W- |. C- D5 d; s
/ i3 ^9 e1 r% X4 PGPIOx_BSRR
( B3 k/ u" S- q! Q# B# C; D& j( D
# J1 d4 F6 u0 p& m6 sA和B还含有1个32位锁定寄存器, M/ Y# W7 W/ K+ p2 C! Q6 m

! ]! v1 x& `. A. q) E/ @  f; hGPIOx_LCKR& ]! G  c& W6 q' T

1 Z' I( O! Y2 J1 O+ q+ sA和B还含有2个32位替代功能寄存器
5 S! x. c+ ]7 H5 B
. }9 A: Q3 ?4 O6 J: U# f* @; HGPIOx_AFRH :复用功能寄存器+ h" q8 I. L3 [2 c1 ^' C0 |
4 J& C. i9 Y- l/ h4 C. b
GPIOx_AFRL :复用功能寄存器7 H) Z; V; ~9 M) g+ w
5 V9 K! z- ]! h( o; I
GPIO口可以配置成如下模式:
: G( G0 Z% H, m- R6 H  M
# |' m' ]6 ?% t1 I● 浮空输入
. ^( R# E: M9 x# E+ U+ b6 x( a
4 w6 p4 o  q" J- ~● 上拉输入
  _) l& ^. v! G3 T- @( P
( s# a; h" S# J1 o# v● 下拉输入
! v2 o9 z* K0 t. z3 U& }3 |% n6 `5 h; M) W% h: U
● 模拟输入
6 f8 y2 ^; }: n
+ t$ B" h0 I+ ^2 M( L4 i1 Q& T● 具有上拉或下拉能力的开漏输出3 T  Q/ r5 c' h2 `. A

+ `& X- ^' x8 ^● 具有上拉或下拉能力的推挽输出" p, _) K; C) T' ?6 Z7 {

) @& G$ K# S. c/ d- f● 复用功能且具有上拉或下拉能力的推挽输出
0 j8 y8 t' g+ q- [/ ~5 g7 I) y
* I- A& v7 O- E* I' Z! _5 l8 E● 复用功能且具有上拉或下拉能力的开漏输出
/ |: \# t) v/ X- N5 i1 G* l% n. E) @; o5 F& T
注意事项:
( L2 R7 P1 B3 T' N$ B$ Y& @
0 I+ o# C. O1 X; i) F4 l3 O5 R1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式, [, ~* W* x$ S. G8 P

2 l* @. k, a( D8 [. r7 c2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位  d6 }9 E2 ?6 j/ ?  d4 n4 p
4 t2 F3 A- \- l2 B) r
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。
( P; W7 {9 v; t7 P" A! z' I; o4 A& E# Y3 c5 X  N+ h+ A
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
! }# ^, P6 W/ i2 k
2 W6 m' ~8 t( [- g- W: R" K寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
0 [! B0 d. d6 a$ f( Z5 h+ C: d5 ]! N8 f1 g8 e
配置过程:
, E! l' j8 X) m% `( ]7 Q
& H: ^& q% p8 n. {  x& o
  1. void GPIOConfigure( void )
    ! C) {+ T4 h: ~( w; L5 T
  2. * I; f7 y0 J5 g$ o/ c) ~
  3. {+ G; Z/ P$ H/ a9 O5 `3 j
  4. GPIO_InitTypeDef gpio_init_structure;
    5 P2 w  J2 M' N4 _

  5. ; j2 [' t* S( e
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
    : o3 [. p+ C) _) K* o* V

  7. ! h+ f3 V0 k0 D: W% o6 E
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
    ) Y7 Q& @. P" R2 ?& K

  9. 2 o+ I, z8 Y5 i9 v; |
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
    & p0 D8 N9 {. Q) u9 q  ^5 ~3 N

  11. ) U* p5 [# a8 `4 N/ m
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出& r- l- Y0 h" i; Z3 T

  13.   {, S+ H6 x6 s( l4 @+ w2 s7 w6 D
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出! i, D& _$ p' R5 M2 O0 g. B2 f
  15. ( u4 g2 U; @$ C% Q9 u
  16. ! x- n0 e8 a3 m7 B% T( K( d  M# E

  17. ( W8 U4 J4 f' Y( Y6 v
  18. GPIO_Init(GPIOA,&gpio_init_structure);8 L. Y1 X" T: m4 e' C5 V
  19. 3 a* Q$ L9 H  {- b& d
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位# f% @" D  A1 n5 M& r! U$ S
  2. ; K  ^- M+ R' x) o( G: n, A# t/ u# {
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
    8 Y4 s8 d& A5 V2 r- W  m
  4. ! C1 z3 {0 W( g
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)- |- i6 M0 x+ {# r" F

  6. 4 a$ m  V9 W) Y# g7 i; M
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)' @/ a: k* [1 M$ k# `# y
  8. 8 E4 m* Z! d3 [; `+ l4 d* p
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)$ V4 R) ~6 V9 B* q
  10. 0 X. t5 f4 x$ j1 x. ]9 N
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

9 o3 t0 o4 l% W$ A4 ]/ m' t上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
6 O& l4 D8 I( _/ ?* i2 ~& `3 {' ^5 R5 x
  1. int main(void)
    0 D' ~+ U. s; F7 {
  2. {
    * C" R. S* q3 c* |' Y( u; ~# Q
  3.         //2 \/ ?1 q: U7 t0 I
  4.         unsigned long i;
    + G( a- U1 z: L" A3 @# ~; {

  5. 9 r# H( }/ _& x' I. r* S) K

  6. ( Z5 O5 Q) e3 L1 t' v  h* a
  7.         //
    " L" i" W3 Y6 v& l% Q- p
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟
    4 D9 S' O* j$ Y9 [
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口
    ) m; u# E+ w3 e# U
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式+ e, D/ O- Q0 C, m
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出" `, c& x2 [7 |5 O: _1 }# V1 P
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    - y4 }0 X0 T- Z; A+ S: `8 N: \
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式0 m0 Z; M" U) m' z! L" H$ J& ^
  14. 6 k9 C- \; P8 R- W9 S3 z2 y
  15.         i = 2000000;2 {* l! c+ P, t) Q
  16.         //
    + A" J9 Z. w, ~. n9 R
  17.         while(1); E4 d4 f: ~" m8 c/ F& w3 u
  18.         {7 P& D+ k- V% B! W: o7 |$ e
  19.                 //( _3 m& J+ w$ @0 s8 q3 s
  20.                 if(i > 1000000)
    / L& f4 ^, X) O% J% g
  21.                         GPIOA->BSRR = 1 << 1;$ y( e8 `7 s, W' J. [8 R( K
  22.                 else5 L2 h' Y1 S& R  ~5 ^6 R# c$ C
  23.                         GPIOA->BSRR = 1 << 17;2 L6 }' S: A3 f$ B7 a" A; S( E7 A
  24.                 if(i == 0)
    ) Q- N/ [4 m3 j/ {# @/ [, `7 K' J
  25.                         i = 2000000;
      \: G  v% a* h
  26.                 else; _. O. }( @( G
  27.                         i--;
    9 d% [3 O* _  ~) d
  28. //               
    $ k# Q! r! E& a% p) V7 k9 G
  29.                 //8 _6 L5 Y( A" g
  30.         }/ w1 d# a" v5 C8 c& Z- Z. E
  31.         //) O/ z' d  G! R9 G" h' g% F, S
  32. }
复制代码
  1. void I2C_MyInit(void), {  a. s9 `/ r, e' ~  s- [: l
  2. {* L( M+ o% ]3 v- N4 S
  3.           GPIO_InitTypeDef   GPIO_InitStructA;, V+ R5 A8 V$ j1 ?. X1 ]; K$ D

  4. - j0 _: u& ]4 k7 O6 R
  5.         
    - [' \1 a, |6 w
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  " N1 y) q- x0 }( |4 a
  7. ) d# C. Q/ O- k# ~+ e+ b/ y( X
  8. //I2C模拟
    ! g* `% i  E7 ?
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;
    4 J3 @/ u% y9 ?* B8 ?
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    " X& W2 L! f) a$ t3 i( @
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)! d, V! h. t/ h
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    8 J$ j4 H+ v/ `4 Y( ~: O/ F
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    6 j" j- f8 ]2 c  N1 i
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高$ ^7 T& h/ V; ]/ u- e
  15. }
    4 g9 c% h& A! j
  16. void SDA_IN(void)8 L+ I# J# m9 l3 Q" ]) W0 j, I: a
  17. {
      J1 y/ L: \) C0 s9 o* n5 h
  18.           GPIO_InitTypeDef   GPIO_InitStructA;6 d& }. j; U0 S: s# N( \0 [3 y
  19. 8 d7 G7 z7 l! E+ G- I6 `' }  V. V4 |/ T
  20.         
    6 k( Y" m- s1 I
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    6 H2 T: B  v" a) u: c

  22. 4 S  q/ W! t- ^; ~' p
  23. //I2C模拟
    7 a- }# x% [5 G% D- i8 \2 V
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;+ S. y5 p3 S. {8 X1 S
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟5 k! ?. |  _$ U# R
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    8 i2 i. \* Y' f' G* A
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    % t1 y) X- {) T3 a, K. T7 U
  28. }! I5 d/ L* k  z+ G4 I1 d

  29. 0 I0 T) i& p6 E
  30. void SDA_OUT(void)
    : B0 l5 S: A; N* {9 c
  31. {* E0 R, U( B$ _
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    ( ~2 @: H( A! {" [! x
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  3 m4 S4 H* s/ Z
  34. " j' {8 n5 O1 q; Q
  35. //I2C模拟
    + Y0 A7 s; w% Y7 K1 ]. T
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;* y  O6 I/ p) z8 s: L
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    - e# V% A+ w! g2 C6 S
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉): t" c+ X2 s/ A: D, `4 {+ Q
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        ! ^, c' w, R; Z: ^" q
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    , t% j. o( |. Q% ]

  41. 5 Z; K/ g- C8 ?7 G+ q+ m
  42. }
复制代码

3 d8 U. }" L# F' H) C3 s0 q4 v4 ^$ I! a; F# x- C
3 G5 D3 S6 p3 [3 T2 k* o) c
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

相似分享

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