STM32学习笔记:GPIO输出控制详解

一、GPIO简介

       引脚电平 0-3.3V,部分可容忍5V,对输出而言最大只能输出3.3V,

       只要可以用高低电平来控制的地方,都可以用GPIO来完成,如果控制的功率比较大的设备,只需加入驱动电路即可

        GPIO 通用输入输出口,可配置为 8种 输入输出模式。

  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。而如果控制的是功率比较大的设备,只需要再添加驱动电路即可。

  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入(GPIO甚至还能配置成模拟信号输入的模式,配合内部的ADC外设就能直接读取模拟电压了)、ADC电压采集、模拟通信协议接收数据等。

  • 二、GPIO基本结构

      所有的 GPIO 都是挂载在 ABP2 总线结构上的
      每个 GPIOX 外设有 16 个引脚,编号从 0~15,比如GPIOA 的第0引脚称为 PAO
      每个 GPIO 模块内,主要包含了寄存器和驱动器这些东西,内核可以通过 APB2 总线对寄存器进行读写。
      stm32 是32位单片机,所以寄存器是32位,GPIO模块的寄存器只有低 16 对应IO 引脚
      其中的驱动器是用来增加信号的驱动能力,比如电灯操作

    三、 (重要)GPIO 位结构电路

    四、GPIO模式

    五、外设GPIO配置

    六、LED和蜂鸣器模块

    七、外设硬件电路

         GPIO在推挽输出模式下,高低电平均有较强的驱动能力,但在单片机里,一般用第一种,因为使用高电平弱驱动 ,低电平强驱动的规则

     

    八、LED闪烁电路接线:

     九、主要程序:

    1、第一步:使用RCC初始化GPIO时钟

    2、第二步:使用GPIO_Init函数初始化GPIO 

    3、第三步设置高低电平 

    1、点亮一个灯(低电平亮)(LED连接PA0口) 

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    int main(void)
    {
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使用RCC初始化GPIO时钟
    	
    	//使用GPIO_Init函数初始化GPIO
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //点灯通用推挽输出
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;          //用的是GPIOA外设的0号引脚
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //50兆hz的速度
    	
    	//用结构体的函数初始化GPIO口
    	GPIO_Init(GPIOA,&GPIO_InitStructure);              //第二个参数为指向结构体的指针,故传地址
    	
    	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
    	
    	while(1)
    	{
    		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    		Delay_ms(500);
    		GPIO_SetBits(GPIOA,GPIO_Pin_0);
    		Delay_ms(500);
    		
    		
    		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
    		//加两个延时函数
    		Delay_ms(500);//毫秒延时函数(参数500)
    		
    		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//熄灭LED
    		Delay_ms(500);//毫秒延时函数(参数500)
    		
    		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
    		Delay_ms(500);//毫秒延时函数(参数500)
    		//加两个延时函数
    		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
    		Delay_ms(500);
    		
    		
    	}
    }

    2、流水灯(低电平亮)(LED连接PA0~PA6)

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    int main(void)
    {
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;           //初始化所有端口 配置为推挽输出模式
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&GPIO_InitStructure);
    	
    	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
    	
    	while(1)
    	{
    		GPIO_Write(GPIOA,~0x0001); //0000 0000 0000 0001
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0002); //0000 0000 0000 0010
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0004); //0000 0000 0000 0100
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0008); //0000 0000 0000 1000
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0010); //0000 0000 0001 0000
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0020); //0000 0000 0010 0000
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0040); //0000 0000 0100 0000
    		Delay_ms(500);
    		GPIO_Write(GPIOA,~0x0080); //0000 0000 1000 0000
    		Delay_ms(500);
    	}
    }

    3、蜂鸣器(低电平的时候响)(蜂鸣器接口为PB12

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    int main(void)
    {
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&GPIO_InitStructure);
    	
    
    	
    	while(1)
    	{
    		GPIO_ResetBits(GPIOB,GPIO_Pin_12); 
    		Delay_ms(100);
    		GPIO_SetBits(GPIOB,GPIO_Pin_12); 
    		Delay_ms(100);
    		GPIO_ResetBits(GPIOB,GPIO_Pin_12); 
    		Delay_ms(100);
    		GPIO_SetBits(GPIOB,GPIO_Pin_12); 
    		Delay_ms(700);
    	}
    }

    十、下面是程序详解 :来自于博主的笔记:

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32学习笔记:GPIO输出控制详解

    发表评论