
NXP的1176作为主机,STM32F405作为从机,通信波特率为8.3MHz左右。cubeMX配置如下,开启了SPI中断。 每次进入HAL_SPI_TxRxCpltCallback(),都通过IO输出一个脉冲信号,如下图第二行所示。第一行为定时器6溢出回调函数的脉冲,第四行是SPI时钟信号。可以从图中看出,第四个时钟信号结束后,没有触发HAL_SPI_TxRxCpltCallback。且定时器中断在188.54ms处停止触发,一直到189.7ms处,HAL_SPI_TxRxCpltCallback出发后才恢复。又因为所配置的SPI中断优先级高于定时器中断优先级,我推测,由于某些原因导致通信结束后,SPI中断阻塞了。 但是我没有任何解决思路,请各位帮忙,不胜感激!如果提问有任何不完善,请提示我补充信息。 |
STM32N6570-DK开发板,哪里还有卖的?
STM32多通道FFT运算异常
在其他电脑上编译成功没有错误并且能够烧录,换了电脑之后编译出现一堆错误,并且不能烧录程序
SD卡初始化第一次初始化后再次初始化时会失败。
串口重定向接收不同
关于三轴陀螺仪 I3G4250D
经过光耦之后,脉冲计数功能为啥不能实现?
STM32F407 ADC Dual regular simultaneous only 模式下最高采样率仅 96 kHz,960 kHz 无法工作,求助!
STM32 F407骄阳电机版用DMA双缓存接收串口数据时,上电第一次接收区是memory1而不是memory0?
STM32F407骄阳版用DMA双缓存区接收串口数据,上电第一次接收到的数据在memory1而不是memory0
是的,我将
SPI_EndRxTxTransaction
函数中的等待BSY位的阻塞部分注释掉,就不再发生这个情况了。看注释,需要修改宏
SPI_BSY_FLAG_WORKAROUND_TIMEOUT
的值,用来匹配1字节的通信时间。我们的波特率为8MHz左右,那么通信1字节需要1us左右。而HAL库默认是1000us,因此经常在此阻塞,直到超时,或者到下一帧的第一个字节被HAL库接收。line217 #define SPI_DEFAULT_TIMEOUT 100U
line218 #define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 3U /*!< Timeout 1000 µs */
定时器中断频率是100us,SPI通信频率是1kHz。
那如果怀疑阻塞了,那就先屏蔽可能阻塞的代码(比如某些中断),反向验证一下。
你可以检查下代码里到底开启哪些中断,各种中断优先级是怎样安排的?
SPI中断为优先级组4的优先级0,应该不会有其他应用能够抢占它。
仔细阅读了源码,并经过验证,阻塞来自于文件
stm32f4xx_hal_spi.c
中的函数SPI_EndRxTxTransaction()
。它在判断BSY位时阻塞,函数中的注释如下。意思是需要将宏
SPI_BSY_FLAG_WORKAROUND_TIMEOUT
的值修改为SPI通信一个字节的时间长度。本工程的SPI波特率为8MHz左右,也即一个字节通信周期为1us左右。而该宏的默认值为1000us,因此偶尔出现一下两种情况。一是阻塞时间较长(850us+),二是中断阻塞,直到第二帧第一字节被HAL库接收。修改该宏的值为3us后,解决该问题。