share your ideas
分类: C/C++
2013-08-14 20:26:56
1. 同一时间只能作为输入或输出的引脚,输出,输入需要配置
2. 配置输入才能读引脚,当某一引脚驱动外部器件是必须设为输出,才可以控制其高低。
3. 在写引脚的高低时用DATA寄存器,作为输入引脚时,读这个寄存器就可以知道引脚的电平高低。作为输出引脚时写这个寄存器可以控制引脚的电平高低。功能控制寄存器
当需要P3.2 为输出时:操作如下:
1)因为引脚的服用功能,将43设为p3.2管教
IOCON->PIO3_2 &= ~0X07;
2)写入1,设为输出引脚
GPIO3->DIR |= 0X01;
3)data寄存器写入高电平
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* data(define 作用是给变量(地址)定义另外一个名字)这个指针里存放着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<
static typeDef (*GPIO[2] ) = { value1, value2 };//定义一个数组GPIO
类似:
typedef sruct {
int data;
int test;
}TypeDef;
int *value;
int *value1;
int *value2;
#define defdata (TypeDef *)value;// 将value 强转换成TypeDef *类型。(以 value为基地址,偏移+data(int类型))
GPIO[1]->data=4;