STM32学习笔记(5)——GPIO库函数操作

823 阅读2分钟

一、 寄存器开发与库函数开发优缺点

库函数:ST公司封装了一些函数,方便用户(程序员)二次开发,提高开发效果。


寄存器开发

寄存器优点:

  1. 代码精简,程序执行效果高(运行快)


寄存器缺点:

1、开发步骤繁琐,开发效率低。

2、开发难度高,程序维护困难,升级难。

3、程序可移植差。


库函数开发

库函数优点:

1、开发步骤相对比较简单,开发效率高。

2、开发难度低,程序维护容易,升级相对简单。

3、程序可移植强。


库函数缺点:

  1. 代码相对略多一些,程序执行效果相对寄存器低。


ST公司的库函数本质上是对寄存器的操作封闭。



二、库函数开发LED灯

库函数开发LED灯需要添加的库函数文件:stm32fxx_gpio.c


  • 理解LED电路原理


LE0连接在PF9。

PF9输出0(低电平),灯亮

PF9输出1(高电平),灯灭



2、打开GPIOA组时钟,(STM32所有外设时钟都是关闭的)

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


3、初始化GPIO PA0模式(输入)、上/下拉(上拉)


GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //引脚9

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式

GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //输出推挽

GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速度


GPIO_Init(GPIOF, &GPIO_InitStruct);


4、通过函数获取引脚电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


函数说明:

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

函数功能:使能/不使能AHB1总线外设时钟

uint32_t RCC_AHB1Periph:外设选择

FunctionalState NewState:是否使能


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

函数功能:GPIO外设初始化

GPIO_TypeDef* GPIOx:GPIO端口组( A B C D E F G )

GPIO_InitTypeDef* GPIO_InitStruc:GPIO引脚初始化结构


typedef struct

{

uint32_t GPIO_Pin; //引脚编号

GPIOMode_TypeDef GPIO_Mode; //模式

GPIOSpeed_TypeDef GPIO_Speed; //速度

GPIOOType_TypeDef GPIO_OType; //输出类型

GPIOPuPd_TypeDef GPIO_PuPd; //上下拉

}GPIO_InitTypeDef;


三、库函数开发按键

1、理解按键电路原理

S1按键连接PA0

S1按键未按下,PA0为高电平

S1按键 按下,PA0为低电平


2、打开GPIOA组时钟,(STM32所有外设时钟都是关闭的)

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


3、初始化GPIO PA0模式(输入)、上/下拉(上拉)


GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //引脚0

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式

GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉


GPIO_Init(GPIOA, &GPIO_InitStruct);


4、通过函数获取引脚电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


函数说明:


uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

函数功能:读取某个引脚电平


返回值:Bit_SET(高电平) Bit_RESET(低电平)

GPIO_TypeDef* GPIOx:GPIO端口组( A B C D E F G )

uint16_t GPIO_Pin:引脚