本帖最后由 hi201803 于 2018-3-20 13:53 编辑 - [( ^* O5 @- `3 ^9 m) I! x ==========================================================: V8 K( j+ ~' n5 L* F6 j6 t- ?6 L 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误." p ]2 S. d8 h" ]9 a5 ` 其它的版本没看不知道./ p' U; t- _1 \8 V, C. i+ y =========================================================== 版本 : - p" |3 V" h+ x1 c' n * @file stm32f1xx_hal_can.c * @author MCD Application Team * @version V1.0.1 * @date 31-July-2015 * N1 E7 p" k, r, u 错误点 1:5 L7 R6 N5 X3 T1 B! b 在 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))% Z& C' ~$ D5 D) t( J* v2 c' V 错误点 2: 在 stm32f1xx_hal_can.c 的 L308 : while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))2 R# |& K# W$ i# K, ] 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)). _# V! Z8 s" e6 {9 N 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 需核查其它版本相应代码. ====== 2018/03/14 增加 ================================$ A- m* Z1 d- p' k% U . f' ^$ l( `& R0 U8 d$ K 平时顺序执行没问题, 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! ! 要这么巧啊,所以故障很难在调试时出现 !!!( u- p1 g8 d5 n e7 h 在现场出现问题, 但调试时重现不了啊 !!! 这个错误存在于 多个版本中。 - - =========2018/0316 增加: 分析 ======================================. U& C5 w1 w8 P1 X/ J3 h 以下是 stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-2 q; C7 G) X7 B/ N7 U) Y; s) K7 b) { - }" D* k% [) [& k3 p! t7 T$ c, W 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* B3 @8 e4 [7 k* v$ y* _ ready for transmission and reception. Hardware signals this event by clearing the INAK bit in the CAN_MSR register. */ & C. z: c2 L( T7 }" q! b5 w 290: /* Get timeout */) d) _5 N. S0 a, k0 B 291: tickstart = HAL_GetTick(); 3 M, X3 q: _' q5 f) L) @3 y6 D 9 s2 P6 p1 Z }9 ~7 m: g! c 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: {1 {4 k/ ]" w# j 298: hcan->State= HAL_CAN_STATE_TIMEOUT;' y, f E* _2 [1 e8 ] ; \6 K8 U1 S2 ?" E6 o0 H. P& x5 D( k/ ~ 300: /* Process unlocked */ 301: __HAL_UNLOCK(hcan);8 L: W# S c. s# q8 h% r $ n Y) f' y( t 303: return HAL_TIMEOUT;: K4 C, z9 |- F" B% G0 Q- \ 304: } 305: } 2 a! a# G N& s' r0 |/ q; R' D: _$ U4 I /* 该错误引发的后果及表现,自行分析 */. w g1 c4 V( {4 |7 i, X. q " ~& l0 P! N/ e [& z& [9 { : I0 \) l* l$ _3 j- s" y6 k . K6 M' S, o/ Y& w! U |
; o! N! ^# X9 J! ?0 G9 ]
平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现 !!!' J3 T3 I/ l- H
在现场出现问题, 但调试时重现不了啊 !!!3 X6 l) z1 H3 s$ ^
这个错误存在于 多个版本中。
, |' E( r7 c0 M5 C# q6 O6 C
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.