本帖最后由 hi201803 于 2018-3-20 13:53 编辑 ' y4 F/ ]3 e3 Z& s8 g/ C ==========================================================' |3 E% s0 _2 F( U* P8 Z 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误. 其它的版本没看不知道.( H( x4 {1 Y- N* P/ T ===========================================================' ]: r+ d: _4 s2 B Q4 K6 Q3 P! c: [7 w 版本 : * @file stm32f1xx_hal_can.c * @author MCD Application Team * @version V1.0.1 * @date 31-July-2015 错误点 1:# y3 m, o1 P, f* M5 I 在 stm32f1xx_hal_can.c 的 L294 : while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))+ a* x) ^, F5 F- o7 p# Z5 v 应该是: while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))7 b1 U& X! W, A: S8 l) N 错误点 2: 在 stm32f1xx_hal_can.c 的 L308 :3 Y+ P5 t) L1 ~ ]! N while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))% h0 A S$ k9 f/ @ 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 需核查其它版本相应代码.! {% w+ Z* Y2 ]* H ====== 2018/03/14 增加 ================================ 平时顺序执行没问题, 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! ! 要这么巧啊,所以故障很难在调试时出现 !!!5 v! v8 U% U: \2 i 在现场出现问题, 但调试时重现不了啊 !!! 这个错误存在于 多个版本中。 -8 c; I+ |1 Y5 F; ^7 h" |/ E - =========2018/0316 增加: 分析 ======================================+ ]: h" L8 t6 }9 e o7 ?4 ? 以下是 stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-+ I% Q% I8 R" z; @2 x4 s) 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 consecutive0 J9 E5 l$ p; C5 ?/ L recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and! p6 O" U- N+ w$ l' s3 m7 i ready for transmission and reception. Hardware signals this event by clearing the INAK bit in the CAN_MSR register. */6 `- {% X' c' |1 @, k 3 Q7 l; ]3 B, O0 H8 V' V& y 290: /* Get timeout */ 291: tickstart = HAL_GetTick(); ' C1 P C" s+ `% F6 O& l: `5 l 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)/ i: a2 |5 q3 N j 297: { 298: hcan->State= HAL_CAN_STATE_TIMEOUT;0 `2 H# i2 [! M m 300: /* Process unlocked */8 ~+ p3 T& D8 |, x& Q9 z K 301: __HAL_UNLOCK(hcan);2 t; A U, |$ B! K) \ 3 p8 D. n9 v# i# s! _! D 303: return HAL_TIMEOUT; 304: } 305: } /* 该错误引发的后果及表现,自行分析 */ # h4 b/ t& }( D' T " Z7 N+ Y9 }' P% x3 r( t6 z* M |
+ l6 J* z% }) d( u y. L
平时顺序执行没问题, % B% I: b& f. L0 O
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !! L) a' _9 h9 X- y
要这么巧啊,所以故障很难在调试时出现 !!!+ j3 K/ ~% E& l \6 k* G
在现场出现问题, 但调试时重现不了啊 !!!6 n1 F" r+ J7 d% b* q6 A N/ s% w# j
. ^- Q/ \( b0 U
这个错误存在于 多个版本中。
0 W( ]- ^- l0 ~- U
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.