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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 ' y4 F/ ]3 e3 Z& s8 g/ C

. ^3 u8 x5 h6 Z$ T7 I==========================================================' |3 E% s0 _2 F( U* P8 Z
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
5 q7 E6 C$ t8 W% Z其它的版本没看不知道.( H( x4 {1 Y- N* P/ T
===========================================================' ]: r+ d: _4 s2 B  Q4 K6 Q3 P! c: [7 w
版本 :   
# z! m- [: `1 Z( |* M  * @file    stm32f1xx_hal_can.c
0 o+ e( B: B) T6 h" [  d5 M4 r; w2 O  * @author  MCD Application Team
# u3 @$ S/ d, Y. B8 l; ?  * @version V1.0.1
( J- `& r: l( ^. [7 b5 \  * @date    31-July-2015
; G; s+ p2 t; C( l0 h/ |3 |
4 Z( D4 N& i, k错误点 1:# y3 m, o1 P, f* M5 I
在  stm32f1xx_hal_can.c 的 L294 :
# o8 V, ?% U2 ~' l               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

# v1 v. z: @3 ]错误点 2:
- _( ?4 U0 B  j$ \6 N# X6 t 在  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))
0 V% n4 `) D( m! S: J3 W2 e9 }
- e, J6 a3 G- H上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
+ f3 `" b$ M/ z$ k9 `3 w需核查其它版本相应代码.! {% w+ Z* Y2 ]* H
====== 2018/03/14 增加 ================================
5 Y3 F  |3 i+ |0 W/ m7 A+ Y- [) f
; X$ B! H6 S8 i" {% B, v3 Q% G平时顺序执行没问题,
% n* Z8 |; P8 V' F  @6 o8 i假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
) }9 j- E3 @! i( m% l8 B要这么巧啊,所以故障很难在调试时出现  !!!5 v! v8 U% U: \2 i
在现场出现问题, 但调试时重现不了啊  !!!
9 f8 r  ~* }& l
7 _& ]. g' B# z0 q0 t! L这个错误存在于 多个版本中。 -8 c; I+ |1 Y5 F; ^7 h" |/ E
-
% m" {( y) ^/ `% E( b=========2018/0316  增加:  分析  ======================================+ ]: h" L8 t6 }9 e  o7 ?4 ?
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-+ I% Q% I8 R" z; @2 x4 s) C
-
4 X8 y. n/ u. \& h287:    /* Request leave initialisation */
, Z& m2 w* H" Q9 W6 J+ y288:     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
6 p1 g. ]4 `1 k# Lthe CAN_MSR register. */6 `- {% X' c' |1 @, k
3 Q7 l; ]3 B, O0 H8 V' V& y
290:     /* Get timeout */
" m" B( D2 I0 Z291:     tickstart = HAL_GetTick();   
/ x4 O/ I; K' I: j' C1 P  C" s+ `% F6 O& l: `5 l
293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
  [( \- C4 l) ]1 D7 D5 T5 k294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
4 N/ t5 A7 k" O295:     {
/ u# ], H9 O& |4 C/ L; L296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)/ i: a2 |5 q3 N  j
297:       {
3 `% y5 P; [) i& y" t4 P& [% q298:         hcan->State= HAL_CAN_STATE_TIMEOUT;0 `2 H# i2 [! M  m

* U( I& `0 v- q7 q9 u300:         /* 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;
" Z8 s- K" Z! f" j3 b+ n! ~304:      }
: C8 _2 V! F) w0 n. ~305:    }
" [) L  D( r) d: z  v% P
2 K8 O# d+ Q; S7 O4 S0 H: R/* 该错误引发的后果及表现,自行分析 */
. y8 z( f$ j6 `8 _& C
& ?! E2 q5 y& B# h4 b/ t& }( D' T

9 w$ `6 I3 I3 m) C
8 R1 k8 v# v) ?( {: w* g/ U& N1 @2 G
3 L* }* z& r5 i3 o) d" Z7 N+ Y9 }' P% x3 r( t6 z* M

评分

参与人数 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 编辑 + x! v9 W2 u" p0 r% s
MrJiu 发表于 2018-3-14 16:56% P% f; s* G0 G* L  ]
支持一个!!!!期待验证的人

' U* C" L) D6 C0 t# m! p4 _+ 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 ]( S1 @9 W) b6 p, k) L7 A0 W( ]- ^- l0 ~- U

2 \$ X) t+ ~2 S7 e. D  R! u$ W- j% }& f
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:336 B* q2 E" z. t2 b' R! ^
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
% z" i. }2 R3 m
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创
" i) q# O/ S3 k& m% t" ^# whttps://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()吧.
4 B  B8 M6 a# F3 K4 c, V# h1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

相似分享

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