天天看点

初识stm32的GPIO

stm32端口有8中工作模式,4中输入(上拉、下拉、浮空、模拟输入),4中输出(开漏、推免、开漏复用、推免复用),具体8中工作模式区别可以参考博文:http://blog.csdn.net/lpp0900320123/article/details/27208911

问题:点亮开发板上的一个LED灯,0点亮,1熄灭;LED灯连接GPIOC的第3个管脚;

需要以下步骤:

(1)开启外设时钟

(2)配置管脚的输入输出方式

(3)设置管脚的电平

1.开启外设时钟

stm32的外设默认时钟源是关闭的,当用到相应的外设,再开启相应的外设的时钟,这样可以降低功耗;首先应该查看外设挂在哪条总线上,再调用相应的时钟函数,可以通过查看库帮助手册去查看总线上挂的相应的外设;

void RCC_AHBPeriphClockCmd  ( uint32_t  RCC_AHBPeriph,   FunctionalState  NewState  ) 

void RCC_APB1PeriphClockCmd  ( uint32_t  RCC_APB1Periph,  FunctionalState  NewState  ) 

void RCC_APB2PeriphClockCmd  ( uint32_t  RCC_APB2Periph,  FunctionalState  NewState   ) 

上面三个函数分别开启AHB、APB1、APB2 总线时钟。GPIOC挂在APB2总线上,所以需要APB2总线时钟。

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);

2.配置管脚的输入输出方式

st库通过函数GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 实现GPIO管脚的工作方式的配置,这里有一个自定义的数据类型GPIO_InitTypeDef,被封装成结构体了。

 typedef struct

{

  uint16_t GPIO_Pin;            //配置引脚

  GPIOSpeed_TypeDef GPIO_Speed;   //引脚的输出速度(输出模式下才配置)

  GPIOMode_TypeDef GPIO_Mode;    //引脚的工作模式

}GPIO_InitTypeDef;

下面是代码实现:

          GPIO_InitTypeDef GPIO_InitStruct;   //定义结构体变量

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5 ;

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推免输出

 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_Init(GPIOC,&GPIO_InitStruct);    //初始化

3.设置管脚的电平

设置管脚的电平的函数很多:

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, BitAction BitVal);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

可以查库的帮助手册,来了解这些函数的使用方法。

点亮LED:

GPIO_ResetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);