【问题标题】:Access of register STM32 CAN communicationSTM32 CAN通讯寄存器的访问
【发布时间】:2018-03-08 13:11:36
【问题描述】:

你能帮我弄清楚这条线是做什么的吗:

while (hcan->Instance->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)

【问题讨论】:

  • @Garf365 请尽量不要教提问者忽略几乎所有有用的细节会给出合理的答案。另外,请做出回答。如果无法很好地回答,请使用评论询问所需的详细信息,或者是什么让您无法回答。
  • CAN 控制器往往具有初始化模式,您可以在其中设置所有内容。你必须进入它然后退出它,当你这样做时,你必须等待一个标志。手册中应说明这对特定 CAN 控制器的工作原理 - 如果没有 RTFM,您将无法“弄清楚”。

标签: c embedded


【解决方案1】:

这是检查标志或更精确的常用方法 - 如果在某个寄存器中设置了位。在这个特定的例子中:

INAK:初始化确认 该位由硬件设置,并且 向软件表明 CAN 硬件现在处于 初始化模式。

所以你基本上是在无限循环中等待,直到 CAN 进入初始化模式。

顺便说一句。我认为您的 CAN 配置中有很多结构。如果你使用 CMSIS 宏包,它应该是这样的:

while((CAN->MSR & CAN_MSR_INAK) == 0);

【讨论】:

  • OP 显然在使用 Cube,hcan 中的 h 表示它是指向 CAN“句柄”的指针,并且该结构具有 Instance 成员,它是指向外围设备的实际指针注册。
  • 可能 ST 以这种方式编写了“HAL”,以允许在同一个 MCU 上为多个 CAN 外设运行相同的代码。编写 CAN 驱动程序时很常见的情况。
  • 感谢您的解释,但这不是“HAL”方式。它来自低层库吗?我还没有机会测试它。看起来不太好:(
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 2022-01-20
  • 2019-04-06
  • 2022-01-07
  • 2022-09-26
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多