调试时在调用如下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寄存器跟踪窗口即可,具体原因没有在官方文档中找到,在网上看到这样一段话,可以解释这个想象:
在调试的过程中,使用调试软件的寄存器或存储器显示窗口,可以很方便地查看外设寄存器的状态。
|