请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。
( i# U# Z) w3 r5 A" h9 S1 ]5 `" C7 X
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码

0 B; n8 H( A6 b8 c7 t但是寄存器空间与STM32F10x的不同。
! L/ ?, ^' ]* ^, o0 E& n* v
  1. <blockquote>typedef struct
复制代码

+ N- X2 u: x7 K, L+ d1. 使能GPIO的RCC- G8 l% ~  J7 v+ Y. ~
RCC->AHBENR |= RCC_AHBPeriph_GPIOn
% \& e4 L$ b4 ]( E1 _, _2 g- W% e# P' z7 G% z
其中n的范围为A-F。
7 x: f. ^) ^. p6 h+ c! q% |2 j6 C6 P* v* o) U" A% o
如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。6 q$ P$ t% P: s$ L! M# U/ T% A2 ~

2 f* I8 a- |2 V- T! z
20210603162156418.png
8 n. R) u& y) }- @8 N" h
例如GPIOA9,GPIOA10的AFR设定:4 @) |+ v+ i; f% D6 d1 ?  q

8 [6 ]5 f* R; R0 m$ Z& @
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));) Y7 ~  G- c  u0 u7 b! t
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  0 R8 ~9 v( Y" ~: w* s! X
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));
    # F  Z$ r- c; r& b
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码
  ~) K6 u! T$ W1 z2 ]2 @
2. 配置GPIO
5 x5 T/ c) F1 Z6 c: f4 ~$ C2.1 设置输出频率(OSPEEDR)
# f" |4 c6 M& Q0 w4 N. F6 J  ]) g4 B- t; h3 ^& y* u9 \
20210603171958361.png

% Y3 B9 c" x' o" R1 c% S" P' D
; L7 ~( A5 H" t: m& l# I每2个位配置一个Pin。默认是2MHz。
% K. s* ~: P# [/ |& g
2 U  Y$ Q9 o8 V- v! K$ r; @) V0b00, 0b10: 2MHz
" _' B, k. A5 }+ N% c4 c  @# ?/ e2 O. d2 f
0b10: 10MHz5 H' t; T9 F7 S9 W; V

) D* M  H/ o# o! k& X$ E0b11: 50MHz" ?2 I3 T* E: w# u& G( ]" [% {

) g; E. R% ^( F3 {/ J4 P
  1. typedef enum, b7 r& J3 ]# O$ v; f. C
  2. {: @* m  l5 I. E4 A0 v- G5 T# }
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */7 K" g8 B) f. P3 |1 e
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    5 R6 P$ z4 u) i" U! \! C4 A6 B6 o
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */( p/ J7 X6 u( p! F, r/ P
  6. }GPIOSpeed_TypeDef;+ d( a8 C  @5 N, c/ A
  7. & R" p7 w1 H* T5 \  t' B
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */6 D0 ~- w: d$ Y& s
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
    + h, v' {4 ?9 g# i. ]
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

; ]9 H& U4 _& J: y例如A9、A10都为50MHz:
- N* g6 _) o* A- g, v7 \; Q
: Q9 r8 U( M+ _6 K+ g& f
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码
1 d6 h0 J# f2 w. \8 h# H. F
2.2 配置输入输出(MODER)) ~5 |5 {$ i" H

! }; w: T+ A/ [+ ^0 G

, s5 ^  j  u1 p7 Y2 V  Z, q% Q" K# H" ]1 g
每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)- c. Q0 V% \) V: t
, s6 r( Z7 R- t% d; a# `* Z
0b00: Input& J& c% Q- K5 q& v% F5 M
. W& q: q5 k% ^& k
0b01: Output% C2 B$ {! N) R4 G
1 X$ r( e$ x& o3 @9 ^# v0 X% v
0b10: AF
; i2 G) K, u5 T7 t" q- v! w; e! o: k2 Y8 [' G$ k
0b11: Analog In/Out' z/ L+ R, n0 n  S1 \( ^

6 O6 M# s. u! n/ `1 l
  1. typedef enum: p* j/ ?/ J9 y) n
  2. {
    9 g& m1 H- a" p2 e& C
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */* |- E' x2 A: S0 i7 p' K
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */4 H, M: i; k; i; I; Q- Q, A7 S
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    + S9 ]" a8 _5 @: |3 z( C
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */4 Q# h; F6 d* w$ h& ]* c. o8 ?5 v8 L
  7. }GPIOMode_TypeDef;
