STM32的SPI接收卡死问题

调试时在调用如下SPI函数时,发现以下两个问题:

        1、如果在第三行语句while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);处设断点,将会卡死在这个while语句内,并导致看门狗复位;

        2、全速运行,会触发看门狗复位程序,程序只调用spi,无中断,确定为spi导致,SPI速率由16M降至2M,则短时内不见复位;

uint8_t SPI2_SendOneByte(uint8_t u8Data)//SPI2发送一字节

{
/* 等待发送缓冲区为空, TXE 事件 */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

/* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
SPI_I2S_SendData(SPI2, u8Data);

/* 等待接收缓冲区非空, RXNE 事件 */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);

/* 读取数据寄存器,获取接收缓冲区数据 */
return SPI_I2S_ReceiveData(SPI2);

}

经过试验及查阅网上资料,发现是由调试时对spi寄存器进行跟踪导致的,解决办法就是调试时关闭对应SPI寄存器跟踪窗口即可,具体原因没有在官方文档中找到,在网上看到这样一段话,可以解释这个想象:

        在调试的过程中,使用调试软件的寄存器或存储器显示窗口,可以很方便地查看外设寄存器的状态。

        很多朋友都碰到过这样的问题:在单步调试时始终不能在显示窗口看到某些标志位的变化,应该设置这些标志位的时候,窗口中却显示为0,不少人都错误地认为这是芯片的问题。

        我们知道,不少STM32外设的状态寄存器位,可以通过对某些寄存器的读操作而清除(例如I2C的I2C_SR1中的很多标志位),在调试过程中,每当程序停止在设置的断点或单步停止时,调试软件都会自动地读出所有指定的寄存器和存储器中的内容,并刷新窗口的显示,调试软件的这个读操作恰好清除了那些标志位,造成了上面描述的现象。

        有几个简单的办法解决这个问题: 1. 关闭寄存器或存储器显示窗口。2. 在寄存器或存储器显示窗口中不显示这些敏感的寄存器。3. 不要把断点放在对这些敏感的寄存器位操作的前面,以保证这些寄存器位不被调试软件意外地操作。

猜你喜欢

转载自blog.csdn.net/zczx29/article/details/79669467