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

一、基本使用流程

目录

一、基本使用流程

二、举例


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状态翻转

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值