2016-09-23 100 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