内核558 发表于 2025-3-21 10:00

STM32F407开发 CAN通信程序HAL_CAN_Init 被重置为 SLEEP

用 STM32F407开发 CAN通信程序。使用 HAL 库。在 CUBE IDE 程序中,自动生成 MX_CAN2_Init 函数。调用 HAL_CAN_Init 的另一个函数。在运行时,HAL_CAN_Init 被重置为 SLEEP 模式在 MCR 寄存器中,但未重置 SLAK 位 MSR 寄存器 。导致CAN 无法正常。

classroom 发表于 2025-3-21 12:34

检查CAN外设的时钟源和时钟分频设置是否正确。

laocuo1142 发表于 2025-3-21 16:20

可能是引脚配置问题。

powerantone 发表于 2025-3-21 22:00

可能是硬件连接问题。

flycamelaaa 发表于 2025-3-21 23:00

检查初始化代码参数是否都正确设置。

Wordsworth 发表于 2025-3-22 07:45

检查 BXCAN 的 MSR 状态,有时候 SLEEP 位不会自动清,可能需要手动写 0。

Bblythe 发表于 2025-3-22 07:46

试试手动修改 MCR,在 HAL_CAN_Init 之后,直接 CAN->MCR &= ~CAN_MCR_SLEEP; 看看能不能恢复。

Pulitzer 发表于 2025-3-22 07:47

是不是 NVIC 里 CAN 相关的中断没配置好?有些情况下 CAN 需要正确的中断才能正常工作。

Uriah 发表于 2025-3-22 07:49

尝试完全复位 CAN 外设,可以 __HAL_RCC_CAN1_FORCE_RESET() 之后再 __HAL_RCC_CAN1_RELEASE_RESET()。

Clyde011 发表于 2025-3-22 07:50

用 ST 官方例程对比看看,可能是 CubeMX 生成的代码有些默认设置不适配你的硬件环境。

公羊子丹 发表于 2025-3-22 07:51

检查一下时钟配置,CAN 需要正确的时钟源,特别是 APB1 时钟,可能频率没对上。

周半梅 发表于 2025-3-22 07:52

HAL_CAN_Init 之后要手动退出 SLEEP 模式,可以试试调用 HAL_CAN_RequestLeaveSleep()。

童雨竹 发表于 2025-3-22 07:53

看看 CAN 的 MCR 寄存器,是不是 SLEEP 位被误设置了?有可能是 HAL_CAN_Init 里的某个默认配置导致的。

帛灿灿 发表于 2025-3-22 07:54

如果 SLAK 位没清除,说明 CAN 还是处于低功耗模式,试试直接操作 CAN->MCR 清除 SLEEP。

万图 发表于 2025-3-22 07:55

是不是 HAL_CAN_Start() 没有调用?HAL 库初始化完 CAN 之后,必须显式调用 HAL_CAN_Start() 才能正常工作。
页: [1]
查看完整版本: STM32F407开发 CAN通信程序HAL_CAN_Init 被重置为 SLEEP