你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 1602|回复: 0

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

[复制链接]

4

主题

6

回帖

0

蝴蝶豆

初级会员

最后登录
2020-9-27
发表于 2017-3-9 09:48:11 | 显示全部楼层 |阅读模式
CAN初始化函数  HAL_CAN_Init(CAN_HandleTypeDef* hcan)  的步骤大致如下:
退出睡眠模式;
请求进入初始化模式,并等待初始化确认标志INAK置位;
INAK标志位置位后进行初始化配置;
然后请求退出初始化模式,并等待确认初始化模式退出;

在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',就确认了初始化模式的退出。



有知道原因的请指点一下,谢谢!

回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版