|
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 ========================================================== 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误. 其它的版本没看不知道.8 Z5 D5 N, x( J8 o* \5 a =========================================================== 版本 : , {' Z/ v* p8 b; M4 Q. j * @file stm32f1xx_hal_can.c' x- O4 R, |9 W. A- o * @author MCD Application Team- G. G2 k5 `/ h * @version V1.0.1 * @date 31-July-2015 D1 v H; a, E: O2 b' e 错误点 1:7 L6 s5 x8 \9 a O 在 stm32f1xx_hal_can.c 的 L294 : B6 D, I3 M5 V* \/ z. k while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))1 i/ N. _2 {: o7 T2 Z6 W5 \ 应该是: while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)) y" q$ e, U5 M" f' k+ y 错误点 2:) l! }( U$ y. Q7 b 在 stm32f1xx_hal_can.c 的 L308 :0 A6 |5 n' j0 W while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)) 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 4 j; j( ]8 q: H! F8 m5 X 需核查其它版本相应代码. ====== 2018/03/14 增加 ================================ 平时顺序执行没问题, 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! ! 要这么巧啊,所以故障很难在调试时出现 !!! 在现场出现问题, 但调试时重现不了啊 !!!5 z- M3 U2 i4 a5 E5 U9 ] 8 k; l$ c# y. v$ U! U" Y 这个错误存在于 多个版本中。 - - =========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, [3 x! q* X2 T3 [' S ready for transmission and reception. Hardware signals this event by clearing the INAK bit in9 I8 t7 y$ I! d! M the CAN_MSR register. */ 290: /* Get timeout */ 291: tickstart = HAL_GetTick(); 293: /* Wait the acknowledge */ /* 按参考手册, 如果动作完成, 就清除 CAN_MSR 的 CAN_MSR_INAK */7 J, d3 A/ t/ S0 T# h: o: m 294: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /* 而这里是等待CAN_MSR_INAK 变高,是错误的 */ 295: { 296: if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)0 }9 e# p' Q1 ^# k& r 297: { 298: hcan->State= HAL_CAN_STATE_TIMEOUT;! H; }$ m7 U4 U. I, M& O8 G ! v# @+ H2 {6 O# ]5 y 300: /* Process unlocked */ 301: __HAL_UNLOCK(hcan);: Z2 h' g: q" X# K 303: return HAL_TIMEOUT; 304: }$ R0 `, j/ V! |0 ], x 305: }0 N' N6 U* _7 ^4 W& c /* 该错误引发的后果及表现,自行分析 */8 [) j* z, l8 s8 t8 ` ) a b# } |0 i( f; b 9 U4 r7 x0 p. i$ r1 F" M, `8 m 2 a6 V6 `; ~; z |
微信公众号
手机版
平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现 !!!) ^& Q+ P9 |* n
在现场出现问题, 但调试时重现不了啊 !!!
这个错误存在于 多个版本中。 . \/ Z5 V; X; | e8 R
, x5 ?0 t$ @( i4 _ v- o4 V! a5 x1 ?1 b
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.