历史上的今天
今天是:2025年04月08日(星期二)
2019年04月08日 | STM32的SPI接收卡死问题
2019-04-08 来源:eefocus
调试时在调用如下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. 不要把断点放在对这些敏感的寄存器位操作的前面,以保证这些寄存器位不被调试软件意外地操作。
史海拾趣
|
从8位/16位单片机发展到以ARM CPU核为代表的32位嵌入式处理器,嵌入式操作系统将替代传统的由手工编制的监控程序或调度程序,成为重要的基础组件。更重要的是嵌入式操作系统对应用程序可以起到屏蔽的作用,使应用程序员面向操作系统级开发应用软件 ...… 查看全部问答> |
|
目录: 第一章 概述 学习晶体管电路或FET电路的必要性 晶体管和FET的工作原理 晶体管和FET的近况 第二章 放大电路的工作 观察放大电路的波形 放大电路的设计 放大电路的性能 共发射极应用电路 第三章 增强输出的 ...… 查看全部问答> |
|
对应DeviceIOControl函数写了如下的流驱动代码: BOOL TES_IOControl (DWORD dwCtx, DWORD dwCode, PBYTE pInpBuf, DWORD dwInpLen, & ...… 查看全部问答> |
|
求DSP与ARM9(WINCE)串口通信的源代码(C++)、、、急用..谢谢啊。。。。 最近加入一个项目,需要DSP与ARM9的串口通信,可是本人实在是刚接触这嵌入式这块,不懂得该怎么办,又因为急着用,所以向各位大大求救。。谢谢啊。。我的邮箱是812786455@qq.com。。。。万分感谢。。… 查看全部问答> |
|
大家好: 我想用stm32的USB口和电脑通讯。有电脑发送查询信息,板子接收到以后根据相应的信息进行查询,将查询的结果返回给电脑。请问有相似的接收和发送的历程吗?有的请给我一份谢谢… 查看全部问答> |