复制代码

7 _+ |5 u' ]8 I例如GPIOA9,GPIOA10为AF:$ H2 x# |, Y7 V- U5 B! l6 @
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码
  i6 W1 R  M& b' B& w
2.3 配置输出模式(OTYPER)
2 t7 h! H6 `/ c. t6 u/ S. C; G! B) ~* g
20210604084327134.png
) o* l4 T2 O2 Q9 d  T, q. I8 ]$ W) R

/ `5 [$ c8 d/ C  q& @1 @每个bit表示输出模式,9 J6 M- d% _5 J$ A( A5 v8 I

/ S( l) C8 f$ |8 t0b0: PP模式;0 e. Y5 ~5 C( a# \! i7 V8 k
/ M) w0 o) l& O) r/ M
0b1: OD模式。 ) Y# `0 B3 ]8 w
+ h* h7 V  p* I2 F. [
  1. typedef enum
    % O" N4 f# d3 p2 d5 z9 d) N  o
  2. {% s% m0 j% s! z5 {) r
  3.   GPIO_OType_PP = 0x00,
    9 h, A. O, s- D' m$ g+ f
  4.   GPIO_OType_OD = 0x01* ^( q) l0 Z9 z% h, \
  5. }GPIOOType_TypeDef;
复制代码

! P1 i! G3 D8 y& y, i 例如:) t) m& U# S7 _
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1))
    , t# z( \- M0 N2 s
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码
4 P; x! R0 o" y. r+ r8 O! H: S
2.4 配置上下拉模式(PUPDR)
; N- v, {9 n7 R% q- C" B1 r3 c+ [9 o/ z- P; U% I* t' W
20210604085305353.png

& i& f3 ?% Y1 e: S9 X2 ?: M; M$ i+ e3 c
每2个位表示上下拉模式。
. p' c  B7 C' ~# w  g: E
  1. typedef enum: X/ j, i: b$ v. E3 A! P3 ~
  2. {
    # s9 W' F4 K. R$ z
  3.   GPIO_PuPd_NOPULL = 0x00,
    " v8 Z$ G1 A; }# n
  4.   GPIO_PuPd_UP     = 0x01,, ^% P1 B# Q" A9 O
  5.   GPIO_PuPd_DOWN   = 0x02( t. G2 _& C5 g+ C6 J
  6. }GPIOPuPd_TypeDef;
复制代码
5 L1 ~/ E6 q2 y8 y
例如:
8 r9 j6 U% K9 w& y! ~) k
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码
( f. o! ]5 G' s& L8 b6 p
3. 输出, }  T8 [, z$ j; Y+ ^& [* }
输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:
9 b0 r( o) G6 E  ~3 p3 p6 j2 C
( r: n; `) b5 v9 X" i1 M% _
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA)
    ) Y+ }% w5 \1 o" V. [
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码

* q7 j; q* U" N4 F2 i' o BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。% n4 ^2 v. V/ i' R* C+ @
1 Y0 `- s4 ?5 c) ?4 f
而BRR只有低16位有效,对应对应输出低电平操作。
8 g- S* U1 D" d7 s. f$ y
/ R# C' T4 W( ?$ i0 Y1 s1 D$ U& [8bit总线输出# H5 a' ~* B) N# z2 a

6 S: h% u6 [3 O4 l& R
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO! s. G3 c4 V& c
通过寄存器IDR读出对应I/O口的状态。低16位有效。
- l9 H8 z7 D" ]
/ F* Z1 Q. X( s& M# F; [; u1 H
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码

7 \, N6 e) q2 j
: q/ V, w/ C' T: D. f0 d
3 B" a" C. e7 D! G8 n) ~& u% {
20210603165224704.png
收藏 评论0 发布时间:2021-11-25 15:00

举报

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