電子工程網(wǎng)
標(biāo)題: 【CoX外設(shè)接口】CoX.GPIO詳細(xì)講解 [打印本頁(yè)]
作者: coocox 時(shí)間: 2013-1-4 15:32
標(biāo)題: 【CoX外設(shè)接口】CoX.GPIO詳細(xì)講解
CoX.GPIO
1.GPIO接口設(shè)計(jì)思想1.1CoX.GPIO發(fā)展過(guò)程,歷史版本 CoX第一版從2009年開(kāi)始,從CoX誕生開(kāi)始,CoX的目標(biāo)就是要做到在M系列的CPU上實(shí)現(xiàn)平滑移植。所以,GPIO的實(shí)現(xiàn),第一版首先實(shí)現(xiàn)了,IO的模式配置(輸入、輸出)和管腳的上拉、下拉配置;然后,實(shí)現(xiàn)了IO管腳的狀態(tài)讀寫(xiě)。具體可以從接口定義清晰的看出來(lá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;
這樣的實(shí)現(xiàn),確實(shí)可以大大減小IO操作的移植,因?yàn)槲覀冊(cè)诿總(gè)廠(chǎng)商實(shí)現(xiàn)一套API,以新唐為例:
COX_PIO_PI pi_pio =
{
NUC_GPIO_Init,
NUC_GPIO_SetDir,
NUC_GPIO_Out,
NUC_GPIO_Read,
NUC_GPIO_Cfg
};
在使用的時(shí)候,我們僅僅需要使用pi_pio的指針就可以調(diào)用GPIO的API操作了,而且這個(gè)指針還可以被驅(qū)動(dòng)嵌套使用。有興趣的可以參考NUC140-LB Board的CoOS例程,這個(gè)在www.coocox.org官網(wǎng)可以下載到。
然而,第一版有幾個(gè)明顯的不足:
1. 實(shí)現(xiàn)的功能很少,只有IO的基本配置和讀寫(xiě)操作,沒(méi)有外部中斷實(shí)現(xiàn),沒(méi)有多功能配置實(shí)現(xiàn),以及一些其他特殊的功能。
2. 采用了結(jié)構(gòu)體的形式,代碼的可讀性大大降低,效率也不高。
3. CoX代碼不能搞定所有基本的事情,在使用CoX庫(kù)的使用還必須和廠(chǎng)商庫(kù)配套使用。
4. CoX在第一版更多的注重外設(shè)模塊的移植,而忽略了系統(tǒng)。
所以,CoX需要改進(jìn)、升級(jí)。經(jīng)常一年多時(shí)間的積累,在2011年開(kāi)始推出CoX 2.0版本,這個(gè)版本解決了上述所有的缺點(diǎn)的同時(shí),保留了CoX設(shè)計(jì)的初衷——那就是在M系類(lèi)CPU上面的通用性。下面,詳細(xì)介紹2.0版的CoX.GPIO接口。
1.2通用強(qiáng)制接口 通用強(qiáng)制接口是提取的一套ARM Cortex M0/M3所有廠(chǎng)商系列MCU都具有的功能接口。本篇以新唐M051為例講解CoX.GPIO,其他系列大同小異, 提取GPIO通用接口的時(shí)候,是從以下角度出發(fā)考慮的:
u 配置一個(gè)GPIO管腳線(xiàn)l 方向配置:n 輸入 n 輸出n 硬件功能l 外圍功能配置:l Pad配置:n 驅(qū)動(dòng)能力大小(電流)n 開(kāi)源/推挽n 弱上拉/下拉電阻u GPIO管腳數(shù)據(jù)控制l 輸出高/低電平l 獲取管腳輸入值u 輸入中斷(EXTI)l 上升沿檢測(cè)l 下降沿檢測(cè)l 上/下沿檢測(cè)l 低電平檢測(cè)l 高電平檢測(cè)
APIs分組完成以下幾大功能:
u 配置GPIO管腳線(xiàn)的函數(shù):l xGPIODirModeSetl xGPIOSPinDirModeSetl xGPIOPinConfigureu 讀回GPIO管腳線(xiàn)模式配置的函數(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通用非強(qiáng)制接口 通用非強(qiáng)制接口是一部MCU通有的功能,而不是所有MCU都具有的功能接口:
l xGPIOSPinTypeGPIOOutputODl xGPIOSPinTypeGPIOOutputQBl xSPinTypePWMl xSPinTypeEXTINTl xSPinTypeEBI
CoX的宏定義的參數(shù)和APIs都是以' x '開(kāi)頭的, 體現(xiàn)出CoX接口的特征。比如將 GPIOA Pin0配置成輸出模式, 代碼如下:
xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT);
函數(shù)和形式參數(shù)都是x開(kāi)頭。
1.4廠(chǎng)商庫(kù)特色接口特色接口是包括了通用性接口,和MCU特有功能的接口。比如:
void GPIOPinDebounceEnable(unsigned long ulPort, unsigned long ulPins);并不是通用強(qiáng)制型或者通用非強(qiáng)制型,而是MCU特有的功能,就是在廠(chǎng)商庫(kù)特色接口這一組。
另外廠(chǎng)商庫(kù)接口也實(shí)現(xiàn)了MCU其他所有的功能,比如:
void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins,
unsigned char ucVal);
也實(shí)現(xiàn)了GPIO管腳線(xiàn)模式的配置,這個(gè)在CoX接口的xGPIOPinWrite也是這個(gè)功能。其實(shí)這個(gè)時(shí)候xGPIOPinWrite的實(shí)現(xiàn)方式如下:
#definex GPIOPinWrite(ulPort,ulPins,ucVal) \
GPIOPinWrite(ulPort, ulPins, ucVal)
進(jìn)行了一次宏定義包裝罷了,對(duì)應(yīng)的參數(shù)也是進(jìn)行的一次宏定義比如:
#define xGPIO_PIN_0 GPIO_PIN_0
2.設(shè)計(jì)技巧簡(jiǎn)介
GPIO的CoX接口創(chuàng)新性的提出了Short Pin,比如PA0 是GPIOA的Pin0腳,它的定義如下:
#define PA0 PA0
自從有了Short Pin之后,對(duì)GPIO的操作簡(jiǎn)單多了,例如比如將 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ù),上面的功能可以這樣實(shí)現(xiàn):
xGPIOSPinTypeGPIOOutput(PA0);
xGPIOSPinWrite(PA0, 1);
上面的Short Pin到底是如何實(shí)現(xiàn)的呢?看起來(lái)很神奇,以xGPIOSPinWrite為例說(shuō)明它的實(shí)現(xiàn)過(guò)程:
#define xGPIOSPinWrite(eShortPin, ucVal) \
GPIOSPinWrite(eShortPin, ucVal)
#define GPIOSPinWrite(eShortPin, ucVal) \
GPIOPinWrite(G##eShortPin, ucVal)
關(guān)于##, 其實(shí)是宏定義里面的高級(jí)用法,它是一個(gè)連接符,遇到此連接符,宏會(huì)一直展開(kāi)下去,直到不能展開(kāi)為止。G##eShortPin其實(shí)會(huì)連接為GPA0,而GPA0同樣是個(gè)宏定義,如下:
#define GPA0 GPIO_PORTA_BASE, GPIO_PIN_0
GPIOPinWrite(GPA0, ucVal)會(huì)進(jìn)一步展開(kāi)為GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, ucVal),這個(gè)函數(shù)在廠(chǎng)商庫(kù)里面定義了的,所以實(shí)現(xiàn)了Pin寫(xiě)的功能。另外Short Pin對(duì)GPIO管腳的外設(shè)多功能復(fù)用操作也帶來(lái)了極大的方便,比如配置PD5為I2C的clock腳功能,如下:
xSPinTypeI2C(I2C0SCK, PD5);
是不是很簡(jiǎn)單!!!上面的實(shí)現(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)
上面的會(huì)連接成這樣GPIOPinConfigure(GPIO_PD5_I2C0SCK), GPIO_PD5_I2C0SCK宏定義如下:
#define GPIO_PD5_I2C0SCK 0x00003510
這個(gè)是根據(jù)多功能復(fù)用進(jìn)行的編碼,視不同的芯片,這個(gè)編碼方式靈活多變。
還有一些接口完全是為了移植方便性而產(chǎn)生的,比如xGPIOSPinToPort, 這個(gè)接口是由Short Pin就可以得到這個(gè)Pin所對(duì)應(yīng)的PORT Base,而在CoX.SYSCTL中有一個(gè)接口xSysCtlPeripheralEnable2是使用外設(shè)地址Base為參數(shù)使能這個(gè)外設(shè) (在SYSCTL中維護(hù)了一個(gè)外設(shè)BASE-ID-INT的表),它實(shí)現(xiàn)的時(shí)候,是進(jìn)行了一個(gè)Base到外設(shè)ID的一個(gè)轉(zhuǎn)換,最終還是調(diào)用xSysCtlPeripheralEnable使能外設(shè)的。但是有了這個(gè)功能,也很利于基于CoX驅(qū)動(dòng)組件的移植性,例如在AD7415溫度傳感器是通過(guò)I2C接口進(jìn)行數(shù)據(jù)通信的,在這個(gè)驅(qū)動(dòng)組件頭文件中, 只需要考慮一下四個(gè)元素就可以平滑的使得這個(gè)驅(qū)動(dòng)組件移植到其他的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
因?yàn)橛辛藊I2C0_BASE在驅(qū)動(dòng)中就可以使能這個(gè)I2C外設(shè),有了連接的管腳也就可以使能對(duì)應(yīng)的GPIO PORT, 如xSysCtlPeripheralEnable2(AD7415_MASTER_BASE); 這里不在需要給出I2C0的外設(shè)使能ID,或者GPIOA的外設(shè)使能ID, 用戶(hù)移植的時(shí)候只需要從硬件連接角度出發(fā),用了那個(gè)I2C, 管腳是怎么連接的,而不需要考慮其他的元素。
3. GPIO接口使用示例與移植
下面給出一個(gè)CoX.GPIO的示例,都是使用的通用強(qiáng)制型的接口,因此下面的例子在所有Cortex M0/M3上都是平滑移植的, 類(lèi)似一個(gè)簡(jiǎn)單的電燈程序。
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 );
}
}
作者: david-xia 時(shí)間: 2013-1-6 08:29
不錯(cuò),學(xué)習(xí)ing。。。。。。。。。。。。。。
歡迎光臨 電子工程網(wǎng) (http://m.qingdxww.cn/) |
Powered by Discuz! X3.4 |
主站蜘蛛池模板:
欧美亚洲国产成人高清在线
|
国产特黄特色a级在线视频
国产特黄特色a级在线视
|
国产永久免费草莓网视频
|
亚洲三级在线播放
|
好男人新视频社区
|
国产一在线观看
|
亚洲邪恶天堂影院在线观看
|
日韩在线伦理片免费观看
|
成人午夜在线观看国产
|
日本韩国一区二区
|
黑人操女人视频
|
国产毛片久久国产
|
青青草国产
|
国产一卡二卡3卡4卡更新
|
九九精品在线观看
|
国产 日韩 欧美在线
|
9191国语精品高清在线最新
|
日韩在线观看不卡
|
青青视频网
|
欧美一区二区三区成人看不卡
|
久久精品免费i 国产
|
一个人www免费观看
一个人hd免费完整高清视频
|
小婷的嫩苞在线播放
|
国产一级二级在线观看
|
99久久免费精品
|
男人天堂2022
|
久久久久国产精品免费免费
|
特黄特色大片免费视频大全
|
国产精品免费精品自在线观看
|
婷婷色图
|
四虎影酷
|
色综合婷婷
|
日韩系列在线
|
黄页网站在线观看
|
久久麻豆精品
|
欧美有码在线
|
一级毛片在线视频
|
青青青爽国产在线视频
|
日韩精品一区二区三区视频
|
日韩精品一区二区三区视频网
|
青青草原国产在线观看
|