zoukankan      html  css  js  c++  java
  • (转)CortexM3 (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调试或者下载程序。

  • 相关阅读:
    Struts 2 Learning
    C/C++ Learning
    Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors
    Circular Queue Implementation Principle
    Linux Process Management && Process Scheduling Principle
    duxcms SQL Injection In /admin/module/loginMod.class.php
    oracle:批量插入不同方案对比
    oracle批量插入优化方案
    oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法
    hive:导出数据记录中null被替换为 的解决方案
  • 原文地址:https://www.cnblogs.com/tdyizhen1314/p/2703309.html
Copyright © 2011-2022 走看看