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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口
7 j- o' D# g  E% {5 C* a' M6 d3 t( k) T8 r% S4 T+ ?: h
20201230164444562.png
# ?8 v$ d/ t% ^7 u" @2 F' J
20201230164505622.png

% p/ o  @9 q! h" n. F. E4 m9 j* Q" G  f; h+ Z3 }
介绍:
& |: P; s0 n# C4 m2 {" k. q6 Z& r/ w% b; d) A) L% @9 A
4 个 32 位 配 置 寄 存 器
0 \, d1 d! i0 {, U
* Q+ {: ]5 F* O  l- Q4 vGPIOx_MODER:模式配置寄存器! l3 d) B4 M0 k& W

0 _$ u9 h1 _1 cGPIOx_OTYPER:输出模式配置寄存器, b- H$ Z% o! T, h6 Z3 b- t

- }9 q9 c' W3 b: P' ZGPIOx_OSPEEDR:输出速度寄存器
, C" ]1 Y' ~& o* f6 ~7 t2 d6 g4 c/ R' d# \# U. H
GPIOx_PUPDR:上拉下拉选择
! v3 T, I+ O: P( a# r( p2 L1 _- U( w# B
2 个 32 位数据寄存器" j" t. F/ V) P% ~1 F
6 c+ u1 i) A9 n+ L3 [# P- {
GPIOx_IDR:输入寄存器
3 D% {$ `' |8 \5 q5 i1 Q, W' y1 t8 f& T
) _1 z5 g7 G- a: Q5 h- M/ A0 SGPIOx_ODR:输出寄存器5 [: X# E& p1 [- @; Y9 _

$ }; v7 ]! A+ ^; d# i# }7 D1 个32 位置位 / 复位寄存器
8 l% K4 l/ h; N# e# U$ ~

* F# F$ t' v# W$ NGPIOx_BSRR8 e2 P& W$ A$ ~( S' H& ^

% s8 e8 G, y  }A和B还含有1个32位锁定寄存器
0 I/ d2 N" \0 Y% o) Q/ ]4 c6 M0 M$ V2 ^* @' r& Y& _
GPIOx_LCKR
/ @% w7 T+ I* J. t) D% j; P2 }7 u1 {4 n
A和B还含有2个32位替代功能寄存器9 h/ U2 s, M4 `* p- k6 C! W  P

# }* K, c: j; S8 T% t8 i5 mGPIOx_AFRH :复用功能寄存器+ F! k: A' p1 i" g, E

& V" Q; {0 @" y& K' i3 B" BGPIOx_AFRL :复用功能寄存器# z8 f3 p% A. F  R- U+ i

7 c. |2 g) i( U/ p5 U4 F- P/ kGPIO口可以配置成如下模式:
4 D  u6 d3 v' d# ]% ?
" ~) a$ J! c! N0 l# u) f● 浮空输入. {6 R! o: M0 J+ b8 ~" x5 E& K

8 K9 f8 q) @* U& B! \2 y1 l$ v● 上拉输入. Q& N& G: F  J& `

( p* F7 r9 ]2 @● 下拉输入* h( C( P5 K3 U3 w$ C
; }( ?8 ?) x8 ]9 f# c" c
● 模拟输入
( J  b8 ^" H% c! h0 i5 C
4 l8 P5 \0 {  s( V% L* Y2 O● 具有上拉或下拉能力的开漏输出, @0 y$ c; ~0 @

1 s! H# J8 b' @7 g* }" I% B● 具有上拉或下拉能力的推挽输出
1 c4 X- s! n* w( K5 U1 M- Y
3 l0 i/ {' c8 ^$ k, b  w6 Z' K● 复用功能且具有上拉或下拉能力的推挽输出
' F4 g, Z! m: m& s( D$ ]# z8 L! y# C/ x" D
● 复用功能且具有上拉或下拉能力的开漏输出
; o- @/ h* F5 H: h
/ q! ?' W9 e% z: T. u9 r4 R* V/ q9 Z注意事项:5 M. t9 u! d. t& B" S' V
- }3 J4 a5 t* {# L
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式/ S! ^; v: @% Y8 Y

2 }/ V+ z2 _2 K2 c* }2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位5 Y, ^" p1 K; W8 Q/ ]+ h2 L- B9 ^

: N6 C8 a; l* g8 s. vBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。$ N  V2 x5 S; B$ @
, l2 `& q, T" f4 b* h/ _+ w
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
7 l7 Y. w6 p; n" ]1 ^! m* a! B6 c- G$ F) J, K) Y% v. f7 T
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
5 ]% l$ z% t5 C2 X' Z$ u5 H' P$ i4 M; K) [
配置过程:# {, i7 N" y7 [2 R  [6 S) a
' r% b4 u7 D! w7 O
  1. void GPIOConfigure( void ): L. f3 a5 E/ c; Z, F
  2. 6 y: R' o" M. G& l4 c
  3. {3 r$ @: \6 O- |; J  u
  4. GPIO_InitTypeDef gpio_init_structure;
    $ o/ X- }& `0 S* s/ `

  5. 1 M' N) |. F3 v1 w& _* `* J
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
    ' @+ [  n, ?2 O$ K

  7. & G9 M. {/ M' G0 K3 t% H2 n, {+ ^
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度/ u7 W  T; G3 E- M+ y% D2 e; G$ p

  9. 8 i; z+ Y# X+ V* @5 r% T$ N1 v
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
    * r# A$ e! t/ G8 w6 a% v

  11. 2 e+ \5 w3 b" L5 c. a  E* M
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出" g5 E3 {# f# F: K7 ]2 A2 Y
  13. 0 m: r7 T( p- M5 n) U
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出; ~$ \, S; `8 _$ Z0 x6 C7 Z
  15. * s. \, Z5 |/ X

  16. $ d! J) ~  ?6 P+ y; k0 _
  17. ! u; g$ p- P0 c9 W6 B
  18. GPIO_Init(GPIOA,&gpio_init_structure);' K: ^7 Q$ l% z  D& V
  19. % y$ V) s" r9 w" \) C9 g
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位' j) M7 A9 X2 D. ?/ R+ e) O

  2. ( d. ^+ F2 W2 B2 P! r5 l- g3 p# i4 }2 C
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位* q3 V, z$ \* G  D, o
  4. + x) h1 K2 u, ~. {+ u, v, k
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
    / v' z) ^9 a: l' v. W" C# C6 z& x0 L
  6. 4 Q3 F3 D5 K' b* j/ e
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
    - [% A7 A. B- ?

  8. 7 [9 x) C- u8 ~% F  `& a
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)
    & A3 _6 k& V# ]% x, @

  10. ) P8 h/ `7 i4 `
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

