你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 9 l6 T- c* t0 C

) |) _. A& B3 i6 q# F==========================================================* r, T, _( j7 |4 @$ E1 X5 }7 _8 C
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
3 b5 T/ c% S+ g5 o# h2 U* S其它的版本没看不知道.
( |/ j( T1 f4 K4 j===========================================================% f& c7 S, Z4 @$ e
版本 :   
8 L$ f5 n* F' i4 H  * @file    stm32f1xx_hal_can.c
4 O4 T' i1 b! z0 J2 X+ I! m5 _) f. a  * @author  MCD Application Team; u+ @/ e! W( W) Q8 e+ |8 P: U! V
  * @version V1.0.1
; j) e5 m/ s7 e1 Z& S( L, u  * @date    31-July-2015* |% y; ]+ F1 J6 l

$ H* s- {  N" N9 x5 [: _' N错误点 1:
. l4 M, g# y- r7 q 在  stm32f1xx_hal_can.c 的 L294 :
; G8 n$ Y% G& g$ w/ F               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
+ K5 W3 ]6 ^, W& @) o& q应该是:  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:
# w3 L" }$ \, p: ?% x& S 在  stm32f1xx_hal_can.c 的 L308 :
( O+ {- C3 I8 o7 @               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
. ]0 n& S* \7 m1 _应该是:  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 \( {
上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
( _* |* F$ I6 E5 l/ Q需核查其它版本相应代码.
' B9 d2 B# W- ~/ G' y* l  d====== 2018/03/14 增加 ================================
& {9 w* [, v0 \/ Z$ K& o, n# `" B, g3 p7 ]2 A
平时顺序执行没问题, . J3 x0 F$ V9 y& K' Y* x4 b0 l
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
+ Z4 f3 O! m; u8 f. p要这么巧啊,所以故障很难在调试时出现  !!!9 Q& p% g" \. a  @
在现场出现问题, 但调试时重现不了啊  !!!6 q$ g# f/ k6 z0 M3 M$ n

+ u0 j+ j4 A: Z" p这个错误存在于 多个版本中。 -- B! y6 t9 r  n- ~+ \$ Y
-
$ U, ]6 `% T$ j  B8 c=========2018/0316  增加:  分析  ======================================, S3 k0 u$ Q# |& c7 \# V
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-" i- h8 R; D  ~0 f' p0 r
-
$ o% P, P0 n/ M* r0 c( ^6 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
' J" [4 x2 Q4 {recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and
- Q; w& t7 E6 f/ nready 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();   
) g( n  p) q' R8 G* M
9 d! M, z; l8 T3 n* z293:     /* 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:     {
: v* w/ F# i7 m0 D* S' `0 T296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)3 B$ ~( `3 b* U) A' `4 P
297:       {
% j0 x+ t6 D: L# c' ^8 w298:         hcan->State= HAL_CAN_STATE_TIMEOUT;+ v- ~& f# }" M; |

* t6 p2 K3 x/ a/ @. @$ p% b300:         /* Process unlocked */$ f2 H1 i+ p+ V- J) t% a) N3 Q0 Z
301:         __HAL_UNLOCK(hcan);
7 q7 ]- R3 O/ E% _" `; ]
# p1 P, n4 f9 a3 k+ ~303:         return HAL_TIMEOUT;
- K% z$ E. Z9 r1 J! I- M7 z  r304:      }) I* }% ^- U2 U# L- N& D3 ^
305:    }
- l5 R. U) u" L9 {% h; V$ d
3 H( O* N: F; J/* 该错误引发的后果及表现,自行分析 */
0 @: g. c( S$ f( @1 b3 q) F) b7 n" {  Y. q% x
% S% t* s/ {9 ~$ y! E* ?
! E3 h& N0 W- u; Q8 ~

! t# h3 D7 h) `: R; [% p! o- T: _, V3 Z
, B) E% [8 J# P, K- M, g! J' R0 Z

评分

参与人数 1 ST金币 +2 收起 理由
MrJiu + 2 赞一个!

查看全部评分

收藏 1 评论7 发布时间:2018-3-14 16:10

举报

7个回答
MrJiu 回答时间:2018-3-14 16:56:22
支持一个!!!!期待验证的人
hi201803 回答时间:2018-3-14 22:55:42
本帖最后由 hi201803 于 2018-3-14 23:12 编辑
/ {! C! M; D: ^' c5 L# `
MrJiu 发表于 2018-3-14 16:56) ?4 p' s3 \$ n, k% f# z/ w
支持一个!!!!期待验证的人
; t0 X- w! k" v; z
% s1 I  w3 d! ~' C, g
平时顺序执行没问题, * y9 h% R* V. ]( w* _# R
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !6 Y: x: n6 r& t
要这么巧啊,所以故障很难在调试时出现  !!!
9 V, G$ K" \* f) F在现场出现问题, 但调试时重现不了啊  !!!
9 C6 g- v+ h; h4 e5 Y' k7 C2 X8 {" n* O! l, k" G7 ?; S
这个错误存在于 多个版本中。 0 Q) R$ V' v% k+ ?% R

7 d' F5 b6 l, G' `; b' ^- E, b/ G: X/ l5 h
anobodykey 回答时间:2018-3-15 09:33:33
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题
努力的人 回答时间:2018-3-15 09:38:39
可以请官方的FAE帮忙看一下,如果有问题便于及时纠正
MrJiu 回答时间:2018-3-15 10:14:08
anobodykey 发表于 2018-3-15 09:33% m9 @: K& K# C
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
* f* k, H- u5 e) ]) t
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创$ z$ D' k9 X. @9 Z; V
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
A.K. 回答时间:2018-3-22 12:12:50
F1_v1.60之前版本的L308处原为if (HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK)), 应该是if()不是while()吧.* V! E$ c- H% \# m6 x% P
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版