1)介绍:GPIO:(GeneralPurpose Input Output (通用输入/输出)简称为GPIO)
基本结构:
stm32f407VGT6这款单片机上共有PA‐PE共5×16共80个复用IO口,
每个通用I / O端口有4个32位配置寄存器(GPIOx_MODERGPIOx_OTYPER GPIOx_OSPEEDR GPIOx_PUPDR),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位的置位/复位寄存器(GPIOx_BSRR),32位锁定寄存器(GPIOx_LCKR)和两个32位的备用功能选择寄存器(GPIOx_AFRH GPIOx_AFRL),如图:
2)GPIO的工作模式:
跑马灯接的是PD12,PD13,PD14,PD15 4个PIN脚
1) 需要的库函数文件:
头文件:stm32f4xx_gpio.h
源文件:stm32f4xx_gpio.c
2) 重要函数
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct);
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitActionBitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
3) GPIO_Init初始化样例
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;//LED0和LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOD12,13
4) 读取输入电平函数
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin);
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
5) 读取输出电平函数
uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平
6) 4个设置输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为高电平(1)。实际操作BSRRL寄存器
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin);
作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
这两个函数不常用,也是用来设置IO口输出电平。
以上就是整个GPIO库函数的使用,总结下GPIO库函数的步骤:
1)使能IO口时钟。调用函数RCC_AHB1PeriphClockCmd();
不同的外设调用的时钟使能函数可能不一样
如图:GPIO是在AHB1总线上
2)初始化IO口模式。调用函数GPIO_Init();
3) 3)操作IO口,输出高低电平。
GPIO_SetBits();
GPIO_ResetBits();
源码:
Led.h
#ifndef_LED_H_H_H
#define_LED_H_H_H
#include"stm32f4xx_gpio.h"
#include"stm32f4xx_rcc.h"
#defineLED_GREEN GPIO_Pin_12
#defineLED_ORANGE GPIO_Pin_13
#defineLED_RED GPIO_Pin_14
#defineLED_BLUE GPIO_Pin_15
#defineLED_ON 1
#defineLED_OFF 0
voidLED_Init(void);
voidLED_Operate(uint16_t GPIO_Pin,int32_t operate);
#endif
Led.c
#include"led.h"
voidLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD,&GPIO_InitStruct);
}
voidLED_Operate(uint16_t GPIO_Pin,int32_t operate)
{
if(LED_ON == operate)
{
GPIO_SetBits(GPIOD,GPIO_Pin);
}
else if(LED_OFF == operate)
{
GPIO_ResetBits(GPIOD,GPIO_Pin);
}
}
Main.c
#include"led.h"
voidUser_Delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}
intmain(void)
{
LED_Init();
while(1)
{
LED_Operate(LED_GREEN,LED_ON);
User_Delay(0x3FFFFF);
LED_Operate(LED_GREEN,LED_OFF);
LED_Operate(LED_ORANGE,LED_ON);
User_Delay(0x3FFFFF);
LED_Operate(LED_ORANGE,LED_OFF);
LED_Operate(LED_RED,LED_ON);
User_Delay(0x3FFFFF);
LED_Operate(LED_RED,LED_OFF);
LED_Operate(LED_BLUE,LED_ON);
User_Delay(0x3FFFFF);
LED_Operate(LED_BLUE,LED_OFF);
User_Delay(0x3FFFFF);
}
}