. d" u: X/ x7 |8 N3 @1 p+ A上面是相应的读取和写入函数,看函数名就可以理解此函数的功能: C: V0 Q! ]2 Q

9 ]6 Q' Q, Z4 k
  1. int main(void)1 J1 a8 \: L) d% C0 ?
  2. {. A. v3 f- P+ [! J
  3.         //9 _! @! M# P* A8 c
  4.         unsigned long i;
    % d) P  c/ n4 H% N

  5. - X0 z. H# ]5 D8 e. s5 Z

  6. ) R! N  `' T& j  x! h
  7.         //
    ) S& `$ m7 n: |' r
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟
    . s, R$ u" N) ~4 b  j
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口0 L& _3 b: Z  r0 l& W. F& N3 F4 |
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式
    + ~% Z# g$ ~8 x. Q5 y! i" W
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出
    ! i; m" x* x  h& [
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    3 A6 M. T8 T( q9 g) n- J
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式
    8 n; [$ V4 N, |) i0 l# ^1 ^) b
  14. 2 F+ k* G) ]% T8 ^! l) l
  15.         i = 2000000;9 f% Y: h- H9 G# U6 {* p+ v/ M
  16.         //3 ^1 Z5 b2 T7 {
  17.         while(1)! q- u( G  \. }9 h0 L/ I- Q
  18.         {& H4 }3 `/ P3 G: I4 I$ e) F/ V
  19.                 //" D. M1 Z$ i' ]" j
  20.                 if(i > 1000000)( L" u: B7 O/ X& q1 p2 [
  21.                         GPIOA->BSRR = 1 << 1;
    + v, \6 Y. T% y5 G3 H0 h2 t
  22.                 else
    4 s6 U# }6 E( M, T3 _' m
  23.                         GPIOA->BSRR = 1 << 17;
    # J8 K, h1 t3 I6 o3 j4 Y
  24.                 if(i == 0)4 l! S' I3 q7 u1 m
  25.                         i = 2000000;5 {/ H/ }1 z* ^2 W; q4 I
  26.                 else" }) V# W3 ~7 d" f
  27.                         i--;6 e4 T0 {$ \# S5 h* ~4 L, P
  28. //               5 ]; @" D; Y: J+ J
  29.                 //3 ?; H: d( I6 K. W' z' B9 d+ k) p
  30.         }
    0 K+ Q/ }7 j" s+ M' v
  31.         //
    * N/ r5 }; w/ s  [& E! f& l
  32. }
复制代码
  1. void I2C_MyInit(void)
    1 E( s5 \& ~' d! J. D
  2. {
    % S+ A0 n  [# i
  3.           GPIO_InitTypeDef   GPIO_InitStructA;- I! t$ S& C- P' M/ z) |
  4. 9 V! e9 g0 {) L1 c! M8 r3 A
  5.         / s9 y/ C0 _/ r
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  5 \) Q3 T4 u8 R4 C2 u
  7. 7 y( R* M, l" d1 m! Z. C# e3 \
  8. //I2C模拟
    . a3 p- N# `/ z: D" r" K
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;  I3 v) N# l/ J8 v$ r; b+ r
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    7 M# q- o- f; G: s& ?
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)1 ?7 L$ ^7 H3 n0 E4 R: [3 W3 L8 e
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        - @) b) _0 p- z$ Q) r0 P! y, D  Q
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    ' v7 S, e4 j+ }& u9 \* l
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高% M" F- {* u3 O$ m2 W# P8 U) r
  15. }: n* Q' f' t$ z' x, _
  16. void SDA_IN(void)
    * R& i9 X8 _) A$ h7 d# `; g& @
  17. {
    5 R; l3 n( }& j0 k5 Y
  18.           GPIO_InitTypeDef   GPIO_InitStructA;" M* A& T$ r% N. n! U5 I

  19. 0 L& k; e6 r7 ?" k- v
  20.         3 ^, B! H" Y1 z9 f4 c+ f; t
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  ! Y' M# `% l/ e, X& H4 m
  22. 5 {7 C2 i" J  Z
  23. //I2C模拟
    ! W7 ?8 U! z5 T* l+ S
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;: ?7 S, j# |% D  ]# ]. i& x) w5 `( G
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    + ^, P6 H- |+ G4 ]* b" m
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)' ?$ P! j! ^4 p: }3 h( P
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    7 Q$ L5 g  X4 z
  28. }; G) [, _) @, |+ m) ]

  29. + X! v; k4 }+ T: [% D' k, Q
  30. void SDA_OUT(void)! q/ Q* R, N: g8 q8 U# n: S
  31. {
    ' v  c6 b2 d+ X9 K' T) o
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    5 z! B! c+ B) a0 @2 f/ [+ Z
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  9 {( V6 A- d1 v4 K1 g# u, Q
  34. $ }" o8 k# u5 m7 N- @
  35. //I2C模拟$ U' Z+ |! G) P% K: l( s) f
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
    9 j% z- {/ v8 f7 T8 V) T. d( W  P6 Y
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟% L, V: p$ z' u+ U
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    * _: }- R$ q; l% R7 D
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    3 ]* o2 @# ~4 C, ^
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);3 I- F+ O* x) L; z

  41. * Y, n2 T. L* d3 }2 z6 b/ m! y
  42. }
复制代码
- j' T% j. W. H& `! b+ X

( q$ U  A% K4 w/ ?( E
1 n/ O7 f% T9 U* c- {! y* n; U5 T
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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