C STM32F4多SPI_I2S_GetFlagStatus使程序崩溃

C STM32F4多SPI_I2S_GetFlagStatus使程序崩溃,c,stm32,spi,C,Stm32,Spi,我正试图在我的STM32F41RE核子板上实现一个简单的http服务器,但当然我遇到了一些问题-到目前为止,我设法将当前的http服务器缩小到这样一个事实,即在大约20次调用 SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE);我的程序崩溃了。所谓崩溃,是指进入启动文件中定义的无限循环,原因是“程序接收信号SIGINT,中断” 我的spi初始化如下: void SPI1_Init(void){ GPIO_InitTypeDef GPIO_InitStru

我正试图在我的STM32F41RE核子板上实现一个简单的http服务器,但当然我遇到了一些问题-到目前为止,我设法将当前的http服务器缩小到这样一个事实,即在大约20次调用 SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE);我的程序崩溃了。所谓崩溃,是指进入启动文件中定义的无限循环,原因是“程序接收信号SIGINT,中断”

我的spi初始化如下:

void SPI1_Init(void){

GPIO_InitTypeDef GPIO_InitStructure;

/* Enable SPI1 and GPIOA clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);


//SCK, MISO, MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

    //CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//CS down
GPIO_SetBits(GPIOA, GPIO_Pin_2);

SPI_InitTypeDef  SPI_InitStructure;

/* SPI1 configuration */ 
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI1  */
SPI_Cmd(SPI1, ENABLE); 
}

初始化后,我执行以下操作:

for(tmpCnt = 0; tmpCnt < 100; tmpCnt++){
    SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE);
}
for(tmpCnt=0;tmpCnt<100;tmpCnt++){
SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE);
}
它在大约20次迭代后崩溃。我使用的是标准外设库和System Workbench以及编译器的所有库存设置和其他所有设置。目前没有任何东西连接到SPI引脚,这可能是问题所在吗? 使命感 (SPI1->SR)而不是SPI_I2S_GetFlagStatus 有同样的效果,所以我想问题在于读取寄存器。为什么会这样?我现在真的陷入困境,所以任何帮助都将不胜感激

编辑: 好的,事实证明我遗漏了一些导致这种行为的代码-在SPi1->SR调用之前,我还调用了以下函数:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}
\uuuuuuuuuu静态uuuu内联uint32\uu系统单击配置(uint32\ut勾号)
{
如果((滴答-1)>SysTick_LOAD_RELOAD_Msk)返回(1);/*不可能重新加载值*/
SysTick->LOAD=ticks-1;/*设置重新加载寄存器*/
NVIC设置优先级(SysTick\U IRQn,(1CTRL=SysTick\U CTRL\U CLKSOURCE\U Msk|
SysTick\u CTRL\u TICKINT\u Msk|
SysTick\u CTRL\u ENABLE\u Msk;/*启用SysTick IRQ和SysTick定时器*/
返回(0);/*函数成功*/
}
为什么会中断SPI1->SR访问?是否还有其他问题?我的主要功能:

int main(void)
{

    int tmpCnt = 0;
    int rev = 0;
    //uint16_t writedat = 22;
    RCC_Init();
    SPI1_Init();
    //SysTick_Config(1000);

    for(tmpCnt = 0; tmpCnt < 50; tmpCnt++){
        SPI1->SR ;
    }

    enc28j60Init((unsigned char *)enc28j60_MAC);

    //simple_server();
    rev = enc28j60getrev();

    return rev;
}
int main(无效)
{
int-tmpCnt=0;
int rev=0;
//uint16_t writedat=22;
RCC_Init();
SPI1_Init();
//系统配置(1000);
对于(tmpCnt=0;tmpCnt<50;tmpCnt++){
SPI1->SR;
}
enc28j60Init((无符号字符*)enc28j60_MAC);
//简单_服务器();
rev=enc28j60getrev();
返回版本;
}
RCC_Init似乎没有改变SPI1->SR的任何行为。
如前所述,欢迎提供任何建议。

我自己没有使用STM32,但看起来您的程序崩溃了,调用了某个中断向量。您能与调试器检查调用了哪个中断向量吗?抱歉,我放弃了该部分,因为我意识到它与此无关,目前我无法再花时间来解决此问题。当我试图关于这个问题,我甚至找不到程序崩溃的地方。我自己没有使用STM32,但看起来你的程序崩溃了,并且调用了一些中断向量。你能和调试器检查一下调用了哪个中断向量吗?对不起,我放弃了那个部分,因为我意识到它与此无关,目前我不能再花时间了.当我试图解决这个问题时,我甚至找不到程序崩溃的地方。