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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32F0xx的IO口定义方式与STM32F10x类似,一组GPIO包含16个IO。每组GPIO同样用GPIO_TypeDef的结构指向对应的寄存器空间。
4 I; B. d. I) w; }- G
; s3 c" L& o" r4 @, c# W& A/ O: `
  1. <blockquote>#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
复制代码

6 y1 j* F# {/ K1 n0 g* u" U5 A但是寄存器空间与STM32F10x的不同。& ]$ |1 N* E+ ?6 r) m5 G
  1. <blockquote>typedef struct
复制代码
2 q( e1 l2 l4 D- J" V+ X! ]* W
1. 使能GPIO的RCC
+ T3 R& Z& [1 K0 Y  C& _RCC->AHBENR |= RCC_AHBPeriph_GPIOn) C9 U: a3 M/ \( ^+ X" m0 i( t
* G! ~% _9 k! T) F
其中n的范围为A-F。
% @* _5 O0 [& g# L$ v5 U: B8 o9 j* J# D* B
如果涉及到复用,与STM32F10x不同,这里用寄存器AFR[2]来设定复用。每个IO用4bit来选择复用功能,最多有8种复用。4 w9 E2 [8 X9 X1 {3 e2 t5 t. [
" u  h9 g/ |: @$ z
20210603162156418.png

% R9 s! h" _+ C( X6 R- R( n例如GPIOA9,GPIOA10的AFR设定:6 Q% T1 o* O! J; h% x9 l5 r
" R) B/ S$ P6 ], L8 e' f8 A
  1. *((uint32_t *)GPIOA->AFR + ((9 / 8))) &= ~(0x0000000F << ((9 % 8) * 4));
    2 s5 ?8 z) V" m! u- Z0 ~! Z+ x
  2. *((uint32_t *)GPIOA->AFR + ((9 / 8))) |= (0x00000001 << ((9 % 8) * 4));  
    / b1 l- {9 X4 z' h0 i6 w2 m+ X
  3. *((uint32_t *)GPIOA->AFR + ((10 / 8))) &= ~(0x0000000F << ((10 % 8) * 4));
    4 _  t1 ^& V6 D" z5 P
  4. *((uint32_t *)GPIOA->AFR + ((10 / 8))) |= (0x00000001 << ((10 % 8) * 4));  
复制代码
; V4 a: k+ r6 M
2. 配置GPIO
6 Z( c: F& E/ r0 G4 F1 B8 G2.1 设置输出频率(OSPEEDR)
" N! q3 {& c  H+ V4 m% j4 _* h2 v  M4 ^/ l% F
20210603171958361.png

+ i6 Z/ V7 T8 ]$ W! b3 O3 ?% ~6 E+ }. i/ Y4 e1 C9 K
每2个位配置一个Pin。默认是2MHz。
, N" d4 T% L: v$ I% \! m# s  y
- L! w9 W+ i0 K. d5 K0b00, 0b10: 2MHz
+ n: h+ F6 z6 t* G* l
1 }$ ^$ C9 R4 n0b10: 10MHz, F- f( c( g/ S- w
( ?: c, i. z# i8 k! D3 ~9 T; f
0b11: 50MHz
" t! g) r+ \; B7 O) n& U7 o/ ?
% g3 w4 o: n. n( K
  1. typedef enum
    " c1 m" H4 Z! N- J# B0 B2 r& [) m, @
  2. {7 u5 z) Q6 Q4 s3 k% m
  3.   GPIO_Speed_Level_1  = 0x00, /*!< I/O output speed: Low 2 MHz */
    3 E4 L5 Y5 d7 n/ n
  4.   GPIO_Speed_Level_2  = 0x01, /*!< I/O output speed: Medium 10 MHz */
    ; P1 L+ z3 d( M. h$ E# J0 t$ q
  5.   GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */) n' i4 t; `  X
  6. }GPIOSpeed_TypeDef;
    ) x1 ^) g! U7 `+ |2 ]) s
  7. ' ?0 B* E* W. o1 r
  8. #define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
    ; M( q' H! t% A
  9. #define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */# x; f" Z5 y( d: e0 q
  10. #define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
复制代码

, L! X. K1 c' L0 o2 S+ O例如A9、A10都为50MHz:
6 u# o5 E; G+ {1 O3 D5 h3 l1 k' A+ x
  1. GPIOA->OSPEEDR |= (0x0000000F << (9 * 2));
复制代码
5 f# m9 z2 n" h3 D' W1 Y; D3 U* R
2.2 配置输入输出(MODER)  j9 z5 o( W0 J
  r1 }. A, O7 {" L
' ~4 S5 u9 F( p- g8 ~4 A7 h2 p

( q4 M) ]; \+ V. D! n每2个位配置一个Pin。 默认Input(除了SWD的A13,A14)
3 r0 H! i( g! b& _* D0 }
2 @2 G7 S/ K) W) O. ~0b00: Input& D7 e7 K! j! r: V

, T: M. A. l5 S& p7 Y; Z$ L! A0b01: Output* Q6 o- t8 D) `; X
0 @) ?- T# B: V) v& x
0b10: AF
. q3 P1 m, l# h; x/ d- u& x8 J& p8 P' y' P
0b11: Analog In/Out+ t% t7 f* {0 U: u9 F/ ~

# U+ K2 @7 N/ H" C) K+ C* f& ?
  1. typedef enum
    3 U8 o2 S# K3 p6 I' |/ h9 Q! r
  2. {
    ; x& _6 J$ {3 j1 n& o; [, ^; r& |* i
  3.   GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              *// T! H# O1 F& t, {4 z& b
  4.   GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */
    % f$ N) k( P" m$ W! n
  5.   GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    - Y) }6 j6 G, s, D  T, B7 ~  D
  6.   GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */2 A6 Z( Q( c1 l1 o+ K) ~0 {
  7. }GPIOMode_TypeDef;
复制代码
. S3 N3 t1 E/ ^; F+ g+ h
例如GPIOA9,GPIOA10为AF:
( k5 D, Z5 e. e5 h8 E3 S: _
  1. GPIOA->MODER |= ((uint32_t)GPIO_Mode_AF << (9 * 2)) | ((uint32_t)GPIO_Mode_AF << (10 * 2));
复制代码
& u' T# e9 J+ h; z% l
2.3 配置输出模式(OTYPER)7 |+ v' h! H& t- r) u
2 H6 ?3 O7 T; B, @- e; O8 ?
20210604084327134.png
; y/ Y/ c, U2 q0 X; v7 B' i: X* `
2 D2 _8 M1 e& B3 r5 S5 s2 l) f1 @
每个bit表示输出模式,
3 q+ L8 j9 z3 \$ J$ [- k/ K( F& i
7 F, w! }$ p4 V$ Q3 G0b0: PP模式;( \4 N2 i( L1 V

% h+ l5 F& o8 L' u1 B: S0b1: OD模式。 : o, ^' k& K9 w) h/ U; x8 V

7 R1 A# q4 t1 c7 t8 V' \5 F4 p$ f7 N
  1. typedef enum( {2 ^- d$ J4 I3 T) u
  2. {9 r- P1 Q5 X$ X+ V
  3.   GPIO_OType_PP = 0x00,  M  \6 m2 W* S" j# Q4 w2 e
  4.   GPIO_OType_OD = 0x01
    6 C4 ~' ^: A$ T, n
  5. }GPIOOType_TypeDef;
复制代码

6 Q+ U0 O$ K( @4 e. @ 例如:+ `" [# S1 y# j5 z0 r
  1. GPIOA->OTYPER |= (((uint32_t)GPIO_OType_PP << (9 * 1))
    $ U& F" ], i3 g* P+ e
  2.     | ((uint32_t)GPIO_OType_PP << 10 * 1))
复制代码

+ R) [/ c7 ?' T( E2.4 配置上下拉模式(PUPDR): I8 [: s* U4 n0 k
7 V4 c2 f& h; F; H- h
20210604085305353.png
$ q7 k# X% l' i% \4 S+ t/ S

. T* ^  E0 k, }每2个位表示上下拉模式。
: c7 O5 ?' w, d- g. R/ ?
  1. typedef enum3 {9 v$ u: f8 ^
  2. {
    & D( r9 i* U0 h
  3.   GPIO_PuPd_NOPULL = 0x00,; j7 G6 T! A3 k6 r! G" z, {8 T
  4.   GPIO_PuPd_UP     = 0x01,
    ) V+ l. \8 ]3 v# q1 T+ N  `, l
  5.   GPIO_PuPd_DOWN   = 0x02
    / J* z! \, S" R: N& X/ T
  6. }GPIOPuPd_TypeDef;
复制代码

3 [) f2 [) `' F, j% g例如:4 G; I( ]2 q- p* `3 r5 a3 ?
  1. GPIOA->PUPDR &= ~((0x00000003 << (9 * 2)) | (0x00000003 << (10 * 2)));
复制代码
4 z  A' X  c) S
3. 输出
' i; Z0 w; J7 h输出电平通过寄存器BSRR(输出高电平和低电平)和BRR(输出低电平)实现,写入1表示对应操作,写入0无效。例如:) |( {( U1 |4 r$ t! S
% K1 ?0 D) ~$ I" k% a
  1. #define SDA_HIGH(n)                 IO_I2CIO_SDA->BSRR = ((uint32_t)1 << PIN_I2CIO_SDA)
    # b9 w- K' {& X
  2. #define SDA_LOW(n)                  IO_I2CIO_SDA->BRR = ((uint32_t)1 << PIN_I2CIO_SDA)
复制代码
$ f6 }" k! w& k6 O5 o( i
BSRR的低16位分别对应16个PIN的输出高电平操作,高16为对应输出低电平操作。5 ~$ v) |0 ?/ Y; E
1 u  z! o7 F  w. n0 f5 N3 B; h
而BRR只有低16位有效,对应对应输出低电平操作。! W2 \) A. p1 Z7 X# y* H
( n# h" C9 W/ o; ~- s7 p8 E) p% @
8bit总线输出
& F. H( c0 U; r  A
, W4 m" d3 p7 E! t
  1. #define I8080_D8_OUT(dat)           IO_I8080_D8->BSRR = (dat & 0xff) | ((uint32)((~dat) & 0xff) << 16)
复制代码
4. 读入IO0 q# a1 h& _- ?, G+ ~8 \. F( k
通过寄存器IDR读出对应I/O口的状态。低16位有效。
1 L; M% r5 u" O8 ^0 U1 O, R3 i' p2 p: O  W% @2 V( J% o" a$ }
  1. #define SDA_READ(n)                 (IO_I2CIO_SDA->IDR & ((uint32_t)1 << PIN_I2CIO_SDA))
复制代码
9 |# M4 s1 F) o! a9 ?+ K5 R

8 b: R- M3 U/ v, x5 s1 A8 I+ ?/ w1 X6 E. k- z) {
20210603165224704.png
收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答

所属标签

相似技术帖

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