久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

coocox學習系列之CoX_GPIO篇

作者:未知   來源:互聯網   點擊數:  更新時間:2014年08月16日   【字體:

1.GPIO接口設計思想

1.1CoX.GPIO發展過程,歷史版本
     CoX第一版從2009年開始,從CoX誕生開始,CoX的目標就是要做到在M系列的CPU上實現平滑移植。所以,GPIO的實現,第一版首先實現了,IO的模式配置(輸入、輸出)和管腳的上拉、下拉配置;然后,實現了IO管腳的狀態讀寫。具體可以從接口定義清晰的看出來:
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;
這樣的實現,確實可以大大減小IO操作的移植,因為我們在每個廠商實現一套API,以新唐為例:
COX_PIO_PI pi_pio =
{
       NUC_GPIO_Init,
       NUC_GPIO_SetDir,
       NUC_GPIO_Out,
       NUC_GPIO_Read,
       NUC_GPIO_Cfg 
};
在使用的時候,我們僅僅需要使用pi_pio的指針就可以調用GPIOAPI操作了,而且這個指針還可以被驅動嵌套使用。有興趣的可以參考NUC140-LB BoardCoOS例程,這個在www.coocox.org官網可以下載到。
然而,第一版有幾個明顯的不足:
1.                實現的功能很少,只有IO的基本配置和讀寫操作,沒有外部中斷實現,沒有多功能配置實現,以及一些其他特殊的功能。
2.                采用了結構體的形式,代碼的可讀性大大降低,效率也不高。
3.                CoX代碼不能搞定所有基本的事情,在使用CoX庫的使用還必須和廠商庫配套使用。
4.                CoX在第一版更多的注重外設模塊的移植,而忽略了系統。
    所以,CoX需要改進、升級。經常一年多時間的積累,在2011年開始推出CoX 2.0版本,這個版本解決了上述所有的缺點的同時,保留了CoX設計的初衷——那就是在M系類CPU上面的通用性。下面,詳細介紹2.0版的CoX.GPIO接口。
1.2通用強制接口
通用強制接口是提取的一套ARM Cortex M0/M3所有廠商系列MCU都具有的功能接口。本篇以新唐M051為例講解CoX.GPIO,其他系列大同小異, 提取GPIO通用接口的時候,是從以下角度出發考慮的:
u      配置一個GPIO管腳線
l        方向配置:
n        輸入  
n        輸出
n        硬件功能
l        外圍功能配置:
l        Pad配置:
n        驅動能力大小(電流)
n        開源/推挽
n        弱上拉/下拉電阻
u      GPIO管腳數據控制
l        輸出高/低電平
l        獲取管腳輸入值
u      輸入中斷(EXTI)
l        上升沿檢測
l        下降沿檢測
l        /下沿檢測
l        低電平檢測
l        高電平檢測
 
APIs分組完成以下幾大功能:
u      配置GPIO管腳線的函數:
l        xGPIODirModeSet
l        xGPIOSPinDirModeSet
l        xGPIOPinConfigure
u      讀回GPIO管腳線模式配置的函數:
l        xGPIODirModeGet
u      還有很方便的函數,可以將GPIO配置成想要的功能:
l        xGPIOSPinTypeGPIOInput
l        xGPIOSPinTypeGPIOOutput
l        xSPinTypeADC
l        xSPinTypeI2C
l        xSPinTypeSPI
l        xSPinTypeTimer
l        xSPinTypeUART
l        xSPinTypeACMP
u      處理GPIO中斷的APIs
l        xGPIOPinIntCallbackInit
l        xGPIOPinIntEnable
l        xGPIOSPinIntEnable
l        xGPIOPinIntDisable
l        xGPIOSPinIntDisable
l        xGPIOPinIntStatus
l        xGPIOPinIntClear
l        xGPIOSPinIntClear
u      處理GPIO Pin狀態的APIs
l        xGPIOPinRead
l        xGPIOSPinRead
l        xGPIOPinWrite
l        xGPIOSPinWrite
 
1.3通用非強制接口
 通用非強制接口是一部MCU通有的功能,而不是所有MCU都具有的功能接口:
