GPIO即General Purpose Input Output,就是我们俗称的I/O口。根据Input和OutPut我们不难看出I/O口具有输出和输入两种功能。输出模式下我们可以控制输出的高低电平,用来驱动LED、控制蜂鸣器、模拟通信协议输出时序。输入模式下可读取端口的高低电平或电压(一般来说电平之分高低,多是福特多少毫伏才叫电压是语言标准问题),用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。当然我们这次只讨论在输出模式下控制LED灯的亮灭
那么如图所示这是一个I/O口的基本结构图,本次我们只看输出控制即下面的虚线框图和附带的线路。
1.保护二级管:我们的I/O口可以承受3.3V的电压,所以当一电压值比3.3V还要大时,电流会从I/O口流向Vdd。若I/O口有一电压比Vss还要低时电流会从Vss流出I/O口,从而确保不会从电路内部汲取电流,达到保护电路的目的。
2.选择输出模式:我们的I/O口有三种输出模式,即推挽、开漏、关闭。P-MOS和N-MOS是一种电子开关。当输出数据寄存器为1时, P-MOS打开N-MOS关闭直接接到Vdd就是输出高电平。当输出数据寄存器为0时, P-MOS关闭N-MOS打开就是输出低电平。所以无论高低电平均有较强的驱动能力,所以又叫做强推输出模式。在推挽输出模式下,STM32具有绝对的控制权。本次我们的实验就是用推挽输出模式来控制LED灯的。在开漏模式下P-MOS没用,只用N-MOS工作。当为1时N-MOS断开,输出相当于断开,也就是高阻模式。当为0时N-MOS连接,只有低电平有驱动能力,高电平时没有驱动能力的,可作为通信协议的驱动方式。
下图是I/O口的三种模式,我们在点亮LED或使用蜂鸣器的时候用推挽输出模式即可。
#include "stm32f10x.h" //头文件(必须要的)
#include "LED.h" //你的函数的头文件
void LED_Init(void)//你自己起的函数名儿
{
GPIO_InitTypeDef GPIO_InitStructure;//自己设置的两个变量名称(任意起)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置输出模式(推挽输出,即高低电平有效)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5 ;//根据原理图找到连接的口在哪里改动
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置速度这个无所谓50mhz就好
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);//其中GPIOB,GPIO_Pin_5根据原理图选择配置
}
下面我会结合注释讲解一下我的代码。
1.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);我们要使能时钟,第一个参数是使能I/O口
以LED0为例,LED0连接在了PB5上所以第一个数据就是RCC_APB2Periph_GPIOB。
2.GPIO_InitStructure.GPIO_Mode= ;是设置的是输出模式即推挽输出模式,即赋值的是GPIO_Mode_Out_PP
3.GPIO_InitStructure.GPIO_Pin= ;指定IO口LED0连5口上所以使能就是GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5 ;
4.GPIO_SetBits(GPIOB,GPIO_Pin_5);SetBits是设置为高电平,因为我们不希望一开始就点亮LED灯,所以设置为高电平保持他灭掉。
至此,I/O输出就配置好了,如果今后要使用根据原理图改变参数就好了。
下面是具体实现LED闪烁的代码
#include "stm32f10x.h"
#include "LED.h" //配置头文件
#include "delay.h"
int main(void)
{
delay_init();//引用延迟函数
LED_Init();//引用配置LED的函数
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5); //I/O口赋高电平,LED不亮
delay_ms(500);//延迟500ms
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //I/O口赋低电平,LED亮
delay_ms(500);
}
}
本文资料来自B江自协STM32教学视频,正点原子教学视频,STM32官方汉化使用手册。谢谢。