|
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 ========================================================== 2018/03/20 刚才看了一下最新版 F1 v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误. 其它的版本没看不知道.& [' N* L. _( y' g" Z* h0 Y =========================================================== 版本 : * @file stm32f1xx_hal_can.c. k; C3 e# S: \! u9 ^% E# g * @author MCD Application Team: a3 X% _+ p9 ]' j5 y2 m, Z* e * @version V1.0.16 p* }& B; _. b: H * @date 31-July-2015. W8 o. p( Z+ V4 M, D 6 B# J2 A0 m" ? 错误点 1:$ T* @# B2 d+ t. d+ f 在 stm32f1xx_hal_can.c 的 L294 :1 ~( ?* J( O7 l5 h while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))! O2 [! [5 O2 k 应该是: while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))2 X1 z0 j, [! m1 v* c- j 错误点 2: 在 stm32f1xx_hal_can.c 的 L308 :$ r- I* B0 ^" A3 C$ U% ^( {1 t5 V. ? while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)): J/ q: A6 D! f4 C0 ?8 t 应该是: while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) 上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 需核查其它版本相应代码. ====== 2018/03/14 增加 ================================, s1 j, q4 `+ d+ i3 U$ v 6 d4 o' M- x' i6 \ 平时顺序执行没问题, 假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! ! 要这么巧啊,所以故障很难在调试时出现 !!!- V5 K9 N& Z! ^ ? 在现场出现问题, 但调试时重现不了啊 !!!2 Z' H- O, k' s7 q$ K 0 s5 l+ {6 y. I 这个错误存在于 多个版本中。 - - =========2018/0316 增加: 分析 ====================================== 以下是 stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注- -% T, {" M" P& g9 ~ 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! x1 v9 x) W7 l' H$ k recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and+ o) S$ M2 |' f; r* Q9 ? ready for transmission and reception. Hardware signals this event by clearing the INAK bit in- j) N, [- [5 E& V( ~ the CAN_MSR register. */+ Y. T, v) K0 ?7 |8 M $ p1 j. L4 J$ e* K' Q' K8 w w 290: /* Get timeout */ 291: tickstart = HAL_GetTick(); 7 t% o2 q2 Y- u$ q- I7 s 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: { 298: hcan->State= HAL_CAN_STATE_TIMEOUT;( K; u7 b$ R- ?* W* n! o B+ d : o( H& Q& D; @! P 300: /* Process unlocked */. t* [8 s8 S X" q: e" s: G3 B 301: __HAL_UNLOCK(hcan);+ `' _! o* e. ^8 Q+ d7 f 7 Q6 c$ L( Z& I* u) O* s 303: return HAL_TIMEOUT; 304: } 305: } + m, R% L" i5 ~7 V; w8 [4 m% ? /* 该错误引发的后果及表现,自行分析 */ ' a! Z5 A5 }+ ?9 v0 P8 q% e" h |
微信公众号
手机版
平时顺序执行没问题,
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
要这么巧啊,所以故障很难在调试时出现 !!!
在现场出现问题, 但调试时重现不了啊 !!!) W$ P8 x- u% R- [8 E+ k! A3 ^3 A/ I
这个错误存在于 多个版本中。 3 \ H. J* O8 r) `! X) F, }
# H3 M, m/ L# d: p/ `2 E" ^
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.