stm32_i/o口操作——01

来源:互联网 发布:unity3d培训多久学完 编辑:程序博客网 时间:2024/06/07 05:58

通过初始化结构体初始化GPIO的常用格式是:

GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//LED0-->PA.8端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数配置GPIO

上面代码的意思是设置GPIOB的第5个端口为推挽输出模式,同时速度为50M。从上面初始化代码可以看出,结构体GPIO_InitStructure的第一个成员变量GPIO_Pin用来设置是要初始化哪个或者哪些IO口;第二个成员变量GPIO_Mode是用来设置对应IO端口的输出输入模式,这些模式是上面我们讲解的8个模式,在MDK中是通过一个枚举类型定义的:

typedef enum

{ GPIO_Mode_AIN = 0x0,//模拟输入

GPIO_Mode_IN_FLOATING = 0x04,//浮空输入

GPIO_Mode_IPD = 0x28,//下拉输入

GPIO_Mode_IPU = 0x48,//上拉输入

GPIO_Mode_Out_OD = 0x14,//开漏输出

GPIO_Mode_Out_PP = 0x10,//通用推挽输出

GPIO_Mode_AF_OD = 0x1C,//复用开漏输出

GPIO_Mode_AF_PP = 0x18//复用推挽

}GPIOMode_TypeDef;

第三个参数是IO口速度设置,有三个可选值,在MDK中同样是通过枚举类型定义:

typedef enum

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz, 

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

这些入口参数的取值范围怎么定位,怎么快速定位到这些入口参数取值范围的枚举类型,在我们上面章节4.7的“快速组织代码”章节有讲解,不明白的朋友可以翻回去看一下,这里我们就不重复讲解,在后面的实验中,我们也不再去重复讲解怎么定位每个参数的取值范围的方法。

IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如图6.1.7所示:

在固件库中操作IDR寄存器读取IO端口数据是通过GPIO_ReadInputDataBit函数实现的:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

比如我要读GPIOA.5的电平状态,那么方法是:

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);

返回值是1(Bit_SET)或者0(Bit_RESET);

ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如图6.1.8所示:

在固件库中设置ODR寄存器的值来控制IO口的输出状态是通过函数GPIO_Write来实现的:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

该函数一般用来往一次性一个GPIO的多个端口设值。

BSRR寄存器是端口位设置/清除寄存器。该寄存器和ODR寄存器具有类似的作用,都可以用来设置GPIO端口的输出位是1还是0。下面我们看看该寄存器的描述如下图:

BRR寄存器是端口位清除寄存器。该寄存器的作用跟BSRR的高16位雷同,这里就不做详细讲解。在STM32固件库中,通过BSRR和BRR寄存器设置GPIO端口输出是通过函数

GPIO_SetBits()和函数GPIO_ResetBits()来完成的。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

在多数情况下,我们都是采用这两个函数来设置GPIO端口的输入和输出状态。比如我们要设置GPIOB.5输出1,那么方法为:

GPIO_SetBits(GPIOB, GPIO_Pin_5);

反之如果要设置GPIOB.5输出位0,方法为:

GPIO_ResetBits (GPIOB, GPIO_Pin_5);

GPIO相关的函数我们先讲解到这里。虽然IO操作步骤很简单,这里我们还是做个概括性的总结,操作步骤为:

1) 使能IO口时钟。调用函数为RCC_APB2PeriphClockCmd()。

2) 初始化IO参数。调用函数GPIO_Init();

3) 操作IO。操作IO的方法就是上面我们讲解的方法。

0 0
原创粉丝点击