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

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

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
GPIO口
2 K" V, u$ o6 p7 \
9 H' z. ?" Y( {
20201230164444562.png

" W" o: T: x' p0 t' a& R: b8 |
20201230164505622.png

4 q8 u4 t# Z6 w. w5 h- p9 I+ F2 k, Q" |6 W# x3 m- o
介绍:
9 k3 E$ r& l% J; d- M+ Y& f" U& j" C* K4 z; X1 G* a
4 个 32 位 配 置 寄 存 器
0 B6 E+ L% L: Z: {$ A  H& E( ?% |' J- H3 h: a6 k  F% _2 Z
GPIOx_MODER:模式配置寄存器
/ g  c- R) \9 v" [5 O1 D7 }
# ~9 i) `/ J" t8 z' {  w( i! v3 [) {- `GPIOx_OTYPER:输出模式配置寄存器
8 e$ Q- v0 Y3 L: \) j, b- q4 x$ M$ f* F
GPIOx_OSPEEDR:输出速度寄存器
9 c+ _0 B7 `7 ]/ g2 d; x$ S# h. `  G
GPIOx_PUPDR:上拉下拉选择
* V+ K- e) ^. R3 Z, l! T9 B1 Q  }" n9 v% q+ t" c
2 个 32 位数据寄存器; B/ H9 v9 a" ?8 z

% d! f, p. X: ]6 g- I' y" wGPIOx_IDR:输入寄存器0 j# l7 W8 ~, y3 ^, S" g3 P

% L5 G! S2 ?5 Z3 v) J" vGPIOx_ODR:输出寄存器* Q/ j% Z' O3 ^4 Q5 V1 w7 a
* Y0 E; ~1 @  Z+ {7 V
1 个32 位置位 / 复位寄存器
9 t2 c4 L" @& s8 B- [
+ i1 f2 h) l2 z7 W
GPIOx_BSRR* U. k8 Z, H% R5 j" _
% g9 \3 {+ I7 Y' L
A和B还含有1个32位锁定寄存器) N* U* P8 n, n! X' O

/ S' t( |1 ]0 i5 xGPIOx_LCKR
$ f& d% q4 `) f6 @9 t8 |
( \' w6 f! c# g1 v/ K) @A和B还含有2个32位替代功能寄存器
& M/ x0 c# m9 h% P6 R2 t- m' r+ e/ E3 {( d6 M% A+ z) B( ^8 `
GPIOx_AFRH :复用功能寄存器1 P5 x) ]; B, m  I

6 b# _1 K' x0 aGPIOx_AFRL :复用功能寄存器
  p' T# r; A8 S2 ~( K, D- |) M0 ^% m0 _; Q" ?, ^0 o0 F" A, O; k
