一、STM32 I/O 简介
在 STM32 中I/O 引脚,又称为 GPIO (General-Purpose I/O),可以被软件设置成各种不同的功能及模式。主要分为 GPIOA、GPIOB、 GPIOC......不同的组,每组端口分为 0~15,共 16 个不同的引脚。不同型号的芯片,具有不同的端口组和不同的引脚数量。
与 GPIO 相关的寄存器主要有以下几种
- 配置寄存器:配置 GPIO 的模式及状态,如输入/输出模式、复用功能及输出的最大速度等,如端口配置低寄存器(GPIOx_CRL)、端口配置高寄存器(GPIO_CRH);
- 数据寄存器:保存了 GPIO 的输入电平或将要输出的电平,如端口输入数据寄存器(GPIOx_IDR)、端口输出数据寄存器(GPIOx_ODR);
- 位控制寄存器:设置某引脚的数据为1 或 0,如端口位设置/清除寄存器(GPIOx_BSRR)、端口位清除寄存器(GPIOx_BRR);
- 锁定寄存器:设置某锁定引脚后,就不能修改其配置,如端口配置锁定寄存器(GPIOx_LCKR)(其中,x=A...E)。
1.1 GPIO 的 8 中工作模式


- 如上图所示,图的最右端为 I/O 引脚,左端的器件位于芯片内部。I/O 引脚并联了两个用于保护的二极管。结构图的上半部分为输入模式结构,下半部分为输出模式结构。I/O 引脚并联了两个用于保护的二极管。结构图的上半部分为输入模式结构,下半部分为输出模式结构。
- 输入输出模式结构都可以由软件分别配置成 8 种模式,包括:浮空输入、上拉输入、下拉输入 、模拟输入、通用开漏输出、通用推挽式输出、复用推挽式输出和复用开漏输出,见上表。
1.1.1 上拉、下拉和浮空输入配置

在上拉/下拉/浮空输入模式中,输出缓冲器被禁止,施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接,读输入数据寄存器的值可得到 I/O 状态
1.1.2 通用输出配置

图中箭头表示信号流动方向输出缓冲器是由 P-MOS 和 N-MOS 管组成的单元电路,推挽/开漏输出模式是根据其工作方式来命名的。当 I/O 端口被配置为输出时,输出缓冲器被激活,施密特触发输入被激活,弱上拉和下拉电阻被禁止。
1.1.3 复用输出配置

当 I/O 端口被配置为复用功能时,输出缓冲器被打开,内置外设的信号驱动输出缓冲器,施密特触发输入被激活,弱上拉和下拉电阻被禁止。至于选择复用开漏输出还是复用推挽输出,是根据 GPIO 复用功能来选择的,如 GPIO 的引脚用作串口输出,则使用复用推挽输出模式;如用在I2C、SMBUS 等这些需要"线与"功能的复用场合,就使用复用开漏模式。
1.1.4 模拟输入配置

模拟输入模式关闭了施密特触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送给 ADC 模块,由 ADC 采集电压信号。所以使用 ADC 外设时,必须设置为模拟输入模式。在此模式中,输出缓冲器被禁止,禁止施密特触发输入,实现了每个模拟 I/O 引脚上的零消耗,施密特触发输出值被强制置为 0,弱上拉和下拉电阻被禁止,读取输入数据寄存器时数值为0。配置时注意:GPIO 在输入模式下是不需要设置端口的最大输出速度的;在使用任何一种开漏模式时,都需要接上拉电阻。
1.2 GPIO 相关寄存器配置
调用库函数来配置寄存器,可以脱离底层寄存器操作,使得开发效率提高,同时易于阅读和维护。GPIO 相关的函数和定义分布在固件库文件 stm32f10x_gpio.c 和头文件 stm32f10x_gpio.h 文件中。
GPIO_InitTypeDef 结构体的定义:
cpp
typedef struct
{
uint16_t GPIO_Pin; //GPIO引脚
GPIOMode_TypeDef GPIO_Mode; //GPIO模式
GPIOSpeed_TypeDef GPIO_Speed; //GPIO速度
}GPIO_InitTypeDef;
I/O配置常用的寄存器:
- 端口输出数据寄存器 ODR 寄存器
- 端口输入数据寄存器 IDR
- 端口位设置/清除寄存器 (GPIOx_BSRR)
- 端口位清除寄存器 (GPIOx_BRR)
1.3 开启 I/O 端时钟
STM32 外设时钟默认是处在关闭状态的,因此初始化 GPIO 后,还需要使能外设时钟,GPIO 挂载在 APB2 总线上,需调用库函数 RCC_APB2PeriphClockCmd( )。
二、 SysTick 定时器
在 ARM Cortex-M3 内核中有一个 SysTick(滴答)定时器,它是一个 24 位的倒计数定时器,当计数到 0 时,它就会从 Load 寄存器中自动重装定时初值,只要不把 CTRL 寄存器中的ENABLE 清 0,它就永不停。
2.1、SysTick 定时器的时钟来源

滴答定时器不是系统时钟的 1/8,SysTick 定时器的时钟既可以是 HCLK/8,也可以是 HCLK,这个是通过 CTRL 寄存器进行设定的,操作系统的时钟要精确计算时钟时间,所以了解这一点对于计算很重要。
2.2、SysTick定时器的寄存器
- SysTick 的寄存器有 4 个,分别为:控制和状态寄存器;当前值寄存器;重装值寄存器;定时校验寄存器。
- 通常使用的前三个寄存器:
1)控制和状态(CTRL)寄存器

2)重装值( LOAD )寄存器

3)当前值(VAL)寄存器

2.3、SysTick定时器设定步骤
设定 Systick 定时器,需要四个步骤:
- 选择时钟源;
- 设定重载数(reload);
- 开启中断;
- 启动滴答定时器。
三、I/O 口位输出(流水灯)测试
四、I/O 口位输入(按键)测试
五、I/O 口组输出(扫描数码管)测试