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

查看: 1644|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版