STM32(一)简介、GPIO
1.1 简介
1.1.1 芯片型号



1.1.2 引脚
从芯片上的小圆点开始逆时针从1开始编号。

1.1.3 IO速度
有3种速度可以选择,使用时选择满足要求的最低速度即可。

1.2 GPIO
STM32芯片的架构大致如下:

GPIO属于片上外设,它有4组(参见引脚图):
- GPIOA:
PA1 ~ PA15 - GPIOB:
PB1 ~ PB15 - GPIOC:
PC13 ~ PC15 - GPIOD:
PD0 ~ PD1
其中每一个GPIO的结构如下:

每一个GPIO都有8种工作模式,下面分别介绍。

1.2.1 输出模式
对应上面结构图的下半部分。
MOS管相关内容可以参考数电MOS管章节。
推挽:两个MOS管交替导通,输出高电平或低电平。

开漏:上面的PMOS保持断开(漏极开路),输出低电平或高阻。

通用:CPU控制。
复用:其他外设控制。

1.2.2 输入模式
对应上面结构图的上半部分,简化成如下电路。

- 输入上拉:使用上拉电阻(上拉电阻处的开关闭合),提供默认高电压。
- 输入下拉:使用下拉电阻,提供默认低电压。
- 输入浮空:都不使用,默认悬空。
- 模拟模式:先不管。
1.2.3 编程接口
| 编程接口 | 功能 |
|---|---|
GPIO_Init |
初始化IO引脚 |
GPIO_WriteBit |
向输出数据寄存器写1个比特位 |
GPIO_ReadInputDataBit |
从输入数据寄存器读1个比特位 |
GPIO_ReadOutputDataBit |
从输出数据寄存器读1个比特位 |
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);GPIO的8种模式:

1.3 实验
1.3.1 LED闪灯实验
开发板的PC13引脚连了一个LED,其电路如下,需要使用开漏模式,置1为高阻,LED灭,置0低电平点亮。

代码如下:
#include "stm32f10x.h"
#include "delay.h"
int main(void)
{
// 1. 开启GPIOC的时钟(这一步必须要有,后面章节会讲,先有个印象)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 2. 初始化IO引脚,PC13 通用输出开漏模式 2MHz
GPIO_InitTypeDef GPIO_InitStruct = {0}; // 不赋0也没问题,老师说为了避免奇怪的问题
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 3. 为输出寄存器赋值
while(1)
{
// 置1,高阻,灭
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
Delay(1000);
// 置0,低电平,亮
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
Delay(1000);
}
}1.3.2 按钮实验
PA0输出用于控制LED,推挽模式,写1亮。PA1输入用于读取按键状态,上拉模式,按键接地,按键按下为0(Bit_RESET),默认为1(Bit_SET)。
接线如下图:

#include "stm32f10x.h"
int main(void)
{
// 1. 开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 初始化IO引脚
// PA0 通用输出推挽模式 2MHz
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA1 通用输入上拉模式 2MHz
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 3. 循环读取PA1的状态,控制PA0的输出
while(1) {
// PA1 = 0,按下按钮,PA0写1,LED亮
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET) {
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
}
// PA1 = 1,松开按钮,PA0写0,LED灭
else {
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
}
}
}STM32(一)简介、GPIO
https://shuusui.site/blog/2026/04/21/hardware/stm32-1/