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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑

==========================================================
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
其它的版本没看不知道.
===========================================================
版本 :   
  * @file    stm32f1xx_hal_can.c
  * @author  MCD Application Team
  * @version V1.0.1
  * @date    31-July-2015

错误点 1:
在  stm32f1xx_hal_can.c 的 L294 :
               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))

错误点 2:
在  stm32f1xx_hal_can.c 的 L308 :
               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))

上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
需核查其它版本相应代码.
====== 2018/03/14 增加 ================================

平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现  !!!
在现场出现问题, 但调试时重现不了啊  !!!

这个错误存在于 多个版本中。 -
-
=========2018/0316  增加:  分析  ======================================
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-
-
287:    /* Request leave initialisation */
288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive
recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and
ready for transmission and reception. Hardware signals this event by clearing the INAK bit in
the CAN_MSR register. */

290:     /* Get timeout */
291:     tickstart = HAL_GetTick();   

293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
295:     {
296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
297:       {
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;

300:         /* Process unlocked */
301:         __HAL_UNLOCK(hcan);

303:         return HAL_TIMEOUT;
304:      }
305:    }

/* 该错误引发的后果及表现,自行分析 */






评分

参与人数 1 ST金币 +2 收起 理由
MrJiu + 2 赞一个!

查看全部评分

收藏 1 评论7 发布时间:2018-3-14 16:10

举报

7个回答
MrJiu 回答时间:2018-3-14 16:56:22
支持一个!!!!期待验证的人
hi201803 回答时间:2018-3-14 22:55:42
本帖最后由 hi201803 于 2018-3-14 23:12 编辑
MrJiu 发表于 2018-3-14 16:56
支持一个!!!!期待验证的人


平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现  !!!
在现场出现问题, 但调试时重现不了啊  !!!

这个错误存在于 多个版本中。


anobodykey 回答时间:2018-3-15 09:33:33
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题
努力的人 回答时间:2018-3-15 09:38:39
可以请官方的FAE帮忙看一下,如果有问题便于及时纠正
MrJiu 回答时间:2018-3-15 10:14:08
anobodykey 发表于 2018-3-15 09:33
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...

这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
A.K. 回答时间:2018-3-22 12:12:50
F1_v1.60之前版本的L308处原为if (HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)), 应该是if()不是while()吧.
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版