zoukankan      html  css  js  c++  java
  • LPC1768基本输入输出GPIO使用

      LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看.

      首先使用GPIO要打开GPIO的系统时钟

       

      LPC_SC->PCONP |= (1<<15);//gpio 时钟

      然后需要选择我们选定引脚的功能,有些引脚有多个功能,通过寄存器可以从中选择一个

       

      之后是设置相关引脚的外部电阻状态pinmode寄存器

       

      然后设置开漏方式pinmode_od

       

      到这里,引脚的基本功能就OK了,此时要操作GPIO还需要设置几个东西

    1. 输入输出方向FIODIR

     

    1. 方向设置之后就可以输入输出了,注意gpio的输入输出是通过三个寄存器完成,输出设置寄存器功能是将io口电平设置为高

     

      输出为低电平用输出清除寄存器

       

      获取输出状态使用端口值寄存器

       

      另外,当我们想要禁用某些端口的时候可以使用屏蔽寄存器

      

      我们可以看到,寄存器的访问都是三十二位的不是很方便,幸好lpc1768是支持位段操作的,我们可以将寄存器的位段定义成这个样子

    //位带操作,实现51类似的GPIO控制功能

    //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).

    //IO口操作宏定义

    #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

    #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))

    #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

     

    //IO口地址映射

    //输出寄存器

    #define GPIO0_ODR_Addr    (LPC_GPIO0_BASE+0x18) //0x2009C018

    #define GPIO1_ODR_Addr    (LPC_GPIO1_BASE+0x18) //0x2009C038

    #define GPIO2_ODR_Addr    (LPC_GPIO2_BASE+0x18) //0x2009C058

    #define GPIO3_ODR_Addr    (LPC_GPIO3_BASE+0x18) //0x2009C078

    #define GPIO4_ODR_Addr    (LPC_GPIO4_BASE+0x18) //0x2009C098

      

    //输入寄存器

    #define GPIO0_IDR_Addr    (LPC_GPIO0_BASE+0x14) //0x2009C014

    #define GPIO1_IDR_Addr    (LPC_GPIO1_BASE+0x14) //0x2009C034

    #define GPIO2_IDR_Addr    (LPC_GPIO2_BASE+0x14) //0x2009C054

    #define GPIO3_IDR_Addr    (LPC_GPIO3_BASE+0x14) //0x2009C074

    #define GPIO4_IDR_Addr    (LPC_GPIO4_BASE+0x14) //0x2009C094

     

    //方向寄存器

    #define GPIO0_DIR_Addr    (LPC_GPIO0_BASE+0x00) //0x2009C000

    #define GPIO1_DIR_Addr    (LPC_GPIO1_BASE+0x00) //0x2009C020

    #define GPIO2_DIR_Addr    (LPC_GPIO2_BASE+0x00) //0x2009C040

    #define GPIO3_DIR_Addr    (LPC_GPIO3_BASE+0x00) //0x2009C060

    #define GPIO4_DIR_Addr    (LPC_GPIO4_BASE+0x00) //0x2009C080

     

    //清零寄存器

    #define GPIO0_CLS_Addr    (LPC_GPIO0_BASE+0x1C) //0x2009C01C

    #define GPIO1_CLS_Addr    (LPC_GPIO1_BASE+0x1C) //0x2009C03C

    #define GPIO2_CLS_Addr    (LPC_GPIO2_BASE+0x1C) //0x2009C05C

    #define GPIO3_CLS_Addr    (LPC_GPIO3_BASE+0x1C) //0x2009C07C

    #define GPIO4_CLS_Addr    (LPC_GPIO4_BASE+0x1C) //0x2009C09C

     

    //IO口操作,只对单一的IO口!

    //确保n的值小于32!

    #define P0high(n)  BIT_ADDR(GPIO0_ODR_Addr,n)  //输出  0输出不变 1输出为1

    #define P0low(n)   BIT_ADDR(GPIO0_CLS_Addr,n)  // 清除   0输出不变 1输出0

    #define P0in(n)    BIT_ADDR(GPIO0_IDR_Addr,n)  //输入

    #define P0dir(n)   BIT_ADDR(GPIO0_DIR_Addr,n)  //方向 0输入1输出

         

     

    #define P1high(n)  BIT_ADDR(GPIO1_ODR_Addr,n)  //输出  0输出不变 1输出为1

    #define P1low(n)   BIT_ADDR(GPIO1_CLS_Addr,n)  // 清除   0输出不变 1输出0

    #define P1in(n)    BIT_ADDR(GPIO1_IDR_Addr,n)  //输入

    #define P1dir(n)   BIT_ADDR(GPIO1_DIR_Addr,n)  //方向 0输入1输出

     

    #define P2high(n)  BIT_ADDR(GPIO2_ODR_Addr,n)  //输出  0输出不变 1输出为1

    #define P2low(n)   BIT_ADDR(GPIO2_CLS_Addr,n)  // 清除   0输出不变 1输出0

    #define P2in(n)    BIT_ADDR(GPIO2_IDR_Addr,n)  //输入

    #define P2dir(n)   BIT_ADDR(GPIO2_DIR_Addr,n)  //方向 0输入1输出

     

    #define P3high(n)  BIT_ADDR(GPIO3_ODR_Addr,n)  //输出  0输出不变 1输出为1

    #define P3low(n)   BIT_ADDR(GPIO3_CLS_Addr,n)  // 清除   0输出不变 1输出0

    #define P3in(n)    BIT_ADDR(GPIO3_IDR_Addr,n)  //输入

    #define P3dir(n)   BIT_ADDR(GPIO3_DIR_Addr,n)  //方向 0输入1输出

     

    #define P4high(n)  BIT_ADDR(GPIO4_ODR_Addr,n)  //输出  0输出不变 1输出为1

    #define P4low(n)   BIT_ADDR(GPIO4_CLS_Addr,n)  // 清除   0输出不变 1输出0

    #define P4in(n)    BIT_ADDR(GPIO4_IDR_Addr,n)  //输入

    #define P4dir(n)   BIT_ADDR(GPIO4_DIR_Addr,n)  //方向 0输

    这样就可以很方便的控制IO口的输入输出方向和设置值以及获取值了(否则在某些io口模仿iic的应用中烦得要死啊).

    给一个相关的代码

    //led为p2.0

     

    void LedInit(void)

    {

        LPC_SC->PCONP |= (1<<15);//打开GPIO时钟

        LPC_PINCON->PINSEL4 &= ~(0X03L<<0);//gpio功能

        LPC_PINCON->PINMODE4 &= ~(0X03L<<0);//上拉电阻

        LPC_PINCON->PINMODE_OD2 &= ~(0X01<<0);//推挽模式

        P2dir(0) = 1;//输出

        P2high(0) = 1;//初始化高电平,灯灭

    }

     

    void LedSet(u8 set)

    {

        if(set)P2high(0) = 1;

        else P2low(0) = 1;

    }

  • 相关阅读:
    Spring Cloud Hystrix Dashboard的使用 5.1.3
    Spring Cloud Hystrix 服务容错保护 5.1
    Spring Cloud Ribbon 客户端负载均衡 4.3
    Spring Cloud 如何实现服务间的调用 4.2.3
    hadoop3.1集成yarn ha
    hadoop3.1 hdfs的api使用
    hadoop3.1 ha高可用部署
    hadoop3.1 分布式集群部署
    hadoop3.1伪分布式部署
    KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4336263.html
Copyright © 2011-2022 走看看