查看: 4460|回复: 1

[分享] 【我要分享】Cortex-M3 (NXP LPC1788)之GPIO

[复制链接]

该用户从未签到

17

主题

32

帖子

0

注册会员

Rank: 2

积分
85
最后登录
2018-6-13
发表于 2017-2-15 08:48:10 | 显示全部楼层 |阅读模式
首先进行简单的GPIO控制LED灯的操作,开发板通过GPIO1.18控制LED灯,电路如下图:

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

  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.     {
  10.         rFIO1DIR |= (1<<18);//GPIO1.18 -> OUTPUT
  11.         while(1)
  12.         {
  13.             rFIO1SET |= (1<<18);//输出高电平 可以用 rFIO1PIN |= (1<<18);  
  14.             Delay(500000);
  15.             rFIO1CLR |= (1<<18);//输出低电平 可以用 rFIO1PIN &= ~(1<<18);
  16.             Delay(500000);
  17.         }
  18.                  
  19.     }
  20.      
  21.     void Delay(int i)
  22.     {
  23.         int k;
  24.         for(k=0; k<i; k++);
  25.     }
  26.      
  27.      
  28.     void SystemInit (void)
  29.     {
  30.          
  31.     }

复制代码

  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. void Delay(int);
  7. int main(void)
  8. {
  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. {
  21.     int k;
  22.     for(k=0; k<i; k++);
  23. }


  24. void SystemInit (void)
  25. {
  26.    
  27. }


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

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

回复

使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2017-2-15 09:18:35 | 显示全部楼层
    谢谢分享                                    
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-24 23:11 , Processed in 0.087559 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表