本帖最后由 hi201803 于 2018-3-20 13:53 编辑 9 l6 T- c* t0 C ==========================================================* r, T, _( j7 |4 @$ E1 X5 }7 _8 C 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误. 其它的版本没看不知道. ===========================================================% f& c7 S, Z4 @$ e 版本 : * @file stm32f1xx_hal_can.c * @author MCD Application Team; u+ @/ e! W( W) Q8 e+ |8 P: U! V * @version V1.0.1 * @date 31-July-2015* |% y; ]+ F1 J6 l 错误点 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)): o) O- w- a/ e( }3 F1 Y4 |3 i ' [0 U1 q* h! d |1 u# W. Z 错误点 2: 在 stm32f1xx_hal_can.c 的 L308 : while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)) 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))8 G1 k, l; r" ]$ z }1 M/ z u( ?. f$ U1 v+ u3 \( { 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 需核查其它版本相应代码. ====== 2018/03/14 增加 ================================ & o, n# `" B, g3 p7 ]2 A 平时顺序执行没问题, . J3 x0 F$ V9 y& K' Y* x4 b0 l 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! ! 要这么巧啊,所以故障很难在调试时出现 !!!9 Q& p% g" \. a @ 在现场出现问题, 但调试时重现不了啊 !!!6 q$ g# f/ k6 z0 M3 M$ n 这个错误存在于 多个版本中。 -- B! y6 t9 r n- ~+ \$ Y - =========2018/0316 增加: 分析 ======================================, S3 k0 u$ Q# |& c7 \# V 以下是 stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-" i- h8 R; D ~0 f' p0 r - 287: /* Request leave initialisation */% O6 a$ f, p+ L( I% g 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 ready for transmission and reception. Hardware signals this event by clearing the INAK bit in/ {' p+ f* c, N9 t2 _6 n" X5 h the CAN_MSR register. */4 ]9 l- I$ d5 I: z( R! R2 s : m. R1 }0 x+ t% X9 f 290: /* Get timeout */* J! M) C3 D7 ^7 g- r 291: tickstart = HAL_GetTick(); 293: /* Wait the acknowledge */ /* 按参考手册, 如果动作完成, 就清除 CAN_MSR 的 CAN_MSR_INAK */; W/ m# h* M0 E6 Z2 Y5 p P 294: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /* 而这里是等待CAN_MSR_INAK 变高,是错误的 */. t6 l5 @4 y$ y4 R7 i8 ^. b 295: { 296: if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)3 B$ ~( `3 b* U) A' `4 P 297: { 298: hcan->State= HAL_CAN_STATE_TIMEOUT;+ v- ~& f# }" M; | 300: /* Process unlocked */$ f2 H1 i+ p+ V- J) t% a) N3 Q0 Z 301: __HAL_UNLOCK(hcan); 303: return HAL_TIMEOUT; 304: }) I* }% ^- U2 U# L- N& D3 ^ 305: } /* 该错误引发的后果及表现,自行分析 */ 1 b3 q) F) b7 n" { Y. q% x % S% t* s/ {9 ~$ y! E* ? ! E3 h& N0 W- u; Q8 ~ % p! o- T: _, V3 Z , B) E% [8 J# P, K- M, g! J' R0 Z |
% s1 I w3 d! ~' C, g
平时顺序执行没问题, * y9 h% R* V. ]( w* _# R
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !6 Y: x: n6 r& t
要这么巧啊,所以故障很难在调试时出现 !!!
在现场出现问题, 但调试时重现不了啊 !!!
7 C2 X8 {" n* O! l, k" G7 ?; S
这个错误存在于 多个版本中。 0 Q) R$ V' v% k+ ?% R
- E, b/ G: X/ l5 h
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.