本帖最后由 hi201803 于 2018-3-20 13:53 编辑 ( K) G% R3 |- g- ] ==========================================================& e( E3 H. _' I3 y! K 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误. 其它的版本没看不知道. R' W$ {7 o( F( B+ T9 j =========================================================== 版本 : * @file stm32f1xx_hal_can.c% l s$ ~8 }' A# c * @author MCD Application Team! s0 b+ p% ?" o- m, `) y * @version V1.0.1) e/ }+ [' {( Z" ?- v. t# n * @date 31-July-2015 + C: g; z, j" f5 T$ l9 } 错误点 1:0 p' J% n# Y, U; G3 a 在 stm32f1xx_hal_can.c 的 L294 :0 S. k2 B# c6 }0 m8 V5 \( ]" | while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) 应该是: while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)) ! J3 _: P1 N( Y3 h" C& r6 q 错误点 2: 在 stm32f1xx_hal_can.c 的 L308 :5 ]9 n$ t! [' ]3 |0 L while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)) 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 需核查其它版本相应代码.. A. D4 H& ]8 j ====== 2018/03/14 增加 ================================ 平时顺序执行没问题, 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !; S) O7 C; W# X2 |0 _# z 要这么巧啊,所以故障很难在调试时出现 !!! 在现场出现问题, 但调试时重现不了啊 !!! 这个错误存在于 多个版本中。 - - =========2018/0316 增加: 分析 ======================================+ w( |5 k5 S+ n/ M; P$ X8 | 以下是 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/ X5 c% f: k7 e Z recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and7 Q$ ?. ^: \2 `0 R3 d7 W ready for transmission and reception. Hardware signals this event by clearing the INAK bit in the CAN_MSR register. */: k+ B! k& a+ {% I m# ]9 C 290: /* Get timeout */- h# r% i* \9 i# T! _7 p 291: tickstart = HAL_GetTick(); 293: /* Wait the acknowledge */ /* 按参考手册, 如果动作完成, 就清除 CAN_MSR 的 CAN_MSR_INAK */! |3 w) S k: q; H1 l' B 294: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /* 而这里是等待CAN_MSR_INAK 变高,是错误的 */ 295: {. g2 u2 T ~1 |6 O* z5 x/ y8 D$ I 296: if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE) 297: {/ G. E J, p7 j+ g. I* C 298: hcan->State= HAL_CAN_STATE_TIMEOUT; 9 {7 T/ y, w5 C* E* B" U$ k 300: /* Process unlocked */ 301: __HAL_UNLOCK(hcan); l/ y Q4 c+ A8 r/ D: h 8 [2 k# ^% x4 }3 ~1 R 303: return HAL_TIMEOUT;( O1 y7 ?( i. J' O7 k; l1 @! h! d3 C. Q 304: }0 g) y, {9 R5 T 305: }: \6 H5 W6 u$ @* E /* 该错误引发的后果及表现,自行分析 */8 {0 K' }( }5 m8 C& m( Y: n 8 G, l$ q4 L- Z S9 c1 ^ ) F" u6 _) M, v$ w- ^, z ' g$ Y* X! m; I! V - C6 c& M( o9 Z R1 P |
平时顺序执行没问题, 0 s; _; Z' w6 j5 O8 K# S
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现 !!!- X2 S2 _) V$ s, ^1 i6 G
在现场出现问题, 但调试时重现不了啊 !!!
2 `. E- M+ c$ U; h W. g
这个错误存在于 多个版本中。 * ?: U7 K) u. V- T) y
8 v+ o5 _! ~6 W3 n
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.