【時快訊】嵌入式:I/O接口擴展

2023-01-05 10:22:00 來源:51CTO博客

嵌入式:I/O接口擴展

S3C2410A共有117個多功能復用輸入輸出口(I/O口),分為8組PORT A~PORT H。PORT A除了作為功能口外,它只作為輸出口使用;其余的PORT B~PORT H都可以作為輸入輸出口使用。8組I/O口按照其位數的不同,可分為:


(資料圖片僅供參考)

1個23位的輸出口(PORT A)2個11位的I/O口(PORT B 和PORT H)4個16位的I/O口(PORT C、PORT D、PORT E、PORT G)1個8位的I/O口(PORT F)

端口控制寄存器

與配置I/O口相關的寄存器包括:

(1)端口控制寄存器(GPACON~GPHCON)S3C2410大部分引腳是復用的,在使用這些引腳之前,需要定義其中的一個功能,這個端口控制寄存器就是實現該功能的。

(2)端口數據寄存器(GPADAT~GPHDAT)如果端口被配置為輸出端口,可以將要輸出的數據寫入該端口數據寄存器,如果端口被配置為輸入端口,可以從端口數據寄存器讀取所輸入的數據。

(3)端口上拉寄存器(GPBUP~GPHUP)端口上拉寄存器控制著每個端口組的上拉寄存器的使能或禁止。0允許,1禁止。

(4)MISCELLANEOUS雜項控制寄存器控制著USB、時鐘、數據總線的端口屬性。

外部中斷控制寄存器(EXTINTN)

用來配置24個外部中斷請求信號的觸發方式(電平、邊沿)

I/O口編程實例

實例1

輸出實例:使用GPIO控制LED1~LED4,使其指示0~F的16進制數值(LED4為最高位,LED1為最低位)。

程序清單

#include  "config.h"   /**************************************************************************************   ** Function name: LED_DispNum   ** Descriptions: 控制LED1~LED4顯示指定16進制數值。LED4為最高位,     **                       LED1為最低為,點亮表示該位為1。         ** ** Output: 無   ********************************************************************************/     void  LED_DispNum(uint32 dat)   // Input: dat   顯示數值(低4位有效)     {         dat = dat & 0x0000000F;     // 參數過濾         // 控制LED4、LED3顯示(d3、d2位)         if(dat & 0x08) rGPHDAT = rGPHDAT | (0x01<<6);             else  rGPHDAT = rGPHDAT & (~(0x01<<6));          if(dat & 0x04) rGPHDAT = rGPHDAT | (0x01<<4);            else  rGPHDAT = rGPHDAT & (~(0x01<<4));                // 控制LED2、LED1顯示(d1、d0位)         rGPEDAT = (rGPEDAT & (~(0x03<<11))) | ((dat&0x03) << 11);       }    /******************************************************************************************     ** Function name: DelayNS     ** Descriptions: 長軟件延時。延時時間與系統時鐘有關。     ** Input: dly  延時參數,值越大,延時越久     ** Output: 無     *************************************************************************************/    void  DelayNS(uint32  dly)     {          uint32  i;         for(; dly>0; dly--)          for(i=0; i<50000; i++);     }int  main(void){       int  i;        // 初始化I/O    rGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22);        // rGPECON[25:22] = 0101b,設置GPE11、GPE12為GPIO輸出模式    rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8);          // rGPHCON[13:8] = 01xx01b,設置GPH4、GPH6為GPIO輸出模式            // LED顯示控制    while(1)    {                                // 控制LED指示0~F的16進制數值        for(i=0; i<16; i++)        {            LED_DispNum(i);     // 顯示數值i            DelayNS(5);        }    }    return(0);}
實例2

輸入實例: S3C2410A的GPF4口(輸入口)連接一個獨立按鍵KEY1。當KEY1鍵按下時,GPH10口(輸出口)上的蜂鳴器便發出聲響,松開按鍵時,蜂鳴器便停止發聲。

程序清單

#include  "config.h"   // 定義獨立按鍵KEY1的輸入口       #define     KEY_CON  (1<<4) /* GPF4口  */   // 定義蜂鳴器控制口       #define    BEEP    (1<<10)       /* GPH10口 */         #define    BEEP_MASK (~BEEP)  int  main(void)   {          // 初始化I/O         rGPFCON = (rGPFCON & (~(0x03<<8)));           // rGPFCON[9:8] = 00b,設置GPF4為GPIO輸入模式           rGPHCON = (rGPHCON & (~(0x01<<21))) | (0x01<<20);          //  rGPHCON[21:20] = 01b,設置GPH10為GPIO輸出模式           rGPHDAT = rGPHDAT & BEEP_MASK;         // 初始狀態按鍵未按下,設置GPH10=0,禁止蜂鳴器發聲                                 while(1)         {             if(rGPFDAT & KEY_CON)  // 判斷GPF4是否為高電平             {                   rGPHDAT = rGPHDAT & BEEP_MASK;                     // GPF4為高電平,按鍵未按下,則設置GPH10=0             }           else            {                   rGPHDAT = rGPHDAT | BEEP;                           // GPF4為低電平,按鍵已按下,則設置GPH10=1            }                     DelayNS(1);        }    return(0);}

標簽: 控制寄存器 數據寄存器 輸出模式

上一篇:當前要聞:LNMP架構環境之PHP+Mariadb環境項目:部署博客wordpress項目
下一篇:環球熱議:使用 Vue3 + Element Plus + Go 重構 ferry 工單系統