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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。" |2 g% A+ |% L' D7 f" n+ I. J

2 A0 ?* @, W  m' {8 S/ H! z+ n
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码

& P) V; i# `: Y& ^' Q但是寄存器空间与STM32F10x的不同。) c" p- m# W) @/ G; R9 P' K( e
  1. <blockquote>typedef struct
复制代码
/ {: E% H  ?& B7 O! u% y( k
1. 使能GPIO的RCC
# {4 M1 W& i3 j# H4 H8 `" |4 TRCC->AHBENR |= RCC_AHBPeriph_GPIOn
) `; b; Z; r/ T* f2 P- N& P* ?# s) F
其中n的范围为A-F。( F4 a! X/ f7 W  ?" N
. V  i5 e1 z/ I4 J8 C, W
如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。
1 M+ `; N* k) d1 x4 K7 h# e% N9 B0 T  r/ o/ V7 ?& g
20210603162156418.png

0 V( v, S) ?# c5 W+ E2 \! i例如GPIOA9,GPIOA10的AFR设定:
$ X* g1 \5 q* |0 ^+ J7 `7 P, p4 t0 |! Y+ y4 C6 M
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));+ `* f9 I; e) ?- b4 b+ A5 \* w% o
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  
    ' o3 n* f' T$ I- ]* a
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));
    ( }5 x! u! ^" W2 p  Q7 v
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码

