2016-09-23 189 views
0

我有一個LPC板,我需要遍歷引腳,並檢查它們是否高或低,當我連接它們與一些LED /電線。我發現問題是引腳不是按特定順序排列的。我有20個輸入GPIO和20個輸出。C GPIO for循環

我已經將引腳定義爲宏表達式例如。 #define GPIO1 0,1 #define GPIO2 1,19然後我將它們存儲在一個數組中。 gpio_outputs[] = {GPIO1, etc};但如果我試圖爲這個數組的循環做它告訴我:「太少參數」

for (i=0;i<sizeof(gpio_outputs);i++){ 
// Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, gpio_outputs[i]); 
//} 

原型爲Chip_GPIO_SetPinDIROutput是:

Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, PIN_INDEX, PIN_NUMBER); 

現在,從我一直在讀,宏表達式不適用於此。所以我的問題是如何迭代每個GPIO而不必手動完成所有40個GPIO?

+0

定義一個具有正確引腳順序的數組,然後迭代它。 –

+0

所有的20個引腳是否在同一個實際的端口?你的宏中有兩個數字是什麼?不,宏不是這樣工作的,你將不得不擁有一張擁有你需要的實際數據的表。 「引腳索引」和「引腳編號」之間有什麼區別? – unwind

+0

有兩行。每一行都有一個索引。例如。左手排索引0,右手排1.這實際上並非如此,而是更容易解釋。實際的GPIO數字遍佈整個地方。例如。我有一個1,9針腳0,2。 https://cdn-shop.adafruit.com/1200x900/1342-00.jpg – Filip

回答

1
struct GPIO_Attr { uint8_t pinIndex, pinNumber; }; 
struct GPIO_Attr gpio_outputs[] = { {GPIO1}, {GPIO1} }; // Extra '{}' is necessary to initialize GPIO_Attr fields 
for (i=0;i<sizeof(gpio_outputs)/sizeof(gpio_outputs[0]);i++){ 
    Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, gpio_outputs[i].pinIndex, gpio_outputs[i].pinNumber); 
} 
+0

你能告訴我爲什麼你將sizeof(gpio_outputs)除以sizeof(gpio_outputs [ 0])? – Filip

+0

這是一個常見的習慣用於獲取數組長度爲C. sizeof(array)/ sizeof(array [0])=> total_array_size/array_element_size => length。 – pavnik