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

【经验分享】STM32F0xx之IO口控制(寄存器方式)

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。
4 _" d( v; h/ Y: C' p6 c
( W2 s1 i3 q/ F6 I) u
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码
6 V7 j  C; X4 b8 e: H6 I  a
但是寄存器空间与STM32F10x的不同。
! R5 m! Y- h+ v; K  ]* p# Q5 C
  1. <blockquote>typedef struct
复制代码
( W; B6 N7 s1 e/ D
1. 使能GPIO的RCC7 R1 P8 T* X/ O- l
RCC->AHBENR |= RCC_AHBPeriph_GPIOn& Q0 d3 e, x1 d
( F( Z3 q. g' l" `& O: n/ X, b+ p4 W0 K
其中n的范围为A-F。
. u# f1 [* q6 N( d, D
3 v/ U0 w  x! g* J: J8 g如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。* a, v6 x7 U0 U& t0 _
' P  [+ ~! c: K* m6 _' M
20210603162156418.png

6 p4 y) ~1 i9 O( V& v例如GPIOA9,GPIOA10的AFR设定:9 y% q, w  ]$ a4 X6 \$ I' |% |5 y
  O  e+ ^% S2 ]
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));- N0 y; t) T* V- d" k/ o: W, n% ^
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  & ?; _' g- S7 A$ ?+ a* Z
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));
    : G- @" t4 x+ R- ?
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码

- \. S8 w* C* }2. 配置GPIO: C3 H( i/ f8 t4 }
2.1 设置输出频率(OSPEEDR)4 q2 ~5 k! H' G* W4 ~
5 Y/ g8 w% W4 w3 ]. g" ]" p! _
20210603171958361.png

