HomeKit 发表于 2025-10-27 18:38

STM32F042K6的SPI 和 UART 在非阻塞模式下无法协同工作

本帖最后由 HomeKit 于 2025-10-28 08:54 编辑

我使用的是 STM32F042K6 Nucleo 开发板,通过 Cube-MX 初始化了工作在非阻塞模式下的 SPI 和 UART。我想通过 SPI1 与树莓派(RPI)通信,通过 USART1 与 BMS(电池管理系统)通信。
SPI1 配置为全双工从机模式,USART1 配置为异步模式,两者的全局中断均已使能。
问题是,一旦我在 “User Code 2” 部分调用HAL_SPI_Receive_IT();,两个外设就都停止工作了。
在 SPI 方面,SCLK、NSS 和 MOSI 引脚工作正常,回调函数能正常触发,STM32 也能读取到传入的数据,但 MISO 始终为高电平,导致树莓派持续接收到 0xFF。UART 则完全停止工作,RX 引脚保持高电平。
我也试过将 UART 设为阻塞模式、SPI 设为中断模式,出现了同样的问题。由于树莓派的数据可能随时到来,我无法使用 SPI 的阻塞模式。
需要说明的是,两个外设单独工作时(无论阻塞还是非阻塞模式)都能正常运行。
我已试过的方法:

[*]调整中断优先级(将 SPI 设为高于、低于或等于 UART 的优先级);
[*]改变两个外设的初始化顺序;
[*]移除树莓派的连接(此时 SPI 中断不会触发,但 USART 仍然无法工作);
[*]在 Cube-MX 中为两个外设更换不同的引脚;
[*]使能与 IMU 连接的 I2C,观察其他外设使能时 I2C 是否受影响(I2C 在所有情况下都能正常工作);
[*]在 SPI 使能的情况下,先检查 UART 状态再进行首次发送:
[*]while(HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY);
程序始终无法退出该循环,此时 RxState 为 34,gState 为 32。
[*]
希望高手能给我一些可行方向来解决这个问题

页: [1]
查看完整版本: STM32F042K6的SPI 和 UART 在非阻塞模式下无法协同工作