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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口3 @) P- ~# W0 ~
( G- C4 s/ |9 N& ^2 ?8 `2 Z! P
20201230164444562.png

$ s! \3 |& i8 {3 T5 N
20201230164505622.png

' o6 j6 [4 T: e: x, O
- K9 F) v# f, ?3 [$ ]" V2 V" q* p, u介绍:
! T9 x+ j  q* C0 }: ?" U
- U5 ~0 B: C9 X" t4 个 32 位 配 置 寄 存 器( ?  M' i& y% ~

6 N/ x! g  W0 o; O, x7 ^4 dGPIOx_MODER:模式配置寄存器
1 B8 e6 M3 I$ t6 B( ^# J
+ e8 @' W% J/ i/ @7 aGPIOx_OTYPER:输出模式配置寄存器
6 ~& I& f. {# Z4 }, R- n" V: i' I: l( J: ~9 G5 I& b' P
GPIOx_OSPEEDR:输出速度寄存器/ ?5 y! V" t  E5 p  U

* T7 S) S0 d  M) O$ CGPIOx_PUPDR:上拉下拉选择) W! ?3 d& l. @+ @6 [: N) s

8 R4 a# i, M9 q% W: Z0 q2 个 32 位数据寄存器
8 s9 L8 ~  }: C9 e* t0 U7 S# w* |0 z4 ]# G; g4 T/ w
GPIOx_IDR:输入寄存器  R2 F6 ^  V- _6 n! j" M
" m" `& C" l. B# I$ q& S/ u1 I
GPIOx_ODR:输出寄存器
3 w# }2 N) V4 K: i3 _7 l3 d! q
  i: l$ ^2 H: m1 F% f1 个32 位置位 / 复位寄存器
+ @2 h& @8 V: p$ Z7 O9 g5 F

  L* b# p2 p: v# B( E* i/ `6 uGPIOx_BSRR
9 {; \" W! \) Q% i1 y9 O0 W. C' N- y7 d) a3 l
A和B还含有1个32位锁定寄存器
: h2 a4 I/ b3 e* `: X, k: e1 w9 ]9 v1 `! g% _
GPIOx_LCKR
  `0 q$ F, b5 n: Z! S  @8 P/ ]! v" b0 N7 y+ A6 }" y" V% y
A和B还含有2个32位替代功能寄存器3 I; z, Y* X/ G/ A

4 ~: E. y! X- tGPIOx_AFRH :复用功能寄存器/ `4 h/ p2 O% i9 l9 s8 Z
2 ^! O/ S" G$ ]: \9 e
GPIOx_AFRL :复用功能寄存器& B7 f8 e/ x2 Q  p( H( D

' |( D) T  o1 ]% Z! uGPIO口可以配置成如下模式:/ B. T7 F0 G1 _3 q! Y1 o1 \
* X* e4 g" O( j
● 浮空输入
- a; y, v# |6 V' W* C( @7 ^. U; I9 d' b6 n" ?5 _% S
● 上拉输入
- m9 E2 I; g: |+ z  P( i9 a  e+ C# u- {8 `# O9 _% ^9 W- l5 m) j
● 下拉输入9 {3 G- C8 e9 @9 s: n' c9 A& U
. L, i; D9 q( T2 l1 F; m4 ^4 M
● 模拟输入
- l' C' A: B& Z, c
9 R4 P* b6 J0 _# O; I& m- u● 具有上拉或下拉能力的开漏输出4 ~( p0 J- E* A0 o. m/ F
9 z# u, k* L1 L- J
● 具有上拉或下拉能力的推挽输出
$ W* v6 d! w0 M3 G  l
2 J3 ?- B* Q5 t) g/ Y/ q● 复用功能且具有上拉或下拉能力的推挽输出
, I0 }6 T# j  ^4 b3 M+ u
* K, z5 ]6 ?$ `8 K' o8 _● 复用功能且具有上拉或下拉能力的开漏输出6 W0 h7 D1 k# ~3 p7 }8 F
( s1 Y8 q( ^6 R7 j) |5 |
注意事项:5 z( T6 g1 F& G2 L, _

( r5 [, t. w9 D) A4 C1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 _4 I3 v# x+ P/ V; Q  t: u! P7 V: {. R6 K# Y. S; r$ F# l
2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
% P; Z5 y, F. V) B5 W& z8 p2 ~0 q8 G9 s, N) a
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。* k! x7 @9 y6 R/ \4 p/ Z" P8 U4 y
: x- M8 q$ q- z, y6 z( O
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个) _( F) a/ V( g/ S/ h& ?/ q
9 P6 z, e* L' L7 q# T* L
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
/ [' ?& @  x- a4 P2 P/ |0 G; G! }! V) K2 p7 m  R2 P" F( b  ~
配置过程:
  Y2 K( k1 Q) d/ Y' T1 ~- B8 ?6 d6 i5 Z7 O, l' M
  1. void GPIOConfigure( void )
    / ~8 H# E; u  h, p$ O
  2. " p) j* r! U7 D: G
  3. {
    7 d3 b: T2 d2 K. Y9 Z6 i
  4. GPIO_InitTypeDef gpio_init_structure;
    8 ^* U$ L) S/ Q2 {$ W# h  u! O
  5. ' Y3 P, Z5 E& W9 f$ J) S: `
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
    7 u% ~* u$ k1 g: Y. i+ B+ \$ f
  7. ; P1 v) a7 S" V9 v+ L: `6 b
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
    4 U, g6 Z1 m& T# s, W
  9. - D9 y9 T6 _: i  w5 u  b: @
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚- g9 C- P; i1 p# ^$ ]6 Q
  11. 9 c1 h" J- l/ D$ v$ i
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
    $ i8 T0 A$ g* W( U1 \' S6 |9 k

  13.   r" Q* g# u1 v) U: ^8 C
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
    , ]+ p$ U8 R) E. G. Y( \
  15. - ~( Y) G, o' [8 G  h& p8 T  u5 K
  16. 1 u& [5 {0 u8 V. g! }, M1 t- g

  17. $ |- J% R; r: G* L
  18. GPIO_Init(GPIOA,&gpio_init_structure);- ?( {3 v9 E" Z4 R+ y! Z
  19. . F& k# h2 Q3 i' `# b
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位. ~' n- }: V7 i! w

  2. " R$ _1 T/ ~/ i0 R3 o! s
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位( i8 U; k/ a" k4 @  i. \

  4. ' C$ H7 h9 A9 M3 C) m. x
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
    7 E  m& G- H% F8 p6 q6 k! g

  6. 1 e9 b& y9 }; W- L. C  G
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
    ( }' K: q7 H& M$ b2 e3 |; r
  8. 4 X* |6 }% q( A. A3 z
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)7 q& @0 u# T1 L& h$ I' i) K

  10. , q. E! [' X" [4 F
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
/ d% R5 n. L6 O1 w4 |' t' _
上面是相应的读取和写入函数,看函数名就可以理解此函数的功能( j  w- D. S; [# j% W# E

: W2 O4 f7 x/ k5 r8 m
  1. int main(void)
    - b+ L+ \. h- M$ `
  2. {# B. A& \( r5 h: [/ L
  3.         //
    - u$ g9 j9 F3 w
  4.         unsigned long i;
    3 z6 Q1 M. t: Y, P' z5 O) X

  5. - F# M! E5 I! D) G. m* D) n

  6. / g. e, |$ J0 e. r9 C) l7 V& m8 X
  7.         //
    4 m: t6 |& c9 I7 \, o0 e
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟
    7 A+ \; K* G1 C' h
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口. H: C# L, J$ C& K  o
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式
    7 B" \" q, I( o5 G9 w: a
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出
    4 Q! u+ v* e$ {3 K1 A2 F/ r
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉$ W6 x! p. F+ c1 t! ^! Q
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式
    8 P2 C* K1 x0 u! B5 m+ }9 }+ B

  14. 0 v: l) X! M! Z
  15.         i = 2000000;7 L6 J8 J# ^% B& a
  16.         //& {, T7 D; q9 a
  17.         while(1)
    # L% F8 a- X( }" t
  18.         {
    0 n! h+ ?% c5 W& Y
  19.                 //
    & M8 s, ~7 p2 r, N
  20.                 if(i > 1000000)
    6 F" h, }8 g5 n
  21.                         GPIOA->BSRR = 1 << 1;
    2 {7 r' m8 H" X0 h6 _- F$ N/ D1 N
  22.                 else* r7 l. L* h0 X4 H
  23.                         GPIOA->BSRR = 1 << 17;, q- j( W+ \( V$ U; f8 Z
  24.                 if(i == 0)" M, G$ [$ r6 [; W& u7 Z& `" j4 c/ B
  25.                         i = 2000000;2 o5 ^0 x' D( j- B% x9 d
  26.                 else
    7 ?* [: \) e: }3 b0 K# F" l- B( z& K! ^
  27.                         i--;
    , i2 P8 _% u4 n/ o8 p
  28. //               
    7 a* }2 s& W/ \) I, I
  29.                 //- L4 p3 j3 B' X' A1 s' f4 l
  30.         }
    0 n$ Q# o2 m( ?6 b; Q8 X' W6 c
  31.         //
    / ~  m) E3 q. d$ l5 q3 l
  32. }
复制代码
  1. void I2C_MyInit(void)
    7 _1 z: w4 N, P# m
  2. {
    ; o# ~4 S2 {  p( m
  3.           GPIO_InitTypeDef   GPIO_InitStructA;
    $ R; H! R7 ~) C

  4. 5 t) B( _) b2 s
  5.         8 Z* v9 W$ O% O+ w0 A4 b" h
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    * G3 D( n0 N5 g1 _8 x: |

  7. 5 L; S& k! q/ Y- ]
  8. //I2C模拟! z8 t0 e6 q+ k$ B! P1 g" q
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;
    3 }9 ?, e& n2 L' |! n2 t+ c
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    1 N4 \& ]( Z1 V+ m
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    9 y& g/ t5 m4 e1 B
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    ; a/ d% f* F0 O: A" B5 ~
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);1 W8 q5 w' a* o/ j
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高9 ^  O3 H+ d4 y  Y8 |9 N; |
  15. }; j5 W" |8 r. }& \8 t( }) l
  16. void SDA_IN(void)
    1 @3 m( P) f. O4 [! A
  17. {- s" y* u  x' @
  18.           GPIO_InitTypeDef   GPIO_InitStructA;, {/ @1 ?' M9 x8 C# ?! G# c& S
  19. ' _1 b  V+ t6 h6 b6 g: |% e% C0 B
  20.         
    7 K5 Z; ~$ c& @8 j& C# @+ L+ d
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    , w3 k8 `/ ?) i0 v/ e$ J+ ~5 W
  22. , g: A2 B! ?% @$ ^" e/ R
  23. //I2C模拟6 x6 \% Z5 \1 z
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;) t8 d5 M* j" m1 {' i8 l
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    0 c& W9 W5 Y% p; N
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)7 J/ ]9 j* U- ^# c) e2 Q
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    $ f: U+ P; D1 j/ g. j: \# H
  28. }
    & R; }! J# b% I* ~6 U9 V+ U

  29. & y7 e9 t5 ~: P! t' g
  30. void SDA_OUT(void)
    + J9 y  D" C8 u5 X" n
  31. {
    : B- h: W! w% w4 q9 C% g
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
      R: b! i) E; j" G
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    + e" p' w3 N) m8 j# w8 t. C) `4 ?
  34. + e0 U% `5 v: z# P2 n9 \; B
  35. //I2C模拟9 P- m! l0 p4 ^; Q( ], w9 N  u
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
    . I! e5 I8 \' i5 p) q8 Y' J
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟! ~* S, B* N- S! X! q
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)1 r$ p8 T4 M9 `, z' e* n& R
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    ; T- a: |0 l  \9 X: w
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    * g$ @1 I- N! i9 [8 }
  41. 5 `; j8 a: x- v. b, w  B4 Y$ `' ?
  42. }
复制代码
$ L$ v6 V3 D5 w( [
+ k, w* H6 [3 I2 R5 H
# S0 Y0 g% V; I9 W  c" w: j
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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