LPC1768结构体定义寄存器
0赞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;
}
