STM32F103C8T6的GPIO输出
一、GPIO简介
GPIO,全称General Purpose Input Output,即通用输入输出口。STM32F103C8T6共有16个GPIO口(GPIOA~GPIOE),每个GPIO口都有自己的控制寄存器,可通过寄存器写入控制字来控制GPIO口的状态。
STM32F103C8T6的GPIO引脚电平为0~3.3V,部分引脚可达到5V。GPIO口可配置为多种输入输出模式,包括:
- 输入模式:悬浮输入(默认状态)、上拉输入、下拉输入、模拟输入(用于ADC采集)。
- 输出模式:推挽输出、开漏输出、复用推挽输出。
二、GPIO基本结构
STM32的所有GPIO都挂载在APB2外设总线。GPIO外设的命名按照GPIOA、GPIOB等,每个GPIO外设有16个引脚,编号从015,即PA0PA15。
三、GPIO输出操作步骤
-
使用RCC开启GPIO时钟
首先,需要使用RCC(Reset and Clock Control)里面的APB2外设时钟控制函数来开启GPIO时钟。例如,要开启GPIOA的时钟,可以使用以下代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
使用GPIO_Init函数初始化GPIO
接下来,需要调用GPIO_Init函数来初始化GPIO。初始化时需要配置GPIO的模式(输入、输出等)、引脚号、速度等参数。例如,要将GPIOA的第0脚配置为推挽输出模式,可以使用以下代码:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
使用输出函数控制GPIO口
最后,可以使用GPIO的输出函数来控制GPIO口的电平。常用的输出函数有GPIO_SetBits(设置高电平)、GPIO_ResetBits(设置低电平)、GPIO_WriteBit(设置指定电平)和GPIO_Write(写入16位数据)。例如,要点亮连接到GPIOA第0脚的LED灯,可以使用以下代码:
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 设置GPIOA第0脚为低电平,点亮LED灯(假设LED灯负极接GPIO口)
四、代码
以下代码可用于通过GPIOA的第0脚点亮和熄灭LED灯:
#include "stm32f10x.h" // Device header | |
#include "Delay.h" // 延时函数库(需自行实现或引用) | |
int main() { | |
// 打开APB2的GPIOA时钟 | |
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); | |
// 初始化GPIOA第0脚为推挽输出模式,速度为50MHz | |
GPIO_InitTypeDef GPIO_InitStructure; | |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; | |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; | |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | |
GPIO_Init(GPIOA, &GPIO_InitStructure); | |
while (1) { | |
// 点亮LED灯,延时1秒 | |
GPIO_ResetBits(GPIOA, GPIO_Pin_0); | |
Delay_s(1); | |
// 熄灭LED灯,延时1秒 | |
GPIO_SetBits(GPIOA, GPIO_Pin_0); | |
Delay_s(1); | |
} | |
return 0; | |
} |
五、注意
- 引脚连接:确保LED灯或其他外设正确连接到GPIO引脚,并注意电源和地线的连接。
- 延时函数:示例代码中使用了Delay_s函数来实现延时,该函数需要自行实现或引用其他延时库。
- 保护电路:在连接外部设备时,注意添加必要的保护电路,如限流电阻、二极管等,以防止损坏STM32引脚或外部设备。