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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM