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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。
' i  X; I* b7 a, f* L9 J$ b. r  i2 ]9 P$ i/ B" R3 l
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码

8 F! r' E; t: A但是寄存器空间与STM32F10x的不同。. A" n" G* r3 I
  1. <blockquote>typedef struct
复制代码

' t; `! z% x2 r3 h/ r1. 使能GPIO的RCC, |7 [- M( S. p9 x5 w# [
RCC->AHBENR |= RCC_AHBPeriph_GPIOn
" y4 q: i6 E* {7 |2 `/ q! h4 U; r/ K( _7 j: `/ A$ i8 f
其中n的范围为A-F。6 @" H0 {0 A% Y5 Q# g  |* V
, m5 ^' |  t! r' K0 @0 U
如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。- ?$ K. D+ l9 k, S
, y! a& q5 t' _0 M2 ~0 @
20210603162156418.png
1 x! f1 t* D- }0 u; R" u
例如GPIOA9,GPIOA10的AFR设定:
$ _: y+ e7 m1 q' ^$ D) q. ]+ O- e! Y2 ~5 N6 M/ ~
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));( \/ q& y( J& i6 w9 E4 m
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  5 D" y/ q/ H  Q. t$ ]
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));, K' M% L. U1 l' Y4 G1 h3 ~$ W
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码
2 v" w  Z& D5 `1 i
2. 配置GPIO
: r, J; A& J5 `6 t$ ^$ Z& h* v/ g2.1 设置输出频率(OSPEEDR)
. G$ M, {- b% T5 b4 N3 Q
0 y& C' u! }# j5 H# b
20210603171958361.png
) [1 }! p* l; _0 P9 x6 f+ H

) S  V& J3 I1 M1 O' t  R8 D每2个位配置一个Pin。默认是2MHz。
# S8 C( K* ^. Z, r( }9 P
( i! O/ R0 t7 H) E0b00, 0b10: 2MHz6 f& x# G4 n7 |6 r3 ^/ V. K
& j0 S) H" S8 h4 ?
0b10: 10MHz
" l0 k. G/ q* ~
4 K- B/ i9 ~! ?4 B0b11: 50MHz
. ]6 _' A/ I! b5 R" J4 H
* J5 K- T0 X9 t& u1 V
  1. typedef enum
    % K/ a; O) C3 ~4 j7 o7 }4 L( c
  2. {$ G: j3 e: X( s; Q# v
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */3 |7 N/ c- J/ t  Y
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    ! W! W1 }, c- W
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */
    5 x0 V. f- R3 h; ]
  6. }GPIOSpeed_TypeDef;
    $ L! s# P, t" z" e+ I
  7. " P/ H" g8 A, k7 |$ X* @
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
      e8 t1 U3 z4 \6 h1 q
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
    : f" t. i+ D- U5 p! @& }* W% W
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

8 a/ y& D& m& Z5 n- P例如A9、A10都为50MHz:
# a+ N" k; ]2 f5 u2 n& Y+ O2 l- }+ N( C" ]1 y/ c' B0 W5 b* A; Y. g
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码
; t+ c0 n+ z9 @; Q! C- H  C
2.2 配置输入输出(MODER)2 ]; h# b/ d* q# b  k$ _
1 _, ]+ N; C/ S" N$ G6 ^9 q
2 V# y* o: H, y* p. e

) N0 X3 ?+ {. a' l! Z* A% e. J( U每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)
. S) \' p/ \6 i! h3 \. e6 T3 D9 [$ i4 {* E- q
0b00: Input
* J, a( }8 s- ~0 _% Y( h; Q8 L- ?' C- r% H, r& D
0b01: Output7 Z0 f; |% M$ o
6 k( q# C& B% @, j# G: x
0b10: AF5 r1 Z+ a- N" y) K5 b
( B7 b) i% t( j! m
0b11: Analog In/Out3 ]5 J1 l6 o$ l1 Q0 i
; T9 S$ ?$ y6 _: R& O! M0 M: F
  1. typedef enum  G, e' k! {1 r! A/ I% o9 ?8 K
  2. {) p7 f% Z$ k. ^) C* L4 N
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */8 O8 ^; n% a3 Z# @2 _
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */
    , c8 M! d+ N2 k2 h* a
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    / L- x2 O  C* S1 x6 S! r3 R
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */9 ]' L: r/ j+ K. ~
  7. }GPIOMode_TypeDef;
复制代码
- |4 E) k" X# E/ E6 f5 j
例如GPIOA9,GPIOA10为AF:. V3 n1 ~- q+ q! p0 U+ H( \
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码

# U. Q" r$ K7 [2.3 配置输出模式(OTYPER)
3 f' r6 F. N9 X4 x! b2 \; |; A( u% D. s! V5 R9 o6 ~
20210604084327134.png
* ]2 x  b: L% c4 p4 i" ^5 e$ C
$ w4 |5 j2 |9 {, K8 i/ |
每个bit表示输出模式,
/ `8 x8 O! \; b! _( g' H: g
" a' l  e' N* A; U* A* }0b0: PP模式;/ G( z4 }; o. S2 m/ q

) l9 i1 d) [9 m. L" E3 g, C0b1: OD模式。 ) J- f, H' C/ w4 n4 a# v

9 N: |2 Q9 T' c; E
  1. typedef enum! s6 a( q4 z7 m. l9 X% S! u
  2. {0 G6 n1 H. J. W% V5 Y( O" O
  3.   GPIO_OType_PP = 0x00,
    9 |& R0 j9 s% i2 y: @2 w: t
  4.   GPIO_OType_OD = 0x012 e' D! f2 K. ~7 z4 V
  5. }GPIOOType_TypeDef;
复制代码
7 b+ a2 G/ J: h, F2 T) r
例如:
/ k* e0 m% ]- d) {, O# Y2 T
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1))
    3 ~6 W' s  y7 o+ Z1 E( S) j
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码

