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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑
4 J4 r3 s4 x  F& G: c7 R+ Q- [( ^* O5 @- `3 ^9 m) I! x
==========================================================: V8 K( j+ ~' n5 L* F6 j6 t- ?6 L
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误." p  ]2 S. d8 h" ]9 a5 `
其它的版本没看不知道./ p' U; t- _1 \8 V, C. i+ y
===========================================================
& N/ q+ I1 W8 j0 t版本 :   - p" |3 V" h+ x1 c' n
  * @file    stm32f1xx_hal_can.c
& F9 o6 p8 T* L9 I  * @author  MCD Application Team
  \8 ?9 A8 r! G6 |# c- |$ ]  * @version V1.0.1
- M, u. K* i6 [6 x3 P& I  * @date    31-July-2015
/ f9 U* C) k/ B0 [- L* N1 E7 p" k, r, u
错误点 1:5 L7 R6 N5 X3 T1 B! b
在  stm32f1xx_hal_can.c 的 L294 :
% J% D& v' p9 s/ v  n( F               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
) e* l( o6 M: ~: g3 r) ]( Q' S应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))% Z& C' ~$ D5 D) t( J* v2 c' V

/ `9 e; \1 [& \8 Z5 L3 H" D错误点 2:
) |' N4 L0 z/ m  W+ b" y4 h- ?: Q 在  stm32f1xx_hal_can.c 的 L308 :
. h' R) L: P, h- a+ U               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))2 R# |& K# W$ i# K, ]
应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)). _# V! Z8 s" e6 {9 N

: @1 g) d, e. V9 T' |* {上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
7 V& `  U: [5 @7 k) T7 o* T+ ]/ \* M需核查其它版本相应代码.
, x$ Q! B- E: b====== 2018/03/14 增加 ================================$ A- m* Z1 d- p' k% U
. f' ^$ l( `& R0 U8 d$ K
平时顺序执行没问题,
$ _2 Y" j6 U3 {1 T假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
$ T9 d0 q/ V& q要这么巧啊,所以故障很难在调试时出现  !!!( u- p1 g8 d5 n  e7 h
在现场出现问题, 但调试时重现不了啊  !!!
6 L3 D% ]4 A3 D
$ M" @* Z0 B7 H5 I& X这个错误存在于 多个版本中。 -
+ {6 h0 q$ J/ f/ v-
7 f' r% A; b! Q! N! X=========2018/0316  增加:  分析  ======================================. U& C5 w1 w8 P1 X/ J3 h
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-2 q; C7 G) X7 B/ N7 U) Y; s) K7 b) {
-  }" D* k% [) [& k3 p! t7 T$ c, W
287:    /* Request leave initialisation */
! g6 t' q( |2 O  `. L2 F) R288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive
( l  a6 |" ^! P5 ?recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and* B3 @8 e4 [7 k* v$ y* _
ready for transmission and reception. Hardware signals this event by clearing the INAK bit in
  C3 @2 a6 `% w* Ethe CAN_MSR register. */
. P, @# u. a/ m! o: N& C. z: c2 L( T7 }" q! b5 w
290:     /* Get timeout */) d) _5 N. S0 a, k0 B
291:     tickstart = HAL_GetTick();   3 M, X3 q: _' q5 f) L) @3 y6 D
9 s2 P6 p1 Z  }9 ~7 m: g! c
293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
2 x1 }5 E/ F: G( O# _4 N7 S294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
$ Z. v1 r( @7 l% q295:     {
9 n0 ~- D$ \: Z) F) J296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
7 z' m! r: h7 r$ C; L& J! e297:       {1 {4 k/ ]" w# j
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;' y, f  E* _2 [1 e8 ]
; \6 K8 U1 S2 ?" E6 o0 H. P& x5 D( k/ ~
300:         /* Process unlocked */
1 [; f- g: L# k* \! h- D& g301:         __HAL_UNLOCK(hcan);8 L: W# S  c. s# q8 h% r
$ n  Y) f' y( t
303:         return HAL_TIMEOUT;: K4 C, z9 |- F" B% G0 Q- \
304:      }
" w: R+ z4 Z2 S1 F& @8 v305:    }
: R2 L; z1 x" ]! d( b( \$ X2 a! a# G  N& s' r0 |/ q; R' D: _$ U4 I
/* 该错误引发的后果及表现,自行分析 */. w  g1 c4 V( {4 |7 i, X. q

8 S4 G0 x7 r) u) ]" ~& l0 P! N/ e  [& z& [9 {

% d0 h: I1 p/ X* H' C: I0 \) l* l$ _3 j- s" y6 k
. K6 M' S, o/ Y& w! U

( N% G+ s) q2 P9 _1 X

评分

参与人数 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 编辑
2 }' d- Q; ]: d6 `1 {# y2 z
MrJiu 发表于 2018-3-14 16:561 y  {  |0 M4 w  D4 k
支持一个!!!!期待验证的人

7 h" t* h( k' |7 E; o! N! ^# X9 J! ?0 G9 ]
平时顺序执行没问题,
4 n$ U/ o4 K: _! |4 ^/ h5 I" G, x假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
* O9 z, ?8 I. H; O- f要这么巧啊,所以故障很难在调试时出现  !!!' J3 T3 I/ l- H
在现场出现问题, 但调试时重现不了啊  !!!3 X6 l) z1 H3 s$ ^

' b" I9 Z$ a9 g, C3 ~+ b这个错误存在于 多个版本中。
$ m( v7 P% [; Y, |' E( r7 c0 M5 C# q6 O6 C

5 v% q* r% ~* K  w$ A
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. c# e& F, d2 H& U+ U. E( P
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
& u1 J8 q0 ^0 \! _* {# I
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创
9 [& v) n( H2 i4 e3 Z( z* w6 J$ ^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()吧.' _; u. V/ M2 U$ r5 s6 C
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

相似分享

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