xpwin

LPC1768结构体定义寄存器

0
阅读(7773)

F:LPC1768流水灯  

2011-09-26 21:12:35|  分类: LPC1768调试笔记 |  标签: |字号 订阅

 
 
 

调试软件基于KEIL  Uv3 ,硬件原理图如下,8个LED灯连接到P2.0到P2.7引脚,。

  

基于KEIL的软件设计相对比较简单,KEIL为我们编写好了大部分代码,在LPC17xx.h头文件中,使用下面的方式定义寄存器,此处以GPIO端口寄存器举例。

首先定义一个结构体,注意结构体中变量的顺序应和GPIO寄存器的地址大小顺序一致,结构体占用8个字,即32个字节,十六进制为0x20。

typedef struct
       {
             __IO uint32_t FIODIR;
                      uint32_t RESERVED0[3];
              __IO uint32_t FIOMASK;
              __IO uint32_t FIOPIN;
              __IO uint32_t FIOSET;
              __O  uint32_t FIOCLR;
         } LPC_GPIO_TypeDef;

 

接下来定义GPIO寄存器的起始地址,UL为unsigned long

#define LPC_GPIO_BASE         (0x2009C000UL)

 

 

再然后使用LPC_GPIO_BASE(基址)定义每个端口的起始寄存器地址,注意每个端口寄存器地址之间相差0X20,即为32字节。

#define LPC_GPIO0_BASE        (LPC_GPIO_BASE + 0x00000)
        #define LPC_GPIO1_BASE        (LPC_GPIO_BASE + 0x00020)
        #define LPC_GPIO2_BASE        (LPC_GPIO_BASE + 0x00040)
       #define LPC_GPIO3_BASE        (LPC_GPIO_BASE + 0x00060)
       #define LPC_GPIO4_BASE        (LPC_GPIO_BASE + 0x00080)

 

再将每个端口的起始寄存器地址转换成结构体指针,即可通过指针访问寄存器了。

#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    )
         #define LPC_GPIO4             ((LPC_GPIO_TypeDef      *) LPC_GPIO4_BASE    )

 

 

一、首先选择LPC1768的引脚功能(寄存器:LPC_PINCON->PINSELx)(注:如果不设置此项,默认为第一功能,一般为通用输入输出端口)

LPC_PINCON->PINSELx寄存器是32位寄存器,每两个位控制一个端口的功能选择。

00:第一功能

01:第二功能

10:第三功能

11:第四功能

由原理图可知P2.0——P2.7均应设置为第一功能(通用GPIO),所以:

LPC_FIOPIN->FIOSEL4&=0x00000000; //选择P2.0——P2.7为第一引脚功能,即输入输出功能。

 

二、选择引脚模式(寄存器:LPC_PINCON->PINMODEx)

两个位控制一个引脚的模式

00:上拉电阻

01:中继模式

10:不上拉,也不下拉

11:下拉电阻

此处配置为上拉电阻模式LPC_PINCON->PINMODE4&=0x00000000;(默认即为上拉电阻模式)

 

三、选择引脚方向(LPC_GPIOx->FIODIR)

0:输入方向

1:输出方向

此处配置为输出方向:LPC_GPIO2->FIODIR|=0xFF;

 

四、设置引脚输出值

LPC_GPIOx->FIOSET 置1寄存器(1有效);

LPC_GPIOx->FIOCLR清0寄存器(1有效);

LPC_GPIOx->FIOPIN 全局影响,清醒状态下使用

 

流水灯程序代码如下:

#include <LPC17xx.h>

void delay(void)                                                                          //延时函数,随意延时一定时间

{

       unsigned int i,j;

       for(i=0;i<1000;i++)

              for(j=0;j<10000;j++);

 

}

 

/*端口初始化函数*/

void GPIO2_Init(void)

{

//     LPC_FIOCON->FIOSEL4&=0x00000000;                //选择引脚功能

//     LPC _FIOCON-.>FIOMODE4&=0x00000000;          //选择引脚模式

       LPC_GPIO2->FIODIR|=0xFF;                                     //端口为输出模式

       LPC_GPIO2->FIOPIN|=0xFF;                                 //关闭所有led

}

 

int main()

{

       unsigned char i,j=0xFF;

       SystemInit();                       /*此函数在system_LPC17xx.c中,提供时钟的配置*/

                                                /*若要调用此函数,必须把system_LPC17xx.c加入工程*/

       GPIO2_Init();

       while(1)

       {

              for(i=0;i<9;i++)

              {

                     LPC_GPIO2->FIOPIN=j;

                     delay();

                     j=j<<1;

              }    

              j=0xFF;

       }

// return 0;     

}