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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口5 f9 e# Q8 l, j: T5 L" ^  I
- Z8 z- n+ I" o- t2 @
20201230164444562.png
5 Y' W* Z4 W$ @
20201230164505622.png
1 t  {8 H- s9 m% h

9 D) a& V, |, z. f介绍:6 i( H8 K' q$ e7 P

# l$ H5 S* `' f, s% g. j8 ^5 d4 个 32 位 配 置 寄 存 器5 q& D; E! z" U8 h

5 v6 m# u5 K$ h: l# i7 r' dGPIOx_MODER:模式配置寄存器! M  s- M/ p  m  [9 k, x& e

+ d# V0 ~: T% n) B9 SGPIOx_OTYPER:输出模式配置寄存器
" y  \1 C( Q  o# n
- j8 R3 ~/ ^. A& s/ k6 D4 iGPIOx_OSPEEDR:输出速度寄存器7 ^# }- ?( v& k* i7 `0 _9 x  I* {+ _

, g$ x0 h5 N+ N1 `. C& EGPIOx_PUPDR:上拉下拉选择
. w) k8 ~: |) b0 j6 f- r2 ~! c; n  Q) z& D- H$ q+ P5 [$ m
2 个 32 位数据寄存器. v  w) y8 d1 f+ q6 N6 y- V! V/ d
9 ]$ w7 {) ~/ d9 t. z$ h* u
GPIOx_IDR:输入寄存器& g5 `0 Q, z/ b+ F, C- }

) u6 i8 \( u9 T5 n9 p0 F* ]GPIOx_ODR:输出寄存器+ E9 }6 m4 f& R+ V
2 J7 @: c6 \% j: @4 F: S4 U
1 个32 位置位 / 复位寄存器

