一、GPIO库函数介绍

操作IO口之前必须要引入的源文件和头文件为:

  • 头文件:stm32f10x_gpio.h
  • 源文件:stm32f10x_gpio.c

对于调用方式不清晰的函数均可以先选中,右键Go To Definition 查看相关内容。
GPIO库函数

1、初始化函数(1个)

void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);

作用:初始化一个或多个IO口(同一组)的工作方式和速度。 主要操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器。

参数一GPIOx:GPIOA——GPIOG
参数二GPIO_InitStruct(结构体变量,名称任意起):包括GPIO_Pin、GPIO_Mode、GPIO_Speed。

typedef struct
{
  uint16_t GPIO_Pin;//指定要初始化的IO口
  GPIOSpeed_TypeDef GPIO_Speed;  //设置IO口输出速度
  GPIOMode_TypeDef GPIO_Mode;//设置工作模式,8种中的一种
}GPIO_InitTypeDef;

初始换函数示例:

	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量 
	
    //指定结构体成员变量	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PB.5 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ	
	//根据设定参数初始化GPIOB.5
	GPIO_Init(GPIOB,&GPIO_InitStructure);

2、读取输入电平函数(2个)

  • 读取某个GPIO输入电平(操作GPIOx_IDR寄存器)
 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

例如:

 uint8_t GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输入电平
  • 读取某组GPIO输入电平(操作GPIOx_IDR寄存器)
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

例如:

GPIO_ReadInputData(GPIOA);//读取GPIO组所有IO口的输入电平

3、读取输出电平函数(2个)

  • 读取某个GPIO输出电平(操作GPIOx_ODR寄存器)
 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

例如:

 uint8_t GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输出电平
  • 读取某组GPIO输出电平(操作GPIOx_ODR寄存器)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

例如:

GPIO_ReadOutputData(GPIOA);//读取GPIO组所有IO口的输出电平

4、设置输出电平函数(4个)

  • 设置某个IO口输出为高电平(1)(操作BSRR寄存器)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 设置某个IO口输出为低电平(0)(操作BRR寄存器)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 设置IO口输出电平(不常用)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

二、硬件连接

IO口输出高电平,LED灭;输出低电平,LED点亮。(1灭0亮)
在这里插入图片描述

GPIO的输出方式需要设置为推挽输出。 推挽输出既可以输出高电平,也可以输出低电平。输出高电平时,电流输出到负载,理解成推,输出低电平时,负载电流流向芯片,理解为拉,即挽。而开漏输出只能输出低电平,如果需要输出高电平,则需要外接上拉电阻,且开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

三、点亮LED灯

1、三个步骤:

  • 操作IO口之前,使能IO口时钟。不同的IO组,调用的时钟使能函数不一样。这里调用的是
    Void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • 初始化IO口模式。调用函数GPIO_Init()
  • 初始IO口,输出高低电平。
    GPIO_SetBits();
    GPIO_ResetBits();

2、点亮

首先再建立一个文件夹HardWare,并添加LED相关的头文件和源文件。
在这里插入图片描述

led.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
   
#endif

led.c

#include "led.h"
#include "stm32f10x.h"

void LED_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//使能GPIOB时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE ,ENABLE);//使能GPIOE时钟
   
   //指定结构体成员变量	
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PB.5 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ
   
   GPIO_Init(GPIOB,&GPIO_InitStructure);//根据设定参数初始化GPIOB.5
   GPIO_SetBits(GPIOB,GPIO_Pin_5);//初始默认LED熄灭,设置GPIOB.5输出为高电平
   
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PE.5 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ
   GPIO_Init(GPIOE,&GPIO_InitStructure);//根据设定参数初始化GPIOE.5
   GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置GPIOE.5输出为高电平
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int main()
{
   delay_init();//定义在SYSTEM文件夹里
   LED_Init();
   
   while(1)
   {
   	GPIO_SetBits(GPIOB,GPIO_Pin_5);//置1,熄灭LED灯
   	GPIO_SetBits(GPIOE,GPIO_Pin_5);
   	delay_ms(500);//通过延时简单达到闪烁的效果
   	
   	GPIO_ResetBits(GPIOB,GPIO_Pin_5);//置0,点亮LED灯
   	GPIO_ResetBits(GPIOE,GPIO_Pin_5);
   	delay_ms(500);	
   }
   
}

注意:(否则可能有警告)

  • 主函数大括号前后要空一行(最后一行要回车)
  • .h文件定义时#endif也要前后空一行

相关:关于推挽输出和开漏输出的理解

前一篇: STM32学习(3)——GPIO的8种工作方式及相关寄存器说明

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