干货专栏 | stm32学习入门之迷迷糊糊的IO口
本文以STM32f103系列为例
主讲如何对IO口进行操作
预计阅读5分钟
在我们初学stm32的时候,接触到的第一个部分就是IO口。我们该怎么使用IO口?我们又有些什么该注意的呢?
01
IO口的初始化
初步掌握 STM32 基本 IO 口的使用,是迈向 STM32 的第一步。STM32F103共有144个IO口,每个IO口有不同的功能。
11.png (583.66 KB, 下载次数: 27)
下载附件
保存到相册
2020-12-8 14:24 上传
附:IO口初始化代码
GPIO_InitTypeDef GPIO_InitStructure;
//定义结构体(结构体中包含了所有IO口初始化的配置,是初始化代码的基础,由官方库提供)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//开启时钟是微处理器运行必要的一步,不同IO口可能对应不同时钟哦!
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
//模式配置,stm32拥有的模式多种多样
GPIO_Init(GPIOC, &GPIO_InitStructure);
//初始化库函数
02
IO口模式的选择
STM32 的 IO 口相比 51 而言要复杂得多,所以使用起来也困难很多。首先 STM32 的 IO 口 可以由软件配置成如下 8 种模式。
12.png (103.08 KB, 下载次数: 34)
下载附件
保存到相册
2020-12-8 14:24 上传
(1)GPIO_Mode_AIN 模拟输入
用作内部ADC输入或DAC输出,预防干扰。
(2)GPIO_Mode_IN_FLOATING 浮空输入
浮空输入状态下,IO 的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。可做KEY按键识别,红外信号接入等。
(3)GPIO_Mode_IPD 下拉输入
当外部电路为低电平,IO口设为下拉模式。
(4)GPIO_Mode_IPU 上拉输入
当外部电路为高电平,IO口设为上拉模式。
(5)GPIO_Mode_Out_OD 开漏输出
外部电路没有上拉电阻时,只能提供低电平,有较好的电流吸纳能力;使用时需要根据情况选择上拉电阻值和电源来达到和外接设备的电平匹配。
(6)GPIO_Mode_Out_PP 推挽输出
最常用的一种输出模式,能输出高低电平,推拉式输出原理,提高了电路的负载能力,也提高了开关的工作速度;理解成推拉式输出,提高电路负载能力,也提高了开关的速率。
(7)GPIO_Mode_AF_OD 复用开漏输出
片内外设功能(TX1,MOSI,MISO.SCK.SS)。
(8)GPIO_Mode_AF_PP 复用推挽输出
片内外设功能(I2C的SCL,SDA)
每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问。STM32 的很多 IO 口都 是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势。
03
如何对IO口进行操作
确定好IO口的模式之后,将要开始对IO口进行操作。以下为ST官方库内对IO口操作的相关函数,为了便于大家保存学习,小行将内容整理成了图片形式。
13.png (258.04 KB, 下载次数: 27)
下载附件
保存到相册
2020-12-8 14:24 上传
14.png (220.93 KB, 下载次数: 30)
下载附件
保存到相册
2020-12-8 14:24 上传
04
STM32f103系列特殊IO口
在stm32f103系列众多IO口中,有五个特殊的IO口(PB3,PB4,PA13,PA14,PA15),它们用作JTAG/SWD仿真器的调试接口。
15.png (151.3 KB, 下载次数: 29)
下载附件
保存到相册
2020-12-8 14:24 上传
其中PA13,PA14分别作为SWD调试的SWIO和SWCLK;PB3,PB4,PA13,PA14,PA15共同用于JTAG。如果仅仅按照以上操作正常初始化,会发现无法对其进行操作!
16.png (88.74 KB, 下载次数: 33)
下载附件
保存到相册
2020-12-8 14:24 上传
那么我们应该如何解决这个问题呢
这五个IO引脚非常特殊,正常情况下作为SWJ仿真器的调试引脚,如果要作为普通IO口使用需要特别的配置。
以PA13为例,相较与其他的普通IO,PA13的Main function 为JTMS-SWDIO,反而普通IO口的功能在Alternate functions中的remap里。也就是说PA13要想当做普通IO口使用,就必须使用它复用功能中的重映射。因此就需要这样的两步操作:
一.在时钟配置中打开复用时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
二.对PA13引脚进行重映射: GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
这里重点叙述下步骤二的重映射操作。针对SWJ五个引脚的重映射操作方式。
17.png (111.81 KB, 下载次数: 40)
下载附件
保存到相册
2020-12-8 14:24 上传
总结可得,重映射的方式一共有三种。
*@arg GPIO_Remap_SWJ_NoJTRST:Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST
*@argGPIO_Remap_SWJ_JTAGDisable:JTAG-DP Disabled and SW-DP Enabled
*@arg GPIO_Remap_SWJ_Disable: Full SWJ Disabled (JTAG-DP + SW-DP)
只需要以上步骤,串口就可以正常使用啦 ~