对使用STM32cube生成的HAL库CAN初始化函数HAL_CAN_Init的一个疑问

hducollins 2017-03-09 09:59:40

HAL库中CAN的初始化函数 HAL_CAN_Init(CAN_HandleTypeDef* hcan) 的步骤大致如下:

1、退出睡眠模式;
2、请求进入初始化模式,并等待初始化确认标志INAK置位;
3、INAK标志位置位后进行初始化配置;
4、请求退出初始化模式,并等待确认初始化模式退出;

在HAL库的CAN初始化函数中,上述红色字体部分代码如下:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
{




/* Request leave initialisation */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);

/* Get timeout */
tickstart = HAL_GetTick();

/* Wait the acknowledge */
while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
{
if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
{
hcan->State= HAL_CAN_STATE_TIMEOUT;

/* Process unlocked */
__HAL_UNLOCK(hcan);

return HAL_TIMEOUT;
}
}

/* Check acknowledged */
if (HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
{
status = CAN_INITSTATUS_SUCCESS;
}
}



}

有疑问的地方是代码中紫色字体的两行代码,因为在请求退出初始化模式之前,初始化模式标志位INAK是等于‘1’的,
然后在程序执行CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ)请求退出初始化模式之后,我们期望INAK被清‘0’,
所以应该是使用while()循环等待INAK从1变为0才对,也就是INAK=1的时候等待,INAK=0时退出while()循环;
但上述程序中却是INAK=0的时候等待,INAK=1的时候退出while()循环。

参考手册中对于退出初始化模式的描述如下:
清除CAN_MCR寄存器的INRQ位为'0',请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存
器的INAK位清'0',就确认了初始化模式的退出。

有知道原因的请指点一下,谢谢!
...全文
2783 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
aberthai 2017-03-09
  • 打赏
  • 举报
回复
clear bit,hal is bit clear这两个函数都是清零吗?如果是,为什么用两种表达 还有一个bit set 这是设置为一吗?又进入初始化吗?
hducollins 2017-03-09
  • 打赏
  • 举报
回复
引用 1 楼 aberthai 的回复:
clear bit,hal is bit clear这两个函数都是清零吗?如果是,为什么用两种表达 还有一个bit set 这是设置为一吗?又进入初始化吗?
CLEAR_BIT 是清零, HAL_IS_BIT_CLR 不是清零,而是判断是否为零。 HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)是判断INAK是否为'0', 另一个 HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK) 是判断INAK是否为'1' 。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