: w% }% W, S5 ?$ J/ o* m% j' b# O/ ^/ k: n5 P: `2 O
每2个位配置一个Pin。默认是2MHz。0 `' q9 G4 {5 S5 E

' c6 ?1 D+ u# ?* n+ x/ |0b00, 0b10: 2MHz" |* Z0 U; u. J$ o- }$ T
$ ~. I. [1 d  ?
0b10: 10MHz
+ F2 R) O1 H% A2 J- d5 V2 [9 n: }( ]3 j  U. \0 D
0b11: 50MHz
8 S! Q- ^- ?3 Y
, {1 ?7 G! y6 \" j- K# }
  1. typedef enum5 J( B8 i; l  i* {/ [- c
  2. {; o- b% q2 E. @8 \& D& @( ^; w1 n
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */, F: j# P' Y- N
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    % k: _  _! S: U0 @
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */
    * ^6 A# F, s8 f! \, }
  6. }GPIOSpeed_TypeDef;2 j- ~: |& o. ?1 k2 H# M

  7. $ L, _6 A( J. |" T" ~
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */1 V) Z# a6 X- [2 J# I# ^
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
    9 q& C1 U+ |7 I
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

" I& X& p/ d" {6 E例如A9、A10都为50MHz: - _/ L; ?1 p6 |6 L) l% ~
0 v3 k% C# h* ?
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码
7 q# z# G7 c6 A" [4 a+ x
2.2 配置输入输出(MODER)$ V0 @# J2 `% [6 _: [

/ k1 ?' q  _4 U( z" _' E. P
/ B# y3 z! }1 A8 T1 [3 c
% Q, L+ X% {: a/ ~. g$ S
每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)0 H+ I  ?0 {! [" d8 H) _# W
1 S' Y5 v+ b+ A1 h7 b8 _
0b00: Input
3 O3 @2 O# z) p' U) Y
/ K3 G' p' c5 H6 T# A) O0b01: Output& s2 Q, u+ T3 }# m' {
& P, ~" r( f# R+ C
0b10: AF" s6 F! p/ Z1 I" v  v

+ a0 k9 I1 d; u1 [4 a! F9 P0b11: Analog In/Out4 A1 W4 L6 X/ m; B* N0 n! P4 z( \
2 O) j" d* h8 O$ }% D8 X9 d! h! T. H
  1. typedef enum
    / S8 v) o5 L: ?' x( t* P  E6 y6 q
  2. {- @% L1 k: ~1 E, C; `* V% k
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */
    ) e/ \' m, l& |; z( u
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */+ O& f2 S2 q" ~  i: Z- X/ R7 u
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */6 X7 @) d  ~5 x( K: F
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */
    5 I( M+ N9 a8 q
  7. }GPIOMode_TypeDef;
复制代码
4 m4 z- S0 g/ @  o6 g
例如GPIOA9,GPIOA10为AF:3 }2 h4 n: P0 B7 F: {+ X' C7 X
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码

# |) [9 {; Q/ {2.3 配置输出模式(OTYPER)9 p5 R0 j$ H& S' l8 U
8 g' t; ~4 I3 N# E. ~- r
20210604084327134.png
* I1 ^2 @! \- W3 c0 I, `# m

% w% t- p8 b8 `4 P$ Y: K每个bit表示输出模式,9 T' \4 K& {6 r0 O2 o
' R: C+ s% c6 d6 N: V" p
0b0: PP模式;. y4 A, |; ~% v& Z

& f- q. U) \* m! a" b) E( C0b1: OD模式。 6 F7 t7 r3 o" C
2 m* @/ l1 S, m! ], c' C" D2 K
  1. typedef enum* ?( m9 q, ?" F/ ~
  2. {
    $ h5 R4 L7 [+ S9 }5 d/ j8 E7 ^: l5 p
  3.   GPIO_OType_PP = 0x00,
    " Y: o/ U2 o& ?# I# K7 e9 W& K
  4.   GPIO_OType_OD = 0x017 G2 h4 F. u0 a5 \2 q3 w- D
  5. }GPIOOType_TypeDef;
复制代码

+ c1 \! n. j3 K+ b5 R" w+ z4 M 例如:7 u2 v* d. N  |; L
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1)) 7 Z% Y# f) [% l: p
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码
" X# g$ n) k& [7 F  M3 V
2.4 配置上下拉模式(PUPDR)8 B1 S. c- l+ b- X& f9 f  V% z' t
" o2 l6 p6 v/ k/ a! [5 g1 e
20210604085305353.png

  }/ Q, G4 Q1 M
, p% [4 P) c6 z每2个位表示上下拉模式。- C0 r# U" M" y3 ^' D$ }; _
  1. typedef enum
    , m0 c# {7 m6 `1 Y+ ~% }6 w7 e
  2. {# k" U! P  H: C# k
  3.   GPIO_PuPd_NOPULL = 0x00,5 P% \3 P' j# o  N+ U
  4.   GPIO_PuPd_UP     = 0x01,
    1 i" U0 C3 @7 x" R; s) a$ D
  5.   GPIO_PuPd_DOWN   = 0x02
    : U  S' a( Y* C+ Z) p! V* p% u
  6. }GPIOPuPd_TypeDef;
复制代码
1 ?. G8 b3 R! b* [8 H
例如:
& n4 v* m4 K; B% @# I) J3 u
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码
5 m0 l3 {8 k% A/ ~
3. 输出
7 W- |' P% g4 ]0 B: G* S' O输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:
+ f, x5 X# Z0 z; w8 @- z6 w2 c* ^1 W$ x+ N: Y+ z& a7 e/ ^
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA) 6 l# n% o2 @- T: J5 O% y
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码
. ]  J% L* \( P5 m+ v8 z
BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。
3 Y7 T0 o+ S& _* b% `) p5 I+ U- X- ]
5 ^5 P9 i$ N/ i7 k+ P( k而BRR只有低16位有效,对应对应输出低电平操作。) ?9 `$ J* v2 Z7 f7 S
& T% Y' J& L- v" R5 R; k1 c+ R0 C# o
8bit总线输出
. ^& |. h" R3 |4 @& O; t
$ t( g0 v5 d! h) e3 W
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO, K6 y1 q/ b, d1 p3 E$ q8 Z  {
通过寄存器IDR读出对应I/O口的状态。低16位有效。
6 o  l( h7 K* N" a  n
; {. _4 d$ a. I/ q7 S4 P
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码

8 k# o% j& w. z- ?" x2 F$ `6 i0 l* M" ~: k# Y  y( A- s$ V+ K
1 N2 j- M# E4 _7 D& T0 N5 |
20210603165224704.png
收藏 评论0 发布时间:2021-11-25 15:00

举报

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