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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑
1 T7 V* d! o6 P' ?6 B1 @# Q/ b
7 O( n% n" F; D7 X1 ~0 K* i- z==========================================================
4 A7 b/ w1 E3 h4 g, B# L2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
9 g" g/ p1 S/ a" z6 x: G, ?" p5 A4 D其它的版本没看不知道.& [' N* L. _( y' g" Z* h0 Y
===========================================================
# u! z. U* |: t# R/ J版本 :   
& q3 N- c* d) A5 X! c" G  * @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

1 [5 q! n5 s8 w错误点 2:
) Y( Z- E8 L% M) |$ g. z 在  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))
4 P$ u+ ~- X5 t6 t5 G
, w0 k2 m$ F: J- Q0 A6 d1 C上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
( b: }7 H1 |' j1 _需核查其它版本相应代码.
) h' j  K6 O4 A. ~! ^  A. y====== 2018/03/14 增加 ================================, s1 j, q4 `+ d+ i3 U$ v
6 d4 o' M- x' i6 \
平时顺序执行没问题,
4 D- e5 N& ~: p+ e1 l) ~; ^# e假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
. E, ~+ D; {. U! Q$ |要这么巧啊,所以故障很难在调试时出现  !!!- V5 K9 N& Z! ^  ?
在现场出现问题, 但调试时重现不了啊  !!!2 Z' H- O, k' s7 q$ K
0 s5 l+ {6 y. I
这个错误存在于 多个版本中。 -
' ?3 l( m  S& m% G( P: s- s-
4 A9 ^( q6 y, O0 n! [=========2018/0316  增加:  分析  ======================================
2 f) G% e# J9 |) X6 _1 P, |% D2 _以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-
' u' S6 F" V" Q8 i2 w$ Q5 R9 [6 k-% T, {" M" P& g9 ~
287:    /* Request leave initialisation */
8 [' C2 G/ {1 r. d% W! B288:     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 */
8 k' i  o- \7 V; p5 R: e8 [9 m3 _291:     tickstart = HAL_GetTick();   
6 n0 T) `/ Z  N. s8 {7 t% o2 q2 Y- u$ q- I7 s
293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
- \5 l* l' k" x0 r1 P/ G294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
% d% m: {- @. b7 p% U/ l1 l295:     {
5 b. r/ ?$ b8 X: F2 y4 X' c5 G$ \/ u2 F296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
; Q% U. O: d8 F1 P4 j+ e' i297:       {
/ n! e" x' U+ e298:         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;
$ F- S% K+ ^/ r; l+ E. b3 q304:      }
/ d( J, c, u1 a- i! |' ^5 ~305:    }
+ S  S) q# Q6 Q+ y6 H. i* _& z+ m, R% L" i5 ~7 V; w8 [4 m% ?
/* 该错误引发的后果及表现,自行分析 */
6 ]% [# D# V: X; z
- T2 s6 q8 i& h/ Z* `
2 l$ X1 I" r, D" O6 h
. ?8 Y3 B, h* i4 v5 d. U% ^8 J
" A7 m7 D, C/ H% X8 t& [2 u* J& U' a! Z5 A5 }+ ?9 v0 P8 q% e" h

) @$ W( O" _' r: y0 b- x# M% s! v

评分

参与人数 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 编辑
0 ]/ M$ Q: R  D& T2 w
MrJiu 发表于 2018-3-14 16:56
/ ]; A6 y, Z, v( R' l7 K8 p, L支持一个!!!!期待验证的人
5 x# }9 G3 Y! Z  c' {( R1 t5 D

7 i6 @4 M0 H0 J% h平时顺序执行没问题,
: Z+ ~: F; b  D假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
, B+ J4 C: f3 E0 ~; S) r! b0 c0 h+ E要这么巧啊,所以故障很难在调试时出现  !!!
, L7 v% r. F; _: K3 a- T在现场出现问题, 但调试时重现不了啊  !!!) W$ P8 x- u% R- [8 E+ k! A3 ^3 A/ I

4 z" d, U2 W3 f# t/ E4 |! X这个错误存在于 多个版本中。 3 \  H. J* O8 r) `! X) F, }
# H3 M, m/ L# d: p/ `2 E" ^

+ n7 h* n, I0 o$ z" ~
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
- U1 L: _% @2 T$ u" o4 A+ T8 U4 U/ G最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
0 y7 E. J2 Z0 m4 G* ~% N
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创$ }/ E3 }6 R! a1 h: s6 E
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()吧.( J- V6 W' Q* ~" i# y, X
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版