目录
上篇文章介绍了如何创建STM32的库函数版本的工程模板,本位我将介绍STM32GPIO的一些应用
一、GPIO简介
1.1简介
GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或者控制外部器件工作,即输入输出
1.2STM32 的 GPIO 特点
不同型号,IO口数量可能不一样,可通过选型手册快速查询
快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
每个IO口都可以做中断
支持 8 种工作模式:
(1). 输入模式(Input mode)
输入模式是GPIO端口最基本的工作模式,用于接收外部信号并读取其电平状态。在输入模式下,GPIO端口通常具有三种状态:高电平、低电平和浮空状态。当外部信号为高电平时,GPIO端口会输出高电平;当外部信号为低电平时,GPIO端口会输出低电平;当外部信号未接入时,GPIO端口处于浮空状态。
输入模式广泛应用于各种传感器、开关等场合,例如读取温度传感器、检测按键状态等。
(2). 输出模式(Output mode)
输出模式是GPIO端口另一个基本的工作模式,用于控制外部设备的状态。在输出模式下,GPIO端口可以输出高电平或低电平信号,从而控制外部设备的开关状态。
输出模式广泛应用于各种控制场合,例如控制LED灯、继电器等。
(3). 复用功能模式(Alternate function mode)
STM32微控制器内部集成了多种外设模块,例如串口、SPI、I2C等。在复用功能模式下,GPIO端口可以通过设置复用功能模式,将其与这些外设模块进行连接,从而实现与外设模块的通信功能。
复用功能模式广泛应用于各种通信场合,例如串口通信、SPI通信等。
(4). 模拟模式(Analog mode)
模拟模式是GPIO端口的一种特殊工作模式,用于输入或输出模拟信号。在模拟模式下,GPIO端口可以通过DAC(数字模拟转换器)输出模拟信号,或通过ADC(模拟数字转换器)输入模拟信号。
模拟模式广泛应用于各种模拟信号处理场合,例如音频信号处理、传感器信号采集等。
(5). 推挽输出模式(Push-pull output mode)
推挽输出模式是GPIO端口的一种特殊输出模式,用于控制需要较大输出电流的设备。在推挽输出模式下,GPIO端口可以输出高电平或低电平信号,并通过内部电路将输出电流放大,从而控制外部设备的状态。
推挽输出模式广泛应用于各种高电流控制场合,例如驱动电机、继电器等。
(6). 开漏输出模式(Open-drain output mode)
开漏输出模式是GPIO端口的另一种特殊输出模式,也用于控制需要较大输出电流的设备。在开漏输出模式下,GPIO端口可以输出低电平信号,并通过内部电路将输出电流放大,从而控制外部设备的状态。但是,当输出高电平信号时,GPIO端口不会输出电流,而是处于高阻态。
开漏输出模式广泛应用于各种高电流控制场合,例如驱动LED灯、I2C通信等。
(7). 外部中断模式(External interrupt mode)
外部中断模式是GPIO端口的一种特殊输入模式,用于检测外部信号的边沿变化并触发中断。在外部中断模式下,GPIO端口可以配置为上升沿触发、下降沿触发或双边沿触发模式,并在信号变化时触发中断,从而进行相关处理。
外部中断模式广泛应用于各种事件触发场合,例如检测按键状态、检测传感器信号等。
(8). 模拟中断模式(Analog interrupt mode)
模拟中断模式是GPIO端口的一种特殊输入模式,用于检测模拟信号的变化并触发中断。在模拟中断模式下,GPIO端口可以通过设置阈值,当模拟信号超过阈值时触发中断,并进行相关处理。
模拟中断模式广泛应用于各种模拟信号处理场合,例如音频信号处理、传感器信号采集等。
1.3STM32 的 GPIO 电气特性
STM32 的工作电压:2 V ≤ VDD ≤ 3.6 V
GPIO 的识别范围:COMS 端口:
-0.3 V ≤ VIL ≤ 1.164 V
1.833 V ≤ VIH ≤ 3.6 V
输出电流:单个 GPIO 最大 25mA
一、硬件电路
相信大家对于二极管都不陌生了,二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负极,又叫阴极,给二极管两极间加上正向电压时,二极管导通, 加上反向电压时,二极管截止。 二极管的导通和截止,则相当于开关的接通与断开。
下面给出Proteus仿真流水灯的电路图;
这边给的是共阴极数码管,单片机型号是STM32F103C8,当我们给GPIO高电平的适合二极管被点亮;我们下面给出两种实现流水灯的程序;
二、软件实现
for循环实现流水灯,给出代码和仿真结果
#include "stm32f10x.h"// Device header
#include "Delay.h"
typedef int unsigned uint;
typedef char unsigned uchar;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启外设GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO输出模式为推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//初始化PA——PA15引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//初始化给全低电平,二极管全灭
uchar i;
while(1)
{ /*从PA0到PA7依次点亮*/
for(i=0;i<8;i++)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0<<i, Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA, GPIO_Pin_0<<i, Bit_RESET);
Delay_s(100);
}
/*从PA7到PA0依次点亮*/
for(i=0;i<8;i++)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_7>>i, Bit_SET);
Delay_s(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_7>>i, Bit_RESET);
Delay_s(100);
}
}
}
下面用库函数版本实现流水灯;
#include "stm32f10x.h"// Device header
#include "Delay.h"
typedef int unsigned uint;
typedef char unsigned uchar;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启外设GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO输出模式为推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//初始化PA——PA15引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//初始化给全低电平,二极管全灭
uchar i;
while(1)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);
Delay_s(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);
Delay_s(100);//延时函数
GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);
Delay_s(100);
}
}
上面就是两种实现流水灯的方式了,其实还有很多种,大家可以自己试试,一起加油咯!