GPIO口可以配置成如下模式:
9 E3 Q( Y* A, \" I2 g& B4 W4 f" a/ t3 K6 ^
● 浮空输入' n9 D; ]. x8 Q) X7 I. `+ R3 K% A( \
8 e  X' o( K5 N" Z# ~
● 上拉输入
  B9 Q* s2 ?1 X0 q3 w9 R/ S( j* a* f& a7 Z8 l
● 下拉输入
7 H+ I. v% W* A* Y% r9 T
: E! i' C$ G+ N+ P: G0 \2 o● 模拟输入
9 q" h; e4 o3 j. u4 P/ j" n3 ~2 B* S% Q2 o3 n: q( D3 m
● 具有上拉或下拉能力的开漏输出; m5 d! E. l$ k; i0 s

* r7 o2 ^: z: M( |● 具有上拉或下拉能力的推挽输出
3 X5 H+ h: E" |3 B- F3 f$ h! K0 M; o0 S# f7 l# O
● 复用功能且具有上拉或下拉能力的推挽输出) u( a7 [8 B  W0 a
' C% W2 I' f- |2 [; h2 q! l; y" U# j
● 复用功能且具有上拉或下拉能力的开漏输出
6 ?7 p: B$ h1 Q+ U+ T8 J0 }7 `/ j# m7 Y
注意事项:
/ M5 h* q; T1 W6 {' d- q* n9 o; e; D. Z* w8 i0 t
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 k; |: A9 J6 s% V
0 {$ I! T; w2 h2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
  ^- G; r. k' }) K
- X! G  M+ t7 ~$ s9 q8 S- ~6 JBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。& q) F/ Q. W, h$ ~- x* N' }

& G$ Y& }* n; M# a0 X3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
4 T% `2 Y( h. f/ P& E, D! O& }, j% s3 d/ ], y' Y% i8 ?$ p
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置/ q) o' i+ U. |0 M+ g% k
6 B- M  x9 K% ^
配置过程:
* H  \1 Y: n0 Y% T1 y+ n4 H1 c4 |  |
  1. void GPIOConfigure( void )
    4 {# U  }( g- d( {

  2. , |8 F/ v! Z1 C0 c$ e! c, g
  3. {
    4 c0 B  H2 e- P# q  Q' P( \1 Z
  4. GPIO_InitTypeDef gpio_init_structure;. ]1 Y$ l. I) ~  n
  5. ! ]5 R; N$ z- K8 |
  6. gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式1 Y4 `0 {# d0 n* Y
  7. , d1 E% U3 S1 c# I& W, x4 I7 z7 R: D
  8. gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
    - Q5 u4 F  M0 |- q* S5 {/ b( v/ `
  9. 8 a4 N' o+ u5 m: I4 Y" |
  10. gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚3 @* M- S* \' c+ H! j; L

  11.   ^6 H/ B- d! h! D( |9 A2 T7 [
  12. gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出% ?) F! s0 f' b7 O

  13. 5 |: e7 d( u% ?' Y/ e# U
  14. gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
    0 |0 H) ^# K3 T  [3 b
  15. / ?* M6 b3 k: l* U8 @
  16. 6 R  W0 O* E& [1 T0 Y$ S

  17. : h2 x& V: ]/ m
  18. GPIO_Init(GPIOA,&gpio_init_structure);
    - p& O, B) [) g# A# s

  19.   O, j: n3 j1 Y0 M0 `) s
  20. }
复制代码
  1. #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位' b' L2 A0 U+ W. d% h

  2. 5 ]* F9 g. W/ p+ w/ d" O5 m* X/ \
  3. #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
    7 w* `/ _' y0 q0 T$ i. y0 z
  4. + _8 N' ]  b, G2 S4 }+ k- d0 o
  5. #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)" p5 x$ U$ k' D# C9 y, O. i  r

  6. / k/ }* D) q; t) g0 X8 `
  7. #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)9 s5 r3 E3 {4 f6 u+ g% p* C, |8 @
  8.   c' W  K& t. ]1 [7 u* x. V0 F/ h( v
  9. #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)
      K9 V$ m2 K1 W0 k( ~" G6 G2 {

  10. 6 i' L2 e$ x; o/ G2 c4 x" S" b
  11. #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码

$ o/ Y8 s& I! c: Q. q0 U- V上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
3 m8 ]3 F- W& [3 _; y1 S$ t" l. e! A7 I
  1. int main(void)1 n3 E; C% L0 i( p$ l5 Y
  2. {
    ! n9 p: m7 h. Y: f3 V' F' C
  3.         //; `* W- ^5 l5 s1 U( [
  4.         unsigned long i;5 C  U, w4 M: W0 v$ t
  5.   u5 I& a* H5 M2 U/ u

  6. + B8 o# I2 m. a( w- W
  7.         //
    . d+ u% p5 s; R
  8.         RCC->AHBENR    |= 1 << 17;                 // 开启GPIOA外设时钟
      _, U5 N5 E) X, Y+ G
  9.         GPIOA->BSRR     = 0xFFFF;                // 清除全部端口
    + `3 Y' f+ L# y+ M4 {
  10.         GPIOA->MODER   |= 1 << 2;                // 配置PA1 通用输出模式
    + B' g0 \! J) ^' i1 ?
  11.         GPIOA->OTYPER  &= 0xFFFD;                // 配置PA1 推挽输出/ e+ o+ ]' X& X% E; A
  12.         GPIOA->PUPDR   &= 0xFFFFFFF3;        // 配置PA1 没有上下拉
    0 j) A( L+ y5 t
  13.         GPIOA->OSPEEDR &= 0xFFFFFFFF;        // 配置PA1 输出低速模式0 z; n& f7 h3 f: ^2 [
  14.   N; K5 b( K. n1 ]% t
  15.         i = 2000000;* |' U/ o$ W( v* B2 d1 @
  16.         //3 T2 [6 q! L! Z" m
  17.         while(1)
    * v8 C1 O! T' T9 m$ i, `) }% h" `0 A
  18.         {
    ( ]5 v& k) ^8 ^# e# r6 \: w3 K  ^- g
  19.                 //- l* O$ j1 D0 s! u
  20.                 if(i > 1000000)4 i* `% M5 ^) l- f
  21.                         GPIOA->BSRR = 1 << 1;
    " e6 ^( j0 ^# V( k% L8 Q
  22.                 else
    ' ^- ^0 P' ~9 X
  23.                         GPIOA->BSRR = 1 << 17;2 l* E( U' Z; W5 K
  24.                 if(i == 0)8 R; p% }: X: {& R8 _! f
  25.                         i = 2000000;4 t7 @/ ^; G% f/ w: m: c# t
  26.                 else! L: u" |4 r8 M" ~/ r6 N
  27.                         i--;/ R5 J3 |) |* g. o  M7 B' L. [
  28. //               
    % Y, q1 e; R3 a4 r6 X& E
  29.                 //) ?3 u& _6 G' u' t, \% c' l) S
  30.         }
    ) @5 ~3 i3 d+ R3 f: n# a
  31.         //: ], B5 R7 e+ A' |+ O* {8 a8 E
  32. }
复制代码
  1. void I2C_MyInit(void)
    , U* t- @0 J  \0 L1 _
  2. {
    5 C7 E: W1 j) C8 d0 u( L+ Y
  3.           GPIO_InitTypeDef   GPIO_InitStructA;
    4 b. h0 G% C; P5 r( {
  4. ' s# s6 H# q- Y# h1 r
  5.         7 f8 U. T- b8 c/ ^2 P( }5 K
  6.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  8 j0 X6 b9 [$ R3 _, I0 t/ D" `. G- z

  7. 8 l$ r6 e1 N% c; [- x- i" ?
  8. //I2C模拟3 X: C' _8 s9 l
  9.     GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;, w- b1 q. N! \9 [8 s8 t
  10.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    % p8 F2 k4 u7 O3 A5 F& {
  11.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    6 z  y' T# {( L" S
  12.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;        
    4 ^) M$ r& Z3 V* n3 y2 i
  13.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    1 N% _* d2 y9 c1 X! ]1 ~
  14.                 GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO);         //PA0,PA2输出高- q, s5 W8 c( ]$ f: r: F1 I& ~
  15. }
    5 J3 Z4 A' f% p
  16. void SDA_IN(void)
    " K- R+ Z+ I0 C- V/ T
  17. {( ^& W) n+ {- {5 R+ A4 W
  18.           GPIO_InitTypeDef   GPIO_InitStructA;) M: j- K9 r* T( ~9 U" \0 Y  M
  19. 0 d5 I4 j( o. h: s+ U6 ]# y5 L
  20.         6 f4 U5 @3 z% G# R0 }' Y9 \
  21.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  0 }  F# @5 K7 [8 |3 C) T
  22. % [# U2 U  Z( K3 t$ T
  23. //I2C模拟7 C8 H% x8 D+ o+ O5 }# }0 W$ W
  24.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;+ x* q; m! N+ o; K
  25.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    " K' B. `: l% x3 \' p
  26.           GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
    , f! h& ]  k' ?$ l# E
  27.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    9 C$ |/ J; p  e( J  {- c8 G
  28. }
    2 I8 v  Z( ?7 w* X& O& D# ?

  29. 8 |& @/ d  s- ~% X- I. h
  30. void SDA_OUT(void)- a5 z1 M5 U. U' q
  31. {
    7 w& h3 H! r- E6 T
  32.           GPIO_InitTypeDef   GPIO_InitStructA;
    , I3 I& L8 {3 B- A- h7 u2 D" `+ H
  33.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);  
    ; ~% @: J0 G, @
  34. * {9 W; W0 ]8 v
  35. //I2C模拟# `+ T/ v9 n( s5 ^6 g0 u; V
  36.     GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
    / A( [: y& P3 m7 x, J/ e3 B
  37.     GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT;              //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
    : y& f$ K2 G6 T/ t( O% \, o
  38.           GPIO_InitStructA.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)) [8 i- u2 @4 {3 t" P) t+ C
  39.     GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;          z& @6 L, L2 T+ ~
  40.           GPIO_Init(GPIOA, &GPIO_InitStructA);
    6 p1 Y6 ]5 j4 d, g# w5 m

  41. 0 a4 o  H  T% m$ k
  42. }
复制代码
$ _  n8 C0 T3 D# E4 z  u% R- ?

1 C0 ]/ R+ `9 k, k
5 N+ [+ O# j8 m: C7 l: G2 L3 e
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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