l        xGPIOSPinTypeGPIOOutputOD
l        xGPIOSPinTypeGPIOOutputQB
l        xSPinTypePWM
l        xSPinTypeEXTINT
l        xSPinTypeEBI
 
CoX的宏定義的參數和APIs都是以' x '開頭的, 體現出CoX接口的特征。比如將 GPIOA Pin0配置成輸出模式, 代碼如下:
xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT);
函數和形式參數都是x開頭。
1.4廠商庫特色接口
特色接口是包括了通用性接口,和MCU特有功能的接口。比如:
void GPIOPinDebounceEnable(unsigned long ulPort, unsigned long ulPins);并不是通用強制型或者通用非強制型,而是MCU特有的功能,就是在廠商庫特色接口這一組。
 
另外廠商庫接口也實現了MCU其他所有的功能,比如:
void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins,
                      unsigned char ucVal);
也實現了GPIO管腳線模式的配置,這個在CoX接口的xGPIOPinWrite也是這個功能。其實這個時候xGPIOPinWrite的實現方式如下:
#define xGPIOPinWrite(ulPort, ulPins, ucVal)                                  \
        GPIOPinWrite(ulPort, ulPins, ucVal)
進行了一次宏定義包裝罷了,對應的參數也是進行的一次宏定義比如:
#define xGPIO_PIN_0             GPIO_PIN_0
 
2.設計技巧簡介
GPIOCoX接口創新性的提出了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);
現在用Short Pin作為參數,上面的功能可以這樣實現:
xGPIOSPinTypeGPIOOutput(PA0);
xGPIOSPinWrite(PA0, 1);
上面的Short Pin到底是如何實現的呢?看起來很神奇,以xGPIOSPinWrite為例說明它的實現過程:
#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),這個函數在廠商庫里面定義了的,所以實現了Pin寫的功能。
 
另外Short PinGPIO管腳的外設多功能復用操作也帶來了極大的方便,比如配置PD5I2Cclock腳功能,如下:
xSPinTypeI2C(I2C0SCK, PD5);
是不是很簡單。!上面的實現如下:
#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宏定義如下:

這個是根據多功能復用進行的編碼,視不同的芯片,這個編碼方式靈活多變。
 

//! Config the device i2c Address
//
#define AD7415_I2C_ADDRESS      0x48
 
//
//! Config the devide i2c bus master
//

//
//! Config the i2c SDA pin
//
#define AD7415_PIN_I2CSDA        PA8
 
//
//! Config the i2c SCL pin
//
#define AD7415_PIN_I2CSCK        PA9
因為有了xI2C0_BASE在驅動中就可以使能這個I2C外設,有了連接的管腳也就可以使能對應的GPIO PORT, xSysCtlPeripheralEnable2(AD7415_MASTER_BASE); 這里不在需要給出I2C0的外設使能ID,或者GPIOA的外設使能ID, 用戶移植的時候只需要從硬件連接角度出發,用了那個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 );
       }
      
}

關閉窗口

相關文章

主站蜘蛛池模板: 欧美 日韩 在线播放 | 精品国产伦一区二区三区观看体验 | 男人av在线播放 | 国产成人99久久亚洲综合精品 | 国产精品日韩欧美一区二区三区 | 女女百合av大片一区二区三区九县 | 成人在线免费观看 | 国产激情第一页 | 国产精品久久久久久久7777 | 日韩成人精品一区二区三区 | 在线观看精品视频网站 | 在线婷婷 | 中文字幕精品一区 | 99爱视频 | 成人av片在线观看 | 在线视频99 | 在线观看免费av片 | 欧美日批 | 亚洲欧美日韩久久 | 国产视频2021 | 欧美日韩亚洲系列 | 欧美专区在线视频 | 亚洲精品在线视频 | 最新av中文字幕 | 午夜免费视频观看 | 国产成人精品一区二区三区在线 | 少妇精品久久久久久久久久 | 久久精品欧美一区二区三区麻豆 | 美女日批免费视频 | 精品一区在线 | а_天堂中文最新版地址 | 色综合一区二区 | 9191av| 国产视频二区 | 国产成人在线播放 | 亚洲国产午夜 | 欧美一a | 亚洲精品免费视频 | 欧美又大粗又爽又黄大片视频 | 国产精品成人国产乱一区 | 不卡的av一区 |