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

干货专栏 | stm32学习入门之迷迷糊糊的IO口

[复制链接]
STMCU-管管 发布时间:2020-12-8 14:29
干货专栏 | stm32学习入门之迷迷糊糊的IO口
7 a+ A+ v4 f' i2 H. t& T9 N! X
! r& q  B, F9 X' Q5 f
本文以STM32f103系列为例
9 W8 J" v% ~3 |" f7 {) o主讲如何对IO口进行操作: \7 p+ j* v) l0 m5 W* P4 V8 T! Z
预计阅读5分钟0 j7 V  n; }5 q4 \# a& F
    在我们初学stm32的时候,接触到的第一个部分就是IO口。我们该怎么使用IO口?我们又有些什么该注意的呢?8 p$ K) p& E# o% t3 L8 Q9 n. n

. `! P* h5 |; a. Y
$ w) L" L) h# D: d
015 I  ]! }3 L: ^4 {$ e
IO口的初始化
& V, G8 L4 \$ _& _  初步掌握 STM32 基本 IO 口的使用,是迈向 STM32 的第一步。STM32F103共有144个IO口,每个IO口有不同的功能。! i/ |( C/ g& K0 [5 n2 e6 L
11.png
附:IO口初始化代码
8 g5 g: S( X1 G# w; L1 AGPIO_InitTypeDef GPIO_InitStructure;     # @4 H3 d5 d$ o" Z5 A( S! I- e
//定义结构体(结构体中包含了所有IO口初始化的配置,是初始化代码的基础,由官方库提供)
  `  N4 G- Z% m$ G6 Z0 b8 XRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);7 o" ?1 U& D. C1 P2 k
//开启时钟是微处理器运行必要的一步,不同IO口可能对应不同时钟哦!
' B. r1 P% x, }1 f6 yGPIO_InitStructure.GPIO_Pin= GPIO_Pin_15;; J% d; F( R' b8 o, W. p, g4 x
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
: ^3 n/ U: f! N* J- Q. e//模式配置,stm32拥有的模式多种多样
! B: B! O9 C" G" ^9 j9 }" D: G- QGPIO_Init(GPIOC, &GPIO_InitStructure);
& ^; a+ I' R3 S$ ]//初始化库函数
3 S& i% v: V9 c& R0 k
, l2 \& o4 P' Y! i6 P  ?  o' d

  P; P+ P+ y. N; ?02
% d( l; P* ~8 AIO口模式的选择0 ^1 u: q+ \" e/ |+ e
    STM32 的 IO 口相比 51 而言要复杂得多,所以使用起来也困难很多。首先 STM32 的 IO 口 可以由软件配置成如下 8 种模式。6 R4 E- ]$ @+ S6 B  v, O