" O* A2 ~( u/ n" |6 X% d7 r7 [/ Z( P9 p$ e
GPIOx_BSRR
5 {& ~5 C+ I. ]9 p  O( ]% b$ f7 o! P
" N& V" n  S3 h  sA和B还含有1个32位锁定寄存器' ?. {3 f3 a0 g! ^8 D
* i/ S1 u1 g+ T9 q/ V
GPIOx_LCKR3 s& L* j' I" F! F4 T7 n+ y* \; N

* c; F% |6 l* X0 w0 B7 hA和B还含有2个32位替代功能寄存器
( J; l* Y5 R0 F) J, \$ _
5 J  b6 L9 P2 C# a5 ?4 ^GPIOx_AFRH :复用功能寄存器
% s% i+ s& l) t; `/ B+ [, K: Q5 i
6 G7 }9 f0 d+ x$ Q5 _5 L3 {GPIOx_AFRL :复用功能寄存器7 j/ W# b2 h/ b* _0 i' S7 t

" ^; R4 C2 Z- h+ e3 w8 H$ R9 PGPIO口可以配置成如下模式:
. M5 K3 m' h+ a+ l+ ~0 n0 P" n+ h% Z/ P
● 浮空输入
# U0 w4 ?3 a/ y
$ ^" F# e2 E, t# K0 q' [● 上拉输入' F8 U# K" d9 Q- Q2 |- f
4 C8 I8 n* S; p- k4 J$ `. \
● 下拉输入0 G2 F$ O9 e, P

/ @  n8 @7 ^& H, k$ T● 模拟输入
, u0 T6 t& P  g% z  t9 Q7 x
3 w/ T) s" |+ N9 v● 具有上拉或下拉能力的开漏输出
3 B/ Y+ U2 j& ^1 k0 d) L! J& {# b! g0 d' d2 t
● 具有上拉或下拉能力的推挽输出
3 c3 I+ ~+ D* m  X) Z# ~3 E  z# b2 V2 l! v* m, o  q/ ~  w
● 复用功能且具有上拉或下拉能力的推挽输出
( c! M/ f# U/ E( P( ?; g- o4 {5 n& b) f3 H7 T1 B
● 复用功能且具有上拉或下拉能力的开漏输出
8 h8 t. b# I2 K# T( G
( A5 f/ ?% j. O9 a$ e" {  H注意事项:7 b* F9 r, H1 X" y
# I1 |) E& S  e* |+ `
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式5 T) m5 @/ S  s

4 E; `: F; A5 X! g- B6 e* g2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
2 z+ a5 {- R5 S( o2 J7 Z4 I0 @/ t/ s& q+ x
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。
9 u" D& ~4 E  e. ?
- E7 f" d0 H  l: d' q3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个! T$ U! G4 f7 J

8 y: T& H  g" Z' [; ]3 s! C0 u寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置0 C- @" E6 g5 H

: M  z) {! [9 R: Z$ ^; g" g& p配置过程:9 L! Q2 {5 L4 {9 p$ G# |& \; ]
& D; b* o) O% a7 n, p& f
  1. void GPIOConfigure( void ); M/ s+ |: y0 n9 O6 Z# A
  2. ; L+ t& L- \) `* r% L; \
  3. {
    ! O( X: z$ o* Z( S7 Z. V; B- R* _4 L
  4. GPIO_InitTypeDef gpio_init_structure;8 s: d( ^5 s4 H  O
  5. ; N4 b) D" t! I$ m
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
    ; {/ e' Z5 i+ E3 Y# _/ l
  7. 8 u9 b% f( ^% P/ L1 B
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
    , ?6 ?) o! r  v$ Z! u4 a, U/ [5 L
  9. , ]' p) K3 Q1 W0 c
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚- Y) h7 W1 d' D: T5 z
  11. 9 q9 f; k* p7 s% l5 |
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出/ `+ Q0 ]$ }% G1 `! b" d

  13. + R' e0 p& `* \+ c( j8 }8 ]! B
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出, z- k: w! [! i0 S6 g7 g* X
  15. 8 t. S  e$ P; d# Z. o9 o

  16. 7 b" j: q0 l6 q

  17.   q; }7 u' @9 L- e
  18. GPIO_Init(GPIOA,&gpio_init_structure);2 n3 d7 ^  e1 A& \2 B: I

  19. # u: q" Q# A9 j7 C' l
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位& Q3 A1 Q/ ~9 k$ {" B, B& r

  2. ; c! U  _) R$ T  l, b/ ^
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位3 A7 u% \. O' o+ m0 O" X& O8 x5 f

  4. . K# _2 R5 G+ j7 u  e. O2 C* ]) D& p
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
    1 b0 j- p+ v5 N; W, W4 [2 j

  6.   }) e/ l' ?' R1 I  [
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)) ?* ?, f8 a( w
  8. 0 d: c( l7 n1 J/ U
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA). v1 D3 |) I: b! B/ I  R. t

  10. / g% Q& f5 S" P/ k4 }8 m4 E% s0 q+ B
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

9 r) M) K$ }9 a7 T+ D5 b上面是相应的读取和写入函数,看函数名就可以理解此函数的功能* ]" U( Q0 w) L! |0 S0 r  ?' n

