2013-04-21 36 views
1

我是使用基于ARM Cortex M3的STM32f100RB的新手。我试图使用递归来处理GPIO输入,但它没有工作。任何人都可以告诉我为什么? 代码如下。 它应该设置GPIOc引脚9,当GPIOa引脚0是1.但它只是不工作..我可以使用递归来处理GPIO吗?

我不知道我是否可以发布这样的问题。如果它不正确,让我知道,谢谢。

void detect_input(void); 

    void main() 
    { 
     init_ports(); 
     detect_input(); 
     while(1) 
     { 
      GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET);//turn on the green led 
     } 
    } 

    void detect_input() 
    { 
     if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) 
     { 
     detect_input(); 
     } 
    } 
+2

这可能是一个坏主意,因为嵌入式系统没有太多的堆栈,并且你可以很容易地导致堆栈溢出这样的代码。 – 2013-04-21 11:24:54

+0

谢谢! @Joachim Pileborg它一定是原因。 – 2013-04-21 11:40:35

+1

嵌入或不嵌入,如果没有输入,你的代码会自行进入* infinity *,所以它基本上是一个非常糟糕的主意。我会考虑使用一个中断引脚,然后代码不需要做任何事情,直到发生一些输入,它可以花费所有时间来完成其他事情。 – 2013-05-02 09:17:02

回答

5

使用你的代码,你可能会得到一个计算器

正如我所见,在您的代码中,如果没有输入,那么您将调用函数detect_input(),并且没有其他停止条件。因此,依赖于使用的频率和堆栈大小,您将使用所有允许的堆栈内存。

因此,这通常不是一个好主意。

对于这个简单的情况下,你应该使用简单的while循环:

void detect_input() { 
    while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)); 
} 

在这种情况下,你将退出循环的时刻,输入将被接收。

+0

非常感谢。我要试试你的代码! – 2013-04-21 11:41:54