12.png
(1)GPIO_Mode_AIN 模拟输入
; H- U* R1 E1 f3 }    用作内部ADC输入或DAC输出,预防干扰。" s+ p+ W+ W0 w! F$ P1 e4 t  l
(2)GPIO_Mode_IN_FLOATING 浮空输入9 h5 |2 K( U( ]2 _
    浮空输入状态下,IO 的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。可做KEY按键识别,红外信号接入等。
; g8 f5 v8 j' u' `& U* |" b(3)GPIO_Mode_IPD 下拉输入( K$ }) z: T( K- F& y; _, [) |
    当外部电路为低电平,IO口设为下拉模式。
& ]" T" u; Q$ Y7 H& P(4)GPIO_Mode_IPU 上拉输入
; ~* N3 A: I, Q7 D. {: \% E, N( ]    当外部电路为高电平,IO口设为上拉模式。
/ ^9 J+ m' o0 ^4 {; ]1 D2 y# }/ X: P(5)GPIO_Mode_Out_OD 开漏输出7 z& j0 t+ m& Z' m. C* q/ f7 r
    外部电路没有上拉电阻时,只能提供低电平,有较好的电流吸纳能力;使用时需要根据情况选择上拉电阻值和电源来达到和外接设备的电平匹配。
- S- A, d3 G  M# `( Y* g6 i, j) J(6)GPIO_Mode_Out_PP 推挽输出% e. N6 s9 t% Y5 r9 S8 {' c; y
    最常用的一种输出模式,能输出高低电平,推拉式输出原理,提高了电路的负载能力,也提高了开关的工作速度;理解成推拉式输出,提高电路负载能力,也提高了开关的速率。# r% @' _/ |6 C% h) i
(7)GPIO_Mode_AF_OD 复用开漏输出
1 f# P% D2 X& k: r* O片内外设功能(TX1,MOSI,MISO.SCK.SS)。
+ r' [$ a- Z8 W1 x; q! B, Y) q(8)GPIO_Mode_AF_PP 复用推挽输出: o* Y$ o$ V9 R6 r; v& @4 B$ R$ d$ V
片内外设功能(I2C的SCL,SDA). A2 N& u1 j0 q. k/ }

2 J. E% F6 `0 U

8 R" l9 C: w4 D$ L/ e, Y    每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问。STM32 的很多 IO 口都 是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势。
! ^) p; Z. d& Q. Z3 E1 X: M' ^1 w  [7 E
# }1 S* ~" s9 L) u- W9 M: k3 k
03* k& l1 Y; N& M2 T+ L* A
如何对IO口进行操作; ~6 S# N: {* Z" z) t; U/ k
    确定好IO口的模式之后,将要开始对IO口进行操作。以下为ST官方库内对IO口操作的相关函数,为了便于大家保存学习,小行将内容整理成了图片形式。
6 }5 ]3 ~- n3 A* w- i9 g) F% G
13.png
14.png
8 e5 G6 g1 J2 p' [, y) G6 w+ |
0 z8 J3 W: E7 X+ o6 V

  W) z: a, N, ~* U
. ^- w7 X  {( Z/ s  Z( s
04
: u: P4 ~8 H1 ?1 CSTM32f103系列特殊IO口
& @, I# |5 s3 j- e    在stm32f103系列众多IO口中,有五个特殊的IO口(PB3,PB4,PA13,PA14,PA15),它们用作JTAG/SWD仿真器的调试接口。/ p, g7 ~3 j/ K3 o: i5 F* j& R+ H
15.png
    其中PA13,PA14分别作为SWD调试的SWIO和SWCLK;PB3,PB4,PA13,PA14,PA15共同用于JTAG。如果仅仅按照以上操作正常初始化,会发现无法对其进行操作!% e& ^4 r6 T! h- O
16.png
那么我们应该如何解决这个问题呢( y1 W; W! ~3 C) i/ Z8 i1 R5 \
    这五个IO引脚非常特殊,正常情况下作为SWJ仿真器的调试引脚,如果要作为普通IO口使用需要特别的配置。" L' m' \  {9 C3 ~! V; t. T
    以PA13为例,相较与其他的普通IO,PA13的Main function 为JTMS-SWDIO,反而普通IO口的功能在Alternate functions中的remap里。也就是说PA13要想当做普通IO口使用,就必须使用它复用功能中的重映射。因此就需要这样的两步操作:. _# i7 x" L- }, Q0 L  s. u; k
一.在时钟配置中打开复用时钟:  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);( q% G  |7 r) A  i$ y) W
二.对PA13引脚进行重映射:        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); # _$ D( q8 v: C4 n
/ P) @6 `' v; o* ^6 y. b7 U# ?$ J4 s
9 l3 h$ l: S# A
    这里重点叙述下步骤二的重映射操作。针对SWJ五个引脚的重映射操作方式。8 H7 G3 j3 s/ ~
17.png
总结可得,重映射的方式一共有三种。9 p' N. G( z$ V2 v/ r3 K
*@arg GPIO_Remap_SWJ_NoJTRST:Full SWJ Enabled (JTAG-DP + SW-DP)   but without JTRST
! N9 a+ s: ^& M& x5 i0 W' N/ l$ U*@argGPIO_Remap_SWJ_JTAGDisable:JTAG-DP Disabled and SW-DP Enabled
& Y/ R% i: u+ r& j0 o9 J*@arg GPIO_Remap_SWJ_Disable: Full SWJ Disabled (JTAG-DP + SW-DP)
5 i5 ^4 j" ^) ~2 q' O. N只需要以上步骤,串口就可以正常使用啦 ~
3 X9 Y5 X' h8 ?9 M
+ L/ N% z* ]3 l' d  v* U
赞 收藏 评论1 发布时间:2020-12-8 14:29

举报

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