9 q5 @! K  W( [8 T; r7 E4 {. Y4 W2. 配置GPIO- P( a) ]4 g% u" `- c
2.1 设置输出频率(OSPEEDR)
: L( P+ F9 I6 h3 P
5 H. x5 \5 |0 ~: u& [0 t
20210603171958361.png
. O# A# n5 m0 p" W% w

: u# Y/ ^, u9 E$ Y4 @1 {2 d$ R每2个位配置一个Pin。默认是2MHz。4 s* @2 \0 J! W- l/ o" i
  B3 ], r! J, V& M2 j. q& s
0b00, 0b10: 2MHz7 K& w0 g: d/ g

# e$ u9 W5 L4 P; x- j0b10: 10MHz4 Q  Y- v2 a" A% k1 v
- x, |4 k- L! ^3 j  z2 D  v1 z
0b11: 50MHz- ?8 ?) n, _- g4 D5 T+ M8 p
: E0 J4 t, o1 n# L) M# e* \5 _! j$ X
  1. typedef enum
    # Y" \  c1 l' K3 t9 g1 @; `
  2. {: h- x1 k& A) I( Q' b( n3 x
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */2 r1 O1 a0 I6 O5 q
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    # \2 z( e9 a. r. A' K  K- u9 \9 Y! p
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */
    . e# Q, L( [, u' a4 e% w$ J
  6. }GPIOSpeed_TypeDef;5 q' L' y' Y4 }7 h3 t: t' j9 K& N

  7. ' A" t. ]  M; Z& F' S4 }
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
    9 a8 ]+ [7 U, R( \6 Q/ [
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
    - N/ q+ J1 x9 N
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

  e& o" y3 l2 U7 ]例如A9、A10都为50MHz:
7 J/ Y! v9 o8 U1 r
0 x( \% J4 ]/ @$ @
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码

2 h. I# w: b1 H" |2.2 配置输入输出(MODER)
1 ]0 P( ~1 I' W( s- q6 n3 m: e
$ |' V9 r. B- o* L/ d- ^2 Q6 J+ `  u

8 q* U- T) m; D3 q- @. S( ^/ G
* P" R/ `4 t1 P+ d每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)
. Y, @) Z6 Z7 ?2 G) U+ Y' E, O5 r/ O9 v( g* B& `
0b00: Input
9 n. W! }3 @; Q3 F; f: @
/ v4 z& O3 S, U& @) ^0b01: Output. D& |. y% v" z7 @4 T8 s" `

% ?/ y+ o5 ?( ~! Z! r- N0b10: AF
" Q9 p% P5 C2 g4 W- N2 D
! X6 N$ \" }) y$ |6 G9 l2 ^0b11: Analog In/Out, z3 Z5 J( {2 Q

$ ?* J$ L8 D3 p
  1. typedef enum
    6 Y' f# ]# |$ A+ R2 S
  2. {
    6 U2 e2 T% t- m, m. o6 n
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */
    4 H% o4 w, `- ^% n+ a. r
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             *// k" i+ V' d9 X, d, L
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    , Q4 u8 X# T6 c# Y) o( U
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */* V0 Y! n8 F3 N4 @" }
  7. }GPIOMode_TypeDef;
复制代码

2 G8 k" P. L# Q+ ~. c+ {例如GPIOA9,GPIOA10为AF:
6 R2 |3 C+ o1 _# a3 {
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码
) l8 c+ Y7 V- y: ^; h
2.3 配置输出模式(OTYPER)0 T+ j2 b) j( M: D: m7 Y

* T3 a6 b, u# z/ h0 y+ a1 ~7 l
20210604084327134.png
( H% ~  c/ \2 N8 y" E5 s. h9 e
( J! L6 \) @- f4 j) g9 l5 v3 {8 W
每个bit表示输出模式,+ s( W8 ?/ Z1 t$ x# B

# [& r1 J! a* U' p/ l2 Y0 X0b0: PP模式;
5 x6 v7 Q$ D- X# B
  q4 I% `( U: c. a6 t: e8 F0b1: OD模式。 . b' z! G9 G& k
# C, o/ g' u" P/ `% K' E
  1. typedef enum0 u, j& m% t+ z! S% z
  2. {; t; U% s: ?% `' U' B9 o( y8 N
  3.   GPIO_OType_PP = 0x00,0 B: Y5 Y( l" N8 L7 j. V
  4.   GPIO_OType_OD = 0x01# j4 X6 B1 W0 v
  5. }GPIOOType_TypeDef;
复制代码
: ?& C8 l* s2 `, A- [
例如:
+ o1 v9 y: U  O  c- G
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1))
    1 O. I6 S7 x  b, T! x% i
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码

; n) f! M+ c1 K  j( n2.4 配置上下拉模式(PUPDR)
, z5 I" u) O( N) C1 {% T" e
. h* u4 N/ K$ r" M; y' @
20210604085305353.png
  e1 V& d  L) c. r
3 y8 Q& o" S; c* s) l4 c
每2个位表示上下拉模式。
. W& }, M3 s" s
  1. typedef enum
    ) A+ d% L) r9 z& Z
  2. {& s: v1 w6 e9 A: R# {- d
  3.   GPIO_PuPd_NOPULL = 0x00,! a$ m1 ~; A0 `- {: m; f
  4.   GPIO_PuPd_UP     = 0x01,
    9 U6 {: O+ I) h/ Y
  5.   GPIO_PuPd_DOWN   = 0x02+ V5 k8 \1 h! n% o4 O  u
  6. }GPIOPuPd_TypeDef;
复制代码
/ F/ ^& }& P# r  X- M
例如:
% [! u. y! J! _5 G, Y
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码
) [: _# Y4 ~; i8 }$ w, u
3. 输出
6 Q% @6 o; G8 F7 q1 `! r输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:
, X) T- U3 w: C7 \% x/ d' A4 \; a( t5 j2 x" B0 ~2 W
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA)
    3 l" z8 G$ j: A) H0 D2 A% K1 L
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码

+ V5 ~# Q1 O( D! } BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。! G5 m& G  o1 d4 u
- s( q+ f0 r" S) x1 p" j
而BRR只有低16位有效,对应对应输出低电平操作。
( q- V- y" h* y0 o0 Z# W& n+ ~  M. a9 y# N: N- O& U8 O2 F
8bit总线输出. V& e0 Y# W9 Y' v4 A+ e8 Y: L; P

/ `  \8 U! c- S
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO
; k3 h% u: ^$ z9 m) P; c  H* f通过寄存器IDR读出对应I/O口的状态。低16位有效。
- \3 ?2 o1 }! l
7 |7 V& K4 P, U9 s
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码

4 H; F+ `( ^. |6 h! @. d- I7 D( U" t: c9 d3 s# \5 V9 q- m, s
. G8 m. `  Y5 S, ]0 k1 R
20210603165224704.png
收藏 评论0 发布时间:2021-11-25 15:00

举报

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