国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 5468|回復: 1
打印 上一主題 下一主題

【CoX外設接口】CoX.GPIO詳細講解

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-1-4 15:32:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: coocox , cox , gpio
CoX.GPIO        
1.GPIO接口設計思想1.1CoX.GPIO發(fā)展過程,歷史版本
     CoX第一版從2009年開始,從CoX誕生開始,CoX的目標就是要做到在M系列的CPU上實現(xiàn)平滑移植。所以,GPIO的實現(xiàn),第一版首先實現(xiàn)了,IO的模式配置(輸入、輸出)和管腳的上拉、下拉配置;然后,實現(xiàn)了IO管腳的狀態(tài)讀寫。具體可以從接口定義清晰的看出來:
typedef struct {
  COX_Status (*Init) (COX_PIO_Dev pio);
  COX_Status (*Dir)  (COX_PIO_Dev pio, uint8_t dir);
  uint8_t     (*Out)  (COX_PIO_Dev pio, uint8_t level);
  uint8_t     (*Read) (COX_PIO_Dev pio);
  COX_Status (*Cfg)  (COX_PIO_Dev pio, uint8_t index, uint32_t arg, uint32_t *pre_arg);
} COX_PIO_PI_Def;
typedef const COX_PIO_PI_Def COX_PIO_PI;
這樣的實現(xiàn),確實可以大大減小IO操作的移植,因為我們在每個廠商實現(xiàn)一套API,以新唐為例:
COX_PIO_PI pi_pio =
{
        NUC_GPIO_Init,
        NUC_GPIO_SetDir,
        NUC_GPIO_Out,
        NUC_GPIO_Read,
        NUC_GPIO_Cfg  
};
在使用的時候,我們僅僅需要使用pi_pio的指針就可以調(diào)用GPIOAPI操作了,而且這個指針還可以被驅(qū)動嵌套使用。有興趣的可以參考NUC140-LB BoardCoOS例程,這個在www.coocox.org官網(wǎng)可以下載到。
然而,第一版有幾個明顯的不足:
1. 實現(xiàn)的功能很少,只有IO的基本配置和讀寫操作,沒有外部中斷實現(xiàn),沒有多功能配置實現(xiàn),以及一些其他特殊的功能。
2. 采用了結(jié)構(gòu)體的形式,代碼的可讀性大大降低,效率也不高。
3. CoX代碼不能搞定所有基本的事情,在使用CoX庫的使用還必須和廠商庫配套使用。
4. CoX在第一版更多的注重外設模塊的移植,而忽略了系統(tǒng)。
    所以,CoX需要改進、升級。經(jīng)常一年多時間的積累,在2011年開始推出CoX 2.0版本,這個版本解決了上述所有的缺點的同時,保留了CoX設計的初衷——那就是在M系類CPU上面的通用性。下面,詳細介紹2.0版的CoX.GPIO接口。

1.2通用強制接口
    通用強制接口是提取的一套ARM Cortex M0/M3所有廠商系列MCU都具有的功能接口。本篇以新唐M051為例講解CoX.GPIO,其他系列大同小異, 提取GPIO通用接口的時候,是從以下角度出發(fā)考慮的:
u 配置一個GPIO管腳線l 方向配置:n 輸入   n 輸出n 硬件功能l 外圍功能配置:l Pad配置:n 驅(qū)動能力大小(電流)n 開源/推挽n 弱上拉/下拉電阻u GPIO管腳數(shù)據(jù)控制l 輸出高/低電平l 獲取管腳輸入值u 輸入中斷(EXTI)l 上升沿檢測l 下降沿檢測l 上/下沿檢測l 低電平檢測l 高電平檢測
APIs分組完成以下幾大功能:
u 配置GPIO管腳線的函數(shù):l xGPIODirModeSetl xGPIOSPinDirModeSetl xGPIOPinConfigureu 讀回GPIO管腳線模式配置的函數(shù):l xGPIODirModeGetu 還有很方便的函數(shù),可以將GPIO配置成想要的功能:l xGPIOSPinTypeGPIOInputl xGPIOSPinTypeGPIOOutputl xSPinTypeADCl xSPinTypeI2Cl xSPinTypeSPIl xSPinTypeTimerl xSPinTypeUARTl xSPinTypeACMPu 處理GPIO中斷的APIsl xGPIOPinIntCallbackInitl xGPIOPinIntEnablel xGPIOSPinIntEnablel xGPIOPinIntDisablel xGPIOSPinIntDisablel xGPIOPinIntStatusl xGPIOPinIntClearl xGPIOSPinIntClearu 處理GPIO Pin狀態(tài)的APIsl xGPIOPinReadl xGPIOSPinReadl xGPIOPinWritel xGPIOSPinWrite

