学习总结_1_STM32_GPIO基本使用流程_库函数版

  • Post author:
  • Post category:其他


一、基本使用流程


目录


一、基本使用流程


二、举例


1、使能对应时钟,RCC_APB2Periph_GPIOx(X:A~G)设置为ENABLE

对应函数:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

2、对应pin脚初始化:

A、定义一个GPIO_InitTypeDef类型的结构体,可命名为GPIO_InitStructure(可自行定义);此结构体包含3个变量,分别是GPIO_Pin,GPIO_Speed,,GPIO_Mode ;

B、对上定义的结构体内的变量进行赋值,即选定IO口,输入输出的模式,上下拉功能,以及端口的输出速率;

C、使用初始化函数,初始化IO口:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

3、对IO口进行操作:

读操作:

A、当配置为普通 GPIO 输入时:可以使用如下两个函数读取IO口电平状态:

读取GPIOx内的一个IO口:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 

读取所有GPIOx内所有的IO口:

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

PS:回读是16位的数据,15~0分别对应GPIOx_Pin_15~0;

B、当配置为普通 GPIO 输出时,也可以回读IO口的状态;不过不同的输出模式实际读取的数据位置有所不同,在开漏模式时,读取的是输入数据寄存器,从而得到I/O口状态;在推挽模式时,则是读取输出数据寄存器,可以得到最后一次写的值,函数如下:

读取GPIOx内的一个IO口:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取所有GPIOx内所有的IO口:

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

写操作:

当配置为普通 GPIO 输出时:

同一GPIOx内,多个IO口设置输出高电平:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

同一GPIOx内,多个IO口设置输出低电平:

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

只能操作单一IO口,输出电平由函数的BitVal确定:

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

对整个GPIOx进行操作,输出电平由函数的PortVal确定:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

二、举例

1、输入:

选择GPIOA端口的PA1脚为输入脚,上拉输入模式:

void GPIO_PA1_Init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//拓展:RCC_APB2Periph可以是RCC_APB2Periph_GPIOx任意组合,其中x可以为A~G,使用“|”隔开,如“RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB”

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择Pin1脚,
	//拓展:GPIO_Pin_x,其中x可以为0~15,All,任意组合,使用“|”隔开,如“GPIO_Pin_1 | GPIO_Pin_15”
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //一般按最快的响应速度

	GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA1
}

在调用GPIO_PA1_Init()函数初始化后,可以使用函数读取PA1的电平状态,如:

	u8 read_Val1;
	u16 read_Val2;
	read_Val1 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); //读取PA1的电平
	read_Val2 = GPIO_ReadInputData(GPIOA) & GPIO_Pin_1; //读取PA1的电平

2、输出:

选择GPIOB端口的PB0脚为输出脚,推挽输出模式:

void GPIO_PB0_Init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择Pin0脚,拓展:GPIO_Pin_x,其中x可以为0~15,All,任意组合
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //一般按最快的响应速度

	GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB0
}

在调用GPIO_PB0_Init()函数初始化后,可以使用函数控制PB0的输出状态,如:

GPIO_SetBits(GPIOB, GPIO_Pin_0);//PB0输出高电平
	
GPIO_ResetBits(GPIOB, GPIO_Pin_0);//PB0输出低电平

GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 0);//PB0输出低电平

GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 1);//PB0输出高电平

GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0));//PB0状态翻转



版权声明:本文为weixin_57030543原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。