1 C4 r6 l" i" h# K5 q
  1. int main(void)% Q8 D/ H+ A# n4 z  V9 G- O$ z  Z
  2. {
    : O, g6 `/ m" y( B& @2 E6 i
  3.         //
    / r8 F8 i% _+ a- t! V/ d* T
  4.         unsigned long i;
    ) L! t- n  K% ~8 c: T" N

  5. ' P3 E7 t& R# ~7 v- Q2 |

  6. : F, w; ], \. S1 l! T5 y4 d
  7.         //. Z" W# g7 D5 \. O
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟4 H/ D: V4 z% ^' ]9 u& |: @
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口8 r- k: @6 X2 p; m6 U: x4 D3 Q
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式
    # R3 f% Q5 I$ |9 v$ a
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出/ I& R' ~3 t7 C. `% f8 P8 X( y
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    - y3 x6 I- y& {. Q: a" Y3 Y# L
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式& p; L4 Y/ I  R  u

  14. 6 G% X0 y+ `6 l1 S, S4 N) x
  15.         i = 2000000;
    1 T  g- m. p) ^" q5 _6 Z& A
  16.         //+ J9 x! b  p( a, F+ [5 C
  17.         while(1): l1 |0 Z4 j: B  V4 I
  18.         {
    ; V2 T1 ]7 C  X& f5 w3 B+ j/ b% z' Y
  19.                 //" G  K9 m$ L9 V0 R, q
  20.                 if(i > 1000000)
    ( e$ e3 D" c3 a- R! _
  21.                         GPIOA->BSRR = 1 << 1;
      A8 `6 y. h4 H* u8 \& L! p7 P
  22.                 else
    7 P% f' N1 M7 J& I# `/ _
  23.                         GPIOA->BSRR = 1 << 17;9 b* ~% x4 m8 w2 V0 P$ P2 |  z
  24.                 if(i == 0)
    & g1 I7 e' p+ B+ v$ P2 j& }
  25.                         i = 2000000;
    & ?; {; Z& G0 a( {% t
  26.                 else$ V- w* G/ Z; k* `9 z- ~: x7 q
  27.                         i--;- w7 w5 E8 ]: s! \) V4 b( f
  28. //               - n0 _4 ~# u+ f4 K' Z2 P9 |$ `7 X
  29.                 //: W6 m! n* E* @
  30.         }2 I1 W2 L- C6 d/ O0 j
  31.         //
    3 y* V" W" T) ?7 U
  32. }
复制代码
  1. void I2C_MyInit(void)2 x+ l6 T) V0 m% n% J
  2. {
    3 C" Q" t. ^& E+ k
  3.           GPIO_InitTypeDef   GPIO_InitStructA;, s, o' L- j5 B2 w

  4. / o7 g. ^# e4 ~9 T3 b" z
  5.         
    4 c1 c! E2 f# o2 Z
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    ' m) ]3 |/ e! X; S% R$ V; z1 g- r! x
  7. 9 d# a; S% U5 O4 J2 R
  8. //I2C模拟4 ]. F1 D* O% \: w" \& f
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;4 |9 ^- D/ n5 F
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    * T8 e1 N. i; Q+ l
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    3 s4 J4 Q0 k; Q0 J; q
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        ( L* k) P. @5 b  K8 J
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);! \! w, R% K2 @4 B1 C2 r) k) T3 d2 _
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高1 ?: A5 |8 d. E6 K! X
  15. }
    ( V- [- P& a2 |/ c8 a
  16. void SDA_IN(void)" z3 A& e  N5 [; r+ l6 X
  17. {
    1 ~% u0 \. l! U  |: e
  18.           GPIO_InitTypeDef   GPIO_InitStructA;/ Z4 ]$ a. A# C+ O- g
  19. : H6 h- c* ~" b6 J% @
  20.         " T% E! ~4 @# f% g; o: c
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  # F) V) g4 Y* Y' ?# z
  22. : P1 Q+ \# l) S8 W0 R5 [8 O
  23. //I2C模拟. }4 ]; r" t5 p% ?& a7 a
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;  w9 |0 n& C: N" S6 w3 m6 m# }+ C2 S
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟0 [( f6 R" u* ]6 n. q
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)& e6 [) W$ h5 \$ Y. t
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    & L, [# b# U5 L- a% h! Q
  28. }
    0 f: I' W# A2 g' i- r2 X5 w

  29. * ~8 H# T  ~; w. f6 }
  30. void SDA_OUT(void)
    7 D% W( }4 l9 x. @) I4 M/ o
  31. {
    + U: j; D* s' P/ D1 j, \8 _
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    2 B; N% U6 C; A, v1 y& T
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    8 {  @, C# Y# e' O2 [+ m' D
  34. 5 T5 h7 S- L+ K$ A
  35. //I2C模拟; Z/ C8 L2 ^, _1 _4 U1 U! c
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
    ; I; O) f' w. l% C
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟3 |# Q' p- p$ n2 B, g; X; v
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    ' I; c6 i1 s5 b* ?2 L. P- B9 [
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    ) ^  s. D: y$ _0 G# U
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);$ s1 r' L, o  E1 ~# p

  41. . g/ y9 N7 y' C; B+ l. A" v! t
  42. }
复制代码

$ r( Y! S. C6 ?) O! @+ a
$ O, d( P9 L8 {1 w/ ?/ f/ F# }
3 r' q$ B( b. w. _" |
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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