新闻  |   论坛  |   博客  |   在线研讨会
玩转GPIO之LPC2136中IOPIN的别样功能
xiajiashan | 2012-08-28 17:08:46    阅读:1043   发布文章

原创作品,转载请注明

作者:潇湘-,自动化大三(索漫科技linux驱动班学员)

一、目的

在LPC2136下,研究IOPIN置高电平与IOSET置高电平的区别。

二、缘由

在一系列实验时我发现,IOPIN寄存器在IODIR寄存器设置好方向后,也能实现输入和输出高低电平。和IOSET有所区别的是IOSET置高电平后要用IOCLR清除,而IOPIN只需要在变量赋值时重新覆盖即可。

三、实验过程

大家可以用小灯程序做个实验

在我的开发板中小灯的引脚如下图所示1.jpg 故做如下实验用IOPIN寄存器时

#define LED1 1<<16

#define LED2 1<<17

#define LED3 1<<18

#define LED4 1<<19

/****************************************************************************

* 名称:initSystem()

* 功能:初始化IO

****************************************************************************/

void initSystem(void)

{

 

IO1DIR = LED1|LED2|LED3|LED4;//设置方向

IO1SET = LED1|LED2|LED3|LED4 ;//高电平使灯灭

}

 

 

/****************************************************************************

* 名称:main()

* 功能:初始化led,并实现led4闪烁的效果。

****************************************************************************/

int main(void)

{

initSystem();

while(1)

{

 

IO1PIN = LED1|LED2|LED3 ;//123灯灭,4灯亮

delay(40);

IO1PIN = LED1|LED2|LED3|LED4 ;//1234灯全灭

delay(40);

}

return 0;

}

由此可见,用IOXPIN寄存器时发现LED4在闪烁,说明当把变量赋给IOXPIN寄存器时可以刷新

用IOSET寄存器时

int main(void)

{

initSystem();

while(1)

{

IO1SET = LED1|LED2|LED3;

delay(40);

IO1SET= LED1|LED2|LED3|LED4 ;

delay(40);

}

return 0;

}

发现LED4灯没有闪烁,说明IOXSET寄存器必须要IOCLR置一才能消去高电平。

 

下面请看数据手册中IOSET和IOCLR的解释

 

2.jpg

 

四、思考

数据手册告诉了我们。但是我发现IOPIN寄存器不只个状态寄存器,它也有别样的功能。程序在一定程度上可以简化,原来程序中,IOSET和IOCLR需要一起作用,如今只需要IOPIN一个寄存器就能解决了。

2012年6月19日

写于上海.松江

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
02年接触ARM和ucos,开发过有线和无线图像报警器,IPCamera,人脸识别系统,OCR识别系统,指纹识别系统,05年开始从事Linux及Rtems下WiFi,camera,Ethernet等驱动开发工作,专做嵌入式linux培训,致力于把我十年来的研发经验传授给每一个学员,招人的可以找我,ximenpiaoxue4016@sina.com
推荐文章
最近访客