完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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',就确认了初始化模式的退出。 有知道原因的请指点一下,谢谢! |
|
相关推荐
1个回答
|
|
在STM32Cube HAL库中,CAN初始化函数`HAL_CAN_Init(CAN_HandleTypeDef* hcan)`的步骤如下:
1. 退出睡眠模式:在初始化CAN之前,需要确保CAN模块处于正常工作状态。这可以通过调用`HAL_CAN_WAKEUP()`函数实现。 2. 请求进入初始化模式:为了对CAN模块进行配置,需要将其置于初始化模式。这可以通过设置CAN_MCR寄存器的`INRQ`位实现。 3. 等待初始化确认标志INAK置位:在请求进入初始化模式后,需要等待CAN_MCR寄存器的`INAK`位置位,以确认CAN模块已进入初始化模式。 4. 进行初始化配置:在CAN模块进入初始化模式后,可以对CAN模块的时钟、滤波器、中断等进行配置。 5. 请求退出初始化模式:完成初始化配置后,需要将CAN模块置于正常工作模式。这可以通过清除CAN_MCR寄存器的`INRQ`位实现。 6. 等待确认初始化模式退出:在请求退出初始化模式后,需要等待CAN_MCR寄存器的`INAK`位清除,以确认CAN模块已退出初始化模式。 在HAL库的CAN初始化函数中,上述红色字体部分代码如下: ```c HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan) { // ... /* Request leave initialisation */ hcan->Instance->MCR &= ~((uint32_t)CAN_MCR_INRQ); /* Wait INAK bit reset */ if (CAN_WaitOnFlagUntilTimeout(hcan, CAN_FLAG_INAK, RESET, CAN_TIMEOUT_VALUE) != HAL_OK) { return HAL_TIMEOUT; } // ... } ``` 这段代码首先清除`INRQ`位以请求退出初始化模式,然后使用`CAN_WaitOnFlagUntilTimeout()`函数等待`INAK`位清除,以确认CAN模块已退出初始化模式。如果超时,则返回`HAL_TIMEOUT`。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 10:26 , Processed in 0.725903 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号