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 无法正常。检查CAN外设的时钟源和时钟分频设置是否正确。 可能是引脚配置问题。 可能是硬件连接问题。 检查初始化代码参数是否都正确设置。 检查 BXCAN 的 MSR 状态,有时候 SLEEP 位不会自动清,可能需要手动写 0。 试试手动修改 MCR,在 HAL_CAN_Init 之后,直接 CAN->MCR &= ~CAN_MCR_SLEEP; 看看能不能恢复。 是不是 NVIC 里 CAN 相关的中断没配置好?有些情况下 CAN 需要正确的中断才能正常工作。 尝试完全复位 CAN 外设,可以 __HAL_RCC_CAN1_FORCE_RESET() 之后再 __HAL_RCC_CAN1_RELEASE_RESET()。 用 ST 官方例程对比看看,可能是 CubeMX 生成的代码有些默认设置不适配你的硬件环境。 检查一下时钟配置,CAN 需要正确的时钟源,特别是 APB1 时钟,可能频率没对上。 HAL_CAN_Init 之后要手动退出 SLEEP 模式,可以试试调用 HAL_CAN_RequestLeaveSleep()。 看看 CAN 的 MCR 寄存器,是不是 SLEEP 位被误设置了?有可能是 HAL_CAN_Init 里的某个默认配置导致的。 如果 SLAK 位没清除,说明 CAN 还是处于低功耗模式,试试直接操作 CAN->MCR 清除 SLEEP。 是不是 HAL_CAN_Start() 没有调用?HAL 库初始化完 CAN 之后,必须显式调用 HAL_CAN_Start() 才能正常工作。
页:
[1]