本帖最后由 hi201803 于 2018-3-20 13:53 编辑 L0 H' J. S4 r D5 ?' L 7 I4 i) S2 G' H/ [8 I' H ==========================================================1 b' |! n1 }+ y5 Y, F 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.8 \5 [1 p$ K' b7 q5 b 其它的版本没看不知道./ G+ `5 o& R& ^( R+ g ===========================================================9 M: j# y- |: D8 r: o" [ 版本 : $ T2 Y7 B. T# ?0 Z * @file stm32f1xx_hal_can.c * @author MCD Application Team * @version V1.0.1 * @date 31-July-20151 Q* W4 X; Z' c. a7 N4 r0 P& H 错误点 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)) 0 h4 B v* O: H* T. n 错误点 2:' O& t; m: A- J5 X1 `9 P4 a M 在 stm32f1xx_hal_can.c 的 L308 : while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))+ {4 w I" [1 @ 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))% R6 d: \8 S: z8 l/ q9 G! U! V! V " M6 v: {4 a: s# Z$ w 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 7 X7 b# z- U6 s1 l 需核查其它版本相应代码.) }4 ^/ R8 e- l# n ====== 2018/03/14 增加 ================================ 平时顺序执行没问题, 8 v ]& _' u# K3 E- r1 t* z 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !" Z! `1 ]- Y1 z X1 P" `. T, C8 r 要这么巧啊,所以故障很难在调试时出现 !!!0 X% g. Z7 l* z3 T ` 在现场出现问题, 但调试时重现不了啊 !!!( Q; Z9 Y* A# L- v& ?1 J % P0 |2 w, `, v6 e% W( C$ J' f 这个错误存在于 多个版本中。 - - =========2018/0316 增加: 分析 ====================================== 以下是 stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-9 T+ Z0 X7 E: t) h% B8 w - 287: /* Request leave initialisation */* S5 E) _# ~6 f8 b 288: CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); /* 从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive: q+ m2 |$ p7 N& C recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and8 W3 Z) g- E0 H ready for transmission and reception. Hardware signals this event by clearing the INAK bit in% v" r( K# r- z9 J, e" i the CAN_MSR register. */1 G- Q% W/ [2 h) G. e# Z5 F6 m% \ 7 y! n; Q# Y; z0 L, Q 290: /* Get timeout */, f; g- h5 o; ^% o 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: {$ H( U8 g( S, Z' R- P5 ~* ? 298: hcan->State= HAL_CAN_STATE_TIMEOUT; 300: /* Process unlocked */ 301: __HAL_UNLOCK(hcan);2 i3 i( e& g6 v, \% N1 P + y; I( W- W; W/ ~% u1 Q 303: return HAL_TIMEOUT; 304: } 305: }+ ?" i4 e I$ P0 F3 A /* 该错误引发的后果及表现,自行分析 */: c2 }" U2 S' l+ @! i0 c1 i 4 @' n4 @- o; h5 r- O ) v" `% t( }. T 1 ^1 E) _! N6 ]* w, d& F8 t |
平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现 !!!: O4 T) q* b5 w
在现场出现问题, 但调试时重现不了啊 !!!, E0 k3 _- n5 ?" g
/ |, Y! I6 r* w, {2 ?2 m
这个错误存在于 多个版本中。 ?5 L1 K! x8 s' j* e3 H" d
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.