(转)Cortex-M3 (NXP LPC1788)之GPIO

 经过前一篇的分析,现在可以进入C环境进行各个模块的学习。首先进行简单的GPIO控制LED灯的操作,开发板通过GPIO1.18控制LED灯,电路如下图:

GPIO_LED

为了对LPC1788的内部结构有更好的理解和学习,虽然NXP给出了封装好的库函数,但是我将自己编写代码便于直接对内部原理进行分析。代码如下

 

[cpp]
  1. #define rFIO1DIR    (*(volatile unsigned*)0x20098020) //高速GPIO 方向控制寄存器,用于配置管脚的输入或输出,默认为输入 
  2. #define rFIO1MASK   (*(volatile unsigned*)0x20098030) //高速GPIO 屏蔽寄存器,被屏蔽的位将不能进行GPIO的控制操作,默认无效 
  3. #define rFIO1PIN    (*(volatile unsigned*)0x20098034) //高速GPIO 管脚值寄存器,可以操作未被FIOXMASK屏蔽的GPIO端口 
  4. #define rFIO1SET    (*(volatile unsigned*)0x20098038) //高速GPIO 管脚置位寄存器,置一操作使相应位输出高电平 
  5. #define rFIO1CLR    (*(volatile unsigned*)0x2009803c) //高速GPIO 管脚清楚寄存器,置一操作使相应位输出低电平 
  6.  
  7. void Delay(int); 
  8. int main(void
  9.     rFIO1DIR |= (1<<18);//GPIO1.18 -> OUTPUT 
  10.     while(1) 
  11.     { 
  12.         rFIO1SET |= (1<<18);//输出高电平 可以用 rFIO1PIN |= (1<<18);  
  13.         Delay(500000); 
  14.         rFIO1CLR |= (1<<18);//输出低电平 可以用 rFIO1PIN &= ~(1<<18); 
  15.         Delay(500000); 
  16.     } 
  17.              
  18.  
  19. void Delay(int i) 
  20.     int k; 
  21.     for(k=0; k<i; k++); 
  22.  
  23.  
  24. void SystemInit (void
  25.      
#define rFIO1DIR	(*(volatile unsigned*)0x20098020) //高速GPIO 方向控制寄存器,用于配置管脚的输入或输出,默认为输入
#define rFIO1MASK 	(*(volatile unsigned*)0x20098030) //高速GPIO 屏蔽寄存器,被屏蔽的位将不能进行GPIO的控制操作,默认无效
#define rFIO1PIN	(*(volatile unsigned*)0x20098034) //高速GPIO 管脚值寄存器,可以操作未被FIOXMASK屏蔽的GPIO端口
#define rFIO1SET	(*(volatile unsigned*)0x20098038) //高速GPIO 管脚置位寄存器,置一操作使相应位输出高电平
#define rFIO1CLR	(*(volatile unsigned*)0x2009803c) //高速GPIO 管脚清楚寄存器,置一操作使相应位输出低电平

void Delay(int);
int main(void)
{
	rFIO1DIR |= (1<<18);//GPIO1.18 -> OUTPUT
	while(1)
	{
		rFIO1SET |= (1<<18);//输出高电平 可以用 rFIO1PIN |= (1<<18); 
		Delay(500000);
		rFIO1CLR |= (1<<18);//输出低电平 可以用 rFIO1PIN &= ~(1<<18);
		Delay(500000);
	}
			
}

void Delay(int i)
{
	int k;
	for(k=0; k<i; k++);
}


void SystemInit (void)
{
	
}

 

        程序比较简单,对于GPIO的操作我们可以使用输出置位寄存器FIOXSET和输出清零寄存器FIOXCLR进行操作,也可以直接使用GPIO管脚值寄存器FIOXPIN进行操作。程序最后写了一个void SystemInit(void)空函数,是因为在启动程序startup_LPC177x_8x.S中 IMPORT  SystemInit 声明了一个外部函数,并且LDR     R0, =SystemInit执行该函数。如果不定义该函数编译会报错。 我们可以在该函数中进行LPC1788的时钟初始化。我们的程序中没有进行初始化,根据LPC1788的数据手册,系统上电或任何复位,将使用内部的IRC作为时钟源。而后可以在软件上进行切换,而该切换就可以在void SystemInit(void)中实现。

        最后可以使用之前环境搭建中介绍的进行Debug调试或者下载程序。

posted on   tdyizhen1314  阅读(1697)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2012年9月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

导航

统计

点击右上角即可分享
微信分享提示