Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165903
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 806
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-05 10:31
个人简介

share your ideas

文章分类

全部博文(29)

文章存档

2015年(1)

2013年(28)

分类: C/C++

2013-08-14 20:26:56

一.GPIO控制器的使用

1.       同一时间只能作为输入或输出的引脚,输出,输入需要配置

2.       配置输入才能读引脚,当某一引脚驱动外部器件是必须设为输出,才可以控制其高低。

3.       在写引脚的高低时用DATA寄存器,作为输入引脚时,读这个寄存器就可以知道引脚的电平高低。作为输出引脚时写这个寄存器可以控制引脚的电平高低。功能控制寄存器

当需要P3.2 为输出时:操作如下:

1)因为引脚的服用功能,将43设为p3.2管教

IOCON->PIO3_2 &= ~0X07;

2)写入1,设为输出引脚

GPIO3->DIR |= 0X01;

3data寄存器写入高电平

GPIO3->DATA |= (1<<2);

二.相关结构体的定义

1)将与io 相关的寄存器封装在一个结构体中方便操作。

 

typedef struct

{

  union {

    __IO uint32_t MASKED_ACCESS[4096];  /*!< Offset: 0x0000 to 0x3FFC Port data Register for pins PIOn_0 to PIOn_11 (R/W) */

    struct {

         uint32_t RESERVED0[4095];

    __IO uint32_t DATA;                 /*!< Offset: 0x3FFC Port data Register (R/W) */

    };

  };

       uint32_t RESERVED1[4096];

  __IO uint32_t DIR;                    /*!< Offset: 0x8000 Data direction Register (R/W) */

  __IO uint32_t IS;                     /*!< Offset: 0x8004 Interrupt sense Register (R/W) */

  __IO uint32_t IBE;                    /*!< Offset: 0x8008 Interrupt both edges Register (R/W) */

  __IO uint32_t IEV;                    /*!< Offset: 0x800C Interrupt event Register  (R/W) */

  __IO uint32_t IE;                     /*!< Offset: 0x8010 Interrupt mask Register (R/W) */

  __IO uint32_t RIS;                    /*!< Offset: 0x8014 Raw interrupt status Register (R/ ) */

  __IO uint32_t MIS;                    /*!< Offset: 0x8018 Masked interrupt status Register (R/ ) */

  __IO uint32_t IC;                     /*!< Offset: 0x801C Interrupt clear Register (R/W) */

} LPC_GPIO_TypeDef;

/*@}*/ /* end of group LPC11xx_GPIO */

2)将硬件地址定义为c的响应类型,去除了直接操作硬件的麻烦

#define LPC_FLASH_BASE        (0x00000000UL)

#define LPC_RAM_BASE         (0x10000000UL)

#define LPC_APB0_BASE         (0x40000000UL)

#define LPC_AHB_BASE          (0x50000000UL)

 

#define LPC_GPIO_BASE         (LPC_AHB_BASE  + 0x00000)

#define LPC_GPIO0_BASE        (LPC_AHB_BASE  + 0x00000)

#define LPC_GPIO1_BASE        (LPC_AHB_BASE  + 0x10000)

#define LPC_GPIO2_BASE        (LPC_AHB_BASE  + 0x20000)

#define LPC_GPIO3_BASE        (LPC_AHB_BASE  + 0x30000)

 

3)将相应的硬件分装为不同的地址,原来是地址,给地址转换为C的方式 ,具体的将LPC_GPIO0_BASE这个地址强转换为LPC_GPIO_TypeDef的指针类型 ,这下一个地址变成了一个类int* datadefine 作用是给变量(地址)定义另外一个名字)这个指针里存放着LPC_GPIO3_BASE的真正的值

#define LPC_IOCON     ((LPC_IOCON_TypeDef  *) LPC_IOCON_BASE )

#define LPC_SYSCON    ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE)

 

#define LPC_GPIO0     ((LPC_GPIO_TypeDef    *) LPC_GPIO0_BASE )

#define LPC_GPIO1     ((LPC_GPIO_TypeDef   *) LPC_GPIO1_BASE )

#define LPC_GPIO2    ((LPC_GPIO_TypeDef    *) LPC_GPIO2_BASE )

#define LPC_GPIO3    ((LPC_GPIO_TypeDef    *) LPC_GPIO3_BASE )

 

4)定义一个有10个指针的数组,该指针指向一个函数,函数有一个参数,返回一个LPC_GPIO_TypeDef类型(该类型是一个结构体类型),初始化成三个元素,这三个元素是三个指针分别指向制定的元素

 

static LPC_GPIO_TypeDef (* const LPC_GPIO[4] ) = { LPC_GPIO0, LPC_GPIO1, LPC_GPIO2, LPC_GPIO3 };

 

5)访问数组的元素(是一个指针)指向一个结构体(LPC_GPIO_TypeDef类型)中的一个元素。

         LPC_GPIO[portNum]->DIR         |= 1<

类似:

typedef sruct {
    int data;
    int test;
}TypeDef;
int *value;
int *value1;
int *value2;

#define defdata   (TypeDef *)value;// 将value 强转换成TypeDef *类型。(以 value为基地址,偏移+data(int类型))

static typeDef (*GPIO[2] ) = { value1, value2 };//定义一个数组GPIO
GPIO[1]->data=4;

 







阅读(2795) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~