" @$ t. G/ m4 U2.4 配置上下拉模式(PUPDR)
# B. ~: |8 y: t2 o
: f- w# o/ O, y% n+ E7 R
20210604085305353.png

" q5 e: V7 R$ d" }  n; h( m! y, n
5 y- [7 T, [( H1 ]: L! t5 O每2个位表示上下拉模式。, x7 U* L/ e; w8 I2 A7 e
  1. typedef enum2 f, ]* n7 R" q7 i
  2. {
    ( g- h1 i6 c4 P
  3.   GPIO_PuPd_NOPULL = 0x00,
    / W+ K  a" ?: _
  4.   GPIO_PuPd_UP     = 0x01,
    $ u, U  r$ ?- ^1 }: p7 ~
  5.   GPIO_PuPd_DOWN   = 0x02
    $ C& j% J* m$ s% I1 C5 F4 j/ a
  6. }GPIOPuPd_TypeDef;
复制代码
/ F& B4 d/ H( K+ l; A! ^/ l9 [# o) Q
例如:7 ?. ]; g  E+ l! A
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码
" l1 {3 E$ E& S* _
3. 输出6 b5 e: `9 X7 u6 s; T( I/ Q
输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:
5 o4 m4 ^0 s: p) k- `
/ j; B1 I& D/ _7 c3 ~9 j
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA) 2 X9 F& k2 M/ Z  a$ u
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码
4 D- u: r' c+ r5 x2 \" F9 g9 f
BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。
: h- _6 _) W! A$ c+ T; v
% L, R2 J  \/ Y. W5 W* U而BRR只有低16位有效,对应对应输出低电平操作。( Q% h  S- Q; X) i' \5 _
5 `: G& _0 u8 f2 T* k; _7 e
8bit总线输出" @# l! K# i) g! }# V6 _

; u1 p) Y- B; j% `. f: y# l
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO
" Y+ r9 B4 {/ d通过寄存器IDR读出对应I/O口的状态。低16位有效。
/ y/ ?: f2 f' ]! y" ?- r9 p& w8 i. Y* }" [+ B$ z" T9 ~
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码

  G/ Y) M; w1 b8 A9 K" I; \* S4 `
) M: ~; B( o8 P* ]$ u8 _1 L- L- \( p, P% H$ D* e/ s, }
20210603165224704.png
收藏 评论0 发布时间:2021-11-25 15:00

举报

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