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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。
' n( p  p$ t5 m0 L5 j6 X( }5 l& u, G; N/ p
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码

' f1 W" E$ M+ ?# V* T9 L" w; i) ]但是寄存器空间与STM32F10x的不同。
) c1 U  z- h3 e+ Y6 S4 K0 |: w
  1. <blockquote>typedef struct
复制代码
& Z$ h- R3 Z8 K' R2 g% v
1. 使能GPIO的RCC; o- Y0 ^/ x9 y- F/ T6 ]4 z( _
RCC->AHBENR |= RCC_AHBPeriph_GPIOn7 p( m8 H( c0 t

4 Q$ o: c0 N( K; |$ z/ S9 a其中n的范围为A-F。# Y+ |8 Y: ^+ c0 `6 d

3 X) d4 k# P+ o' @) z3 ?- |# n如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。1 M5 O; T6 R# j( p& I' Y

5 X/ j# ~  J0 v! L
20210603162156418.png

4 x8 s" ]3 k5 @! t& f. d例如GPIOA9,GPIOA10的AFR设定:
5 y/ Z7 Y: t  Q+ y% y& G/ ?! s7 B/ c7 y  e- r7 w- g
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));* f4 C$ \$ B) W
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  
    / E+ u3 @% @; u% O5 u+ N; O+ b
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));5 d2 k7 F9 ^1 a6 v! V, H  d& S* U
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码
, ?, ^; z4 [/ |& `
2. 配置GPIO
0 @1 }. _9 N( }* w! Y2.1 设置输出频率(OSPEEDR), V$ d+ r8 @  V6 S" B4 \

( H( R. I0 S, j. d5 |
20210603171958361.png

* z) q4 ^# L$ `) G
! E& K$ `5 r. @8 o每2个位配置一个Pin。默认是2MHz。: q3 W  d+ a2 W% y# f- B7 \( S3 m
$ S  O. {. V. t7 B; b
0b00, 0b10: 2MHz
5 y( T- C7 s" d. h9 w. D9 b! ~8 b& @+ u" H& R* D) x
0b10: 10MHz) J- d% a+ K. F( z+ b7 p

  O9 i0 O8 O7 l' V$ {" K1 b0 v8 r1 }0b11: 50MHz* a4 f# {( Y6 v& r, l( c* n# F
5 f3 z8 D( {' H, K
  1. typedef enum
    1 b" I! N' A  g; G0 r3 M2 s9 Q
  2. {- @# g) t2 {0 N5 V4 Q: _8 M
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */6 N& ?0 f, @4 b( I7 g
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    2 s) d/ [+ c9 F. U# [. H* P
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */0 ?* D# t5 m8 e1 d1 v8 t/ u6 Y
  6. }GPIOSpeed_TypeDef;
    2 D& P8 H5 }/ |. s6 u$ d

  7. " h+ b: W8 h7 a* \7 J( d
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
    ' _# C$ O/ I. z8 d  a
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
    ) r- q' `  q8 g! S% r7 M. p( R/ m; I, P
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

1 [# u: H* B1 q" m% i1 z8 M例如A9、A10都为50MHz:
" y% ^% L* Z4 Z# ]0 ?6 R  p/ \6 Q% f/ {7 H
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码

3 A( S6 I4 w+ C  a4 R3 t5 s4 \2.2 配置输入输出(MODER)
5 y( D5 ^* u/ [. ^4 u
6 Z0 I! ^5 a, s8 l
4 X: C% t( @) \- |0 R: S9 s

# w" E, O( P2 M( ^, E8 v2 i  f每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)8 Q3 o7 K, B% ]" `! V
6 A! ?- F9 z7 r* k3 z, q
0b00: Input! O9 S$ r/ F% |, x4 P

0 q1 u* X/ H/ ^0 i. g0b01: Output
* t5 z; T  T# i3 R. @4 Z% Q( _! ]8 l) n1 Q: |! Z% r
0b10: AF
& |. @" D9 V( v! k" B1 @6 c2 n0 U4 t* z( H" w, @
0b11: Analog In/Out# o5 ?2 m  G, g
; H" S5 m4 k  `% n) U
  1. typedef enum3 k, e/ _4 x; }5 n5 c/ m% e
  2. {0 h8 e  ~4 m& l6 H' h5 {
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */
    0 u/ W1 I: P/ ^& A
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */
    * u8 w# p% T) D" Z5 T( U6 ~
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    8 \5 S: S7 f, W* [
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */
    - B# s" s+ Y- D8 }' N- L
  7. }GPIOMode_TypeDef;
复制代码
% T6 _! y0 N5 b6 g) I
例如GPIOA9,GPIOA10为AF:0 M  V! o9 s4 n- f( n' m" |
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码
7 H$ _( E1 A- j& H( u  u& U
2.3 配置输出模式(OTYPER)
# F, H' T* o! n4 p+ _) ^. q6 B& ^4 Y" g* y! u: s2 t- u
20210604084327134.png

$ g6 j  o+ u: a3 v
8 Q8 n8 b$ E$ ~, W  x每个bit表示输出模式,1 c! E0 S) E6 X. d6 K, ]
) k0 n( O* {: O! n6 d0 |0 ]0 F
0b0: PP模式;, Q) ]8 A4 h3 ]2 t" \" N5 v" l

; X9 {4 S4 ?. W7 H1 K9 D" T; m! h0b1: OD模式。 , g1 W/ @4 H' w7 l
, y! Y) z' x8 {# |
  1. typedef enum1 @! |6 D) R6 I" l( r$ {
  2. {
      Q7 h0 J* ]+ P7 {5 q
  3.   GPIO_OType_PP = 0x00,* g: x1 J1 l0 H$ G
  4.   GPIO_OType_OD = 0x01: x- g, R) |& ^) D; |2 f2 M4 j# l
  5. }GPIOOType_TypeDef;
复制代码
* q3 g' R; I; p4 z' }3 E
例如:/ J- p6 w0 z2 _# u
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1))
    & E" z- D3 |( [; l4 q! E3 }
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码
* F/ K) ^4 F+ N/ z# ^
2.4 配置上下拉模式(PUPDR)4 h$ n/ K9 q! c" X/ e' v! s, q/ a
" B( |0 X$ e7 }
20210604085305353.png

* b& M/ K7 ?+ E5 Y7 i) ]" C6 k8 h' v" C. h
每2个位表示上下拉模式。5 s/ y1 c; }( O. q/ b0 Y
  1. typedef enum
    ) ?. O% A* J6 r3 O
  2. {6 P1 V9 o; U- `+ G2 _% J+ W
  3.   GPIO_PuPd_NOPULL = 0x00,
    6 ], D* `7 e1 R6 C* Z! m) B
  4.   GPIO_PuPd_UP     = 0x01,9 H8 T9 z, d" \& X
  5.   GPIO_PuPd_DOWN   = 0x02
    ' f, x- A0 g) ~; ^; f% p
  6. }GPIOPuPd_TypeDef;
复制代码
, C2 D& e5 ^4 o4 y) P! v+ G$ Z
例如:
, j9 b- Q; q5 N! b
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码

  g/ g4 J4 n* q/ o3. 输出
, {, T) I" q, o/ j5 l输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:
0 \2 ]1 `+ a8 }: c3 s3 ^8 S+ m& r9 p" N9 z; m( u- z0 f0 J+ J
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA) 8 Q2 l) ]5 k# Q- d
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码

' S% q4 Z. w+ E! T) }' [4 m BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。
8 ^$ e4 Y- P- Y7 g! _# {! s3 F% u7 a; n; P2 p5 f  Z! F+ y
而BRR只有低16位有效,对应对应输出低电平操作。
. G/ e5 N" L. L1 P) S2 U  B9 P9 Z1 h4 \1 N
8bit总线输出
2 m4 X" `1 m% p- x  Q( Q( F$ j3 X& K* J1 c
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO6 q1 H6 E8 g/ X! M6 |7 G( K
通过寄存器IDR读出对应I/O口的状态。低16位有效。% X* ]. U& x4 X
2 x3 u) C8 Q% |! C* R7 X$ y
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码
" E: g: S! J1 R6 r: W4 E

2 X: T! c( z3 j2 c! a' I  O, x; A0 v
20210603165224704.png
赞 收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版