2013-12-08 80 views
1

我一直在使用stm32f103,现在我想在stm32f407上吃一些代码。 要通过USART接口进行通信我在使用结构的形式FIFO查询,在头文件中定义:C/STM32结构指针

#define FIFO_BUF_SIZE   128 

typedef struct { 
    char data[FIFO_BUF_SIZE]; 
    uint16_t startIndex; 
    uint16_t endIndex; 
}FIFO, *ptrFIFO; 

全球这种结构的声明在源文件:

FIFO RX_Buff={{},0,0}; 
FIFO TX_Buff={{},0,0}; 

现在我希望把从数据字符数组先进先出查询:

void USART_PrintData(USART_TypeDef * USART, char str[]){ 
    ptrFIFO pTX = &TX_Buff; 
    int i=0; 

    while(str[i]!='\0'){ 
     FIFO_Put(pTX, str[i]); 
     i++; 
    } 
     //here in working program is code for sending data 
     //deleted from program for tests 
} 

void FIFO_Put(ptrFIFO fifo, char data){ 
    uint16_t tmp; 
    tmp = fifo->startIndex; 
    fifo->data[tmp]=data; 
    tmp = (tmp+1)%(FIFO_BUF_SIZE-1); 
    fifo->startIndex=tmp; 
} 

该代码已经工作的STM32F103但不会对F407。传递给FIFO_Put(最后一次登录后),并写入FIFO查询,PROGRAMM去Default_Handler或内存(取决于幽默的)奇怪的地址,但是当采用这种结构我直接正常工作:

void FIFO_Put(char data){ 
    uint16_t tmp; 
    tmp = TX_Buff.startIndex; 
    TX_Buff.data[tmp]=data; 
    tmp = (tmp+1)%(FIFO_BUF_SIZE-1); 
    TX_Buff.startIndex=tmp; 
} 

我没有想法是什么错误。

感谢您的任何帮助。


我试着调试,问题是在功能FIFO_Put()最后一行:

fifo->startIndex=tmp; 

当函数把最后的迹象FIFO,最后一行程序跳转后default_handler。 如果我评论这一行,程序工作正常。

+0

对我来说看起来不错。你可以将它附加到调试器吗? –

+0

也许这是堆栈大小问题? –

+0

谢谢!这是问题所在。我的项目基于本网站的模板:http://www.freddiechopin.info/。在链接器脚本中有两个堆栈:主堆栈和进程堆栈。第一个的大小设置为0,当我在1024程序重置开始工作。我想知道为什么有两个堆栈? – nawigator1

回答

0

检查程序堆栈大小 - 从我的经验来看,这种未定义的行为可能是由堆栈溢出引起的。