STM32中GPIO的使用

楼主一直是一个实用主义者(虽然还是菜鸟一个),所以我们就不啰嗦了,直接从使用开始,具体的GPIO的各种属性,输入输出的配置等请自行查看相关资料。

我们打开一个ST官方库文件中的GPIO例子,(打开方法参考我的博客中的《如何使用ST官方库文件中的例子程序》一文)

如何使用ST官方库文件中的例子程序》连接地址

http://blog.csdn.net/thebestleo/article/details/44155611

我们剪辑出其中的重要程序部分,为了清晰,我删除了其中的一些英文注释,下面还会增加一下中文的注释

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  
  while (1)
  {
    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;

    /* Set PD0 and PD2 */
    GPIOD->BSRR = 0x00000005;
    /* Reset PD0 and PD2 */
    GPIOD->BRR  = 0x00000005;
  }
}

程序中while循环里使用了寄存器的方式来完成GPIO的操作,这里我们来改一下,全部用库文件的方式来完成,这里我们不考虑外围设备的状态(如LED灯的状态取决于硬件电路与STM32之间的连接,才能知道STM32输出高低电平后LED的亮灭),只考虑GPIO管脚的输出状态(0或者1)

此程序应该是一个双灯闪烁实验,在实际应用中应该加上一个延时程序,这里我们只介绍一下用法,所以不必过分纠结,此处我们只留一组寄存器操作代码作为对比

注解:程序中我习惯用//来注释一句程序,用/* */来注释下面的一段程序

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;   //定义一个GPIO_InitTypeDef类型的结构体

int main(void)
{
  
  /* 1、初始化GPIO */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);	         // 使能GPIOD的时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;         // 配置所用到的管脚

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // 配置所用到的管脚的输入输出模式

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		 // 配置所用到的管脚的速度

  // 将GPIOD和GPIO_InitStructure结构体的首地址作为参数传递给GPIO初始化函数GPIO_Init

  GPIO_Init(GPIOD, &GPIO_InitStructure);				 
  
  /* 2、操作GPIO */

  while (1)
  {
    
    GPIO_SetBits(GPIOD,GPIO_Pin_0);	  // D端口,0管脚置1

    GPIO_SetBits(GPIOD,GPIO_Pin_2);	  // D端口,2管脚置1
    
    GPIO_ResetBits(GPIOD,GPIO_Pin_0);     // D端口,0管脚置0
	
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);     // D端口,0管脚置0


    /* Set PD0 and PD2 */

    GPIOD->BSRR = 0x00000005;

    /* Reset PD0 and PD2 */

    GPIOD->BRR  = 0x00000005;

  }
}

分析上面的程序我们可以得出如下结论:GPIO的操作一共分为2步

1、对所用的GPIO进行初始化设置,初始化又分为3个步骤,

      1)、使能GPIOD的时钟

      2)、填充GPIO的属性结构体

      3)、传递参数至初始化函数

2、对GPIO进行操作



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值