1.3通用非強制接口
通用非強制接口是一部MCU通有的功能,而不是所有MCU都具有的功能接口:
l xGPIOSPinTypeGPIOOutputODl xGPIOSPinTypeGPIOOutputQBl xSPinTypePWMl xSPinTypeEXTINTl xSPinTypeEBI

CoX的宏定義的參數(shù)和APIs都是以' x '開頭的, 體現(xiàn)出CoX接口的特征。比如將 GPIOA Pin0配置成輸出模式, 代碼如下:
xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT);
函數(shù)和形式參數(shù)都是x開頭。

1.4廠商庫特色接口
特色接口是包括了通用性接口,和MCU特有功能的接口。比如:
void GPIOPinDebounceEnable(unsigned long ulPort, unsigned long ulPins);并不是通用強制型或者通用非強制型,而是MCU特有的功能,就是在廠商庫特色接口這一組。
另外廠商庫接口也實現(xiàn)了MCU其他所有的功能,比如:
void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins,
                                 unsigned char ucVal);
也實現(xiàn)了GPIO管腳線模式的配置,這個在CoX接口的xGPIOPinWrite也是這個功能。其實這個時候xGPIOPinWrite的實現(xiàn)方式如下:
#definex GPIOPinWrite(ulPort,ulPins,ucVal)                              \
              GPIOPinWrite(ulPort, ulPins, ucVal)
進行了一次宏定義包裝罷了,對應的參數(shù)也是進行的一次宏定義比如:
#define xGPIO_PIN_0             GPIO_PIN_0


2.設計技巧簡介

    GPIOCoX接口創(chuàng)新性的提出了Short Pin,比如PA0 GPIOAPin0腳,它的定義如下:
    #define PA0                     PA0

    自從有了Short Pin之后,對GPIO的操作簡單多了,例如比如將 GPIOA Pin0配置成輸出模式,并輸出高電平, 代碼如下:
    xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT);
    xGPIOPinWrite(xGPIO_PORTA_BASE, xGPIO_PIN_0, 1);
    現(xiàn)在用Short Pin作為參數(shù),上面的功能可以這樣實現(xiàn):
    xGPIOSPinTypeGPIOOutput(PA0);
    xGPIOSPinWrite(PA0, 1);
    上面的Short Pin到底是如何實現(xiàn)的呢?看起來很神奇,以xGPIOSPinWrite為例說明它的實現(xiàn)過程:
    #define xGPIOSPinWrite(eShortPin, ucVal)                                 \        
                 GPIOSPinWrite(eShortPin, ucVal)
    #define GPIOSPinWrite(eShortPin, ucVal)                                   \  
                 GPIOPinWrite(G##eShortPin, ucVal)
    關于##, 其實是宏定義里面的高級用法,它是一個連接符,遇到此連接符,宏會一直展開下去,直到不能展開為止。G##eShortPin其實會連接為GPA0,而GPA0同樣是個宏定義,如下:
     #define GPA0      GPIO_PORTA_BASE, GPIO_PIN_0
     GPIOPinWrite(GPA0, ucVal)會進一步展開為GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, ucVal),這個函數(shù)在廠商庫里面定義了的,所以實現(xiàn)了Pin寫的功能。另外Short PinGPIO管腳的外設多功能復用操作也帶來了極大的方便,比如配置PD5I2Cclock腳功能,如下:
     xSPinTypeI2C(I2C0SCK, PD5);
    是不是很簡單!!!上面的實現(xiàn)如下:
    #define xSPinTypeI2C(ePeripheralPin, eShortPin)                  \
    do                                                                    \
    {                                                                     \         
              GPIOSPinConfigure(ePeripheralPin, eShortPin);           \         
              GPIOSPinFunctionSet(GPIO_FUNCTION_I2C,eShortPin);       \
     }                                                                     \
     while(0)
    #define GPIOSPinConfigure(ePeripheralPin, eShortPin)             \        
                GPIOPinConfigure(GPIO_##eShortPin##_##ePeripheralPin)
     上面的會連接成這樣GPIOPinConfigure(GPIO_PD5_I2C0SCK), GPIO_PD5_I2C0SCK宏定義如下:
     #define GPIO_PD5_I2C0SCK        0x00003510
     這個是根據(jù)多功能復用進行的編碼,視不同的芯片,這個編碼方式靈活多變。
     還有一些接口完全是為了移植方便性而產(chǎn)生的,比如xGPIOSPinToPort, 這個接口是由Short Pin就可以得到這個Pin所對應的PORT Base,而在CoX.SYSCTL中有一個接口xSysCtlPeripheralEnable2是使用外設地址Base為參數(shù)使能這個外設 (SYSCTL中維護了一個外設BASE-ID-INT的表),它實現(xiàn)的時候,是進行了一個Base到外設ID的一個轉(zhuǎn)換,最終還是調(diào)用xSysCtlPeripheralEnable使能外設的。但是有了這個功能,也很利于基于CoX驅(qū)動組件的移植性,例如在AD7415溫度傳感器是通過I2C接口進行數(shù)據(jù)通信的,在這個驅(qū)動組件頭文件中, 只需要考慮一下四個元素就可以平滑的使得這個驅(qū)動組件移植到其他的MCU(比如NUC1xx,或者STM32F1xx)
    //
    //! Config the device i2c Address
    //
    #define AD7415_I2C_ADDRESS      0x48

    //
    //! Config the devide i2c bus master
    //
    #define AD7415_MASTER_BASE     xI2C0_BASE

    //
    //! Config the i2c SDA pin
    //
    #define AD7415_PIN_I2CSDA        PA8

    //
    //! Config the i2c SCL pin
    //
    #define AD7415_PIN_I2CSCK        PA9
    因為有了xI2C0_BASE在驅(qū)動中就可以使能這個I2C外設,有了連接的管腳也就可以使能對應的GPIO PORT, xSysCtlPeripheralEnable2(AD7415_MASTER_BASE); 這里不在需要給出I2C0的外設使能ID,或者GPIOA的外設使能ID, 用戶移植的時候只需要從硬件連接角度出發(fā),用了那個I2C, 管腳是怎么連接的,而不需要考慮其他的元素。

3. GPIO接口使用示例與移植

   下面給出一個CoX.GPIO的示例,都是使用的通用強制型的接口,因此下面的例子在所有Cortex M0/M3上都是平滑移植的, 類似一個簡單的電燈程序。
void Blinky(void)
{   
    unsigned long i;           
     //   
    // Initionalize system clock.   
    //   
    xSysCtlPeripheralClockSourceSet( 12000000,  xSYSCTL_XTAL_12MHZ );           

    //   
    // Set GPIO port c pin 0 , 1 output mode.   
    //   
    xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT );   
    xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_1, xGPIO_DIR_MODE_OUT );            

    while (1)   
    {            
    //        
    // Delay some time.        
    //         
    for( i = 0; i < 0x1FFFF; i++ )                           
    //        
    // Output high level.        
    //         
    xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 1 );         

    for( i = 0; i < 0x1FFFF; i++ )                           
    //        
    // Output low level.        
    //         
    xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 0 );        
    }        
}


沙發(fā)
發(fā)表于 2013-1-6 08:29:41 | 只看該作者
不錯,學習ing。。。。。。。。。。。。。。
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产麻豆91欧美一区二区 | 国产成人亚洲精品无广告 | 欧美亚洲国产一区二区 | 国产大片线上免费看 | 日本成人免费在线视频 | 狼人射综合 | 手机看片欧美日韩 | 三级毛片国产三级毛片 | 久久久免费精品视频 | 国产亚洲一欧美一区二区三区 | 国产精品区牛牛影院 | 亚洲欧美一区二区三区在线播放 | 日韩hd| 国产福利片在线 易阳 | 亚洲高清自拍 | 四虎影视在线影院4hutv | 中文字幕一区二区区免 | 欧美一区二区三区免费不卡 | 国产一级做a爰片久久毛片男男 | 99热这里有精品 | jiuse在线| 日本不卡在线一区二区三区视频 | 日本不卡视频在线播放 | 真实乱视频国产免费观看 | 国产视频一区在线播放 | 91热播 | 亚洲天堂久久新 | 色费女人18毛片a级视频在线 | 欧美日中文字幕 | 99在线视频观看 | 欧美人与d0gxxx | 91国内揄拍国内精品对白 | 国产va免费精品观看精品 | 午夜激情福利 | 4438x17全国最大色成网站 | 一级特黄色毛片免费看 | 香蕉网在线观看 | 久久综合色综合 | 青青草原成人 | 日日艹夜夜艹 | 九九热视频免费观看 |