大白的stm32学习笔记(GPIO输出/点亮第一个灯)

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官方汉化使用手册。谢谢。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值