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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 9 m2 c" u( I' D( H' I
: F; ?2 O+ ?8 w9 C! y, ]
==========================================================. _8 ^, O+ q( x4 }( k
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误./ \$ x8 T; ]# H4 [
其它的版本没看不知道.
- c$ X/ ^! S: X, |===========================================================2 h8 z1 q% K) f3 l  j' x
版本 :   4 {3 g  }8 v1 y  r% ~) d1 C5 G
  * @file    stm32f1xx_hal_can.c0 N# D0 B4 O& ]3 W/ }! d, o
  * @author  MCD Application Team3 K' M) B  X# f$ o2 G% c4 e0 v
  * @version V1.0.1) l! G2 ?% R, Z3 {% J
  * @date    31-July-2015
1 D/ i$ a  A8 I: i
) {3 W: ~! k0 I. t2 I( V错误点 1:5 e2 }& t+ i) u/ f
在  stm32f1xx_hal_can.c 的 L294 :4 k  C- N  M7 X! g' n
               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
# \& X  R: T9 f7 ?+ D8 F1 l应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))( A: l# v- a  c3 o0 j( g4 T
9 n4 S* D# l0 u2 l
错误点 2:5 D4 S; A( x5 Q4 g
在  stm32f1xx_hal_can.c 的 L308 :
( Z2 f6 Z$ I5 I  f9 P) k, \/ H               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
2 @6 u% k" j6 w6 {) L7 @应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)), Q. Q& Y, u% C! v( }- |
* ^3 {4 o: u5 b" _
上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 2 `% V5 E& ?7 w: C) y8 {7 \
需核查其它版本相应代码.
$ u9 _2 B. k/ f====== 2018/03/14 增加 ================================$ c$ {+ A  q" O- Z; n/ p
4 ^, U$ @0 t$ H) \6 v
平时顺序执行没问题, ) z, a* }( \) M/ z
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
* o  l  `9 l! Y9 H3 Y3 V4 y' Q0 J- g要这么巧啊,所以故障很难在调试时出现  !!!
* H$ E- I' X- [- E在现场出现问题, 但调试时重现不了啊  !!!
* R+ B7 b9 H3 g( A1 ~5 {5 O' }: \( }" r3 R; W$ s8 i1 |( t: q% E
这个错误存在于 多个版本中。 -# j1 L9 P, M# ~+ M
-+ X, h. }( _, p* X" `) w
=========2018/0316  增加:  分析  ======================================
, a8 a6 h- l; E  t/ q以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-1 v% E3 @4 T) g, F1 |
-8 H0 }: k- h5 i* |' I& c
287:    /* Request leave initialisation */
2 O& Z( Z# k2 y288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive
% P" m, `1 r- ]; A7 nrecessive bits have been monitored on the Rx signal the CAN hardware is synchronized and
+ H) w$ q5 R: a0 b) i! Wready for transmission and reception. Hardware signals this event by clearing the INAK bit in! T1 X* t8 z& ]0 e4 w; ?8 B- ?2 E
the CAN_MSR register. */! j9 x4 O* |$ q7 D
) u$ `2 ~+ i. L. a; b
290:     /* Get timeout */1 G3 t/ @  M( O! a9 T5 h: w, G
291:     tickstart = HAL_GetTick();   
6 L; O- \% G# w0 a" Q2 }% J
9 Q7 p/ _$ O1 ^6 Y293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
6 B; F5 v( j& p5 b( H7 a294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */  }2 V; |* U- A
295:     {
/ I* G" S, G5 V$ S8 r+ \( I296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE); z' `& D2 b0 p3 J9 o# z8 H
297:       {
1 n- \) ]6 o& [* y+ a298:         hcan->State= HAL_CAN_STATE_TIMEOUT;$ J" a3 J# n* _5 ^# `

6 B: C% i, r. l$ I( f8 ]300:         /* Process unlocked */
8 N! S* S6 O* n  B. V3 M301:         __HAL_UNLOCK(hcan);
/ C1 r% K' H! n6 }( s$ ~5 D$ z& n$ s  K3 g7 W
303:         return HAL_TIMEOUT;6 q& _" |6 l7 h* i( H* P
304:      }+ V. n4 U- W. z* c! W" A
305:    }
) Y. `  h  |) ^5 z, K) @- a7 g2 m4 K& c! G) B" Q' U
/* 该错误引发的后果及表现,自行分析 */
) P5 P' p* ^* |) ]3 B
+ R# j( H# {9 T$ r% Z6 \
8 ]+ ?  D, ^5 d+ @; y4 F0 I6 _+ U3 K+ {  J$ R+ O: \  _
- b6 C' y3 z/ N4 f. A+ x# k
9 ]. g7 U/ F+ r/ }, L1 r
8 h$ N2 P3 y3 P

评分

参与人数 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 编辑
/ p) [3 e- j) b$ W
MrJiu 发表于 2018-3-14 16:56
! r' T! w9 g5 G8 Q  ~/ ?支持一个!!!!期待验证的人

0 `; z2 K% e1 x+ |6 L- _
, }; Y# i! C/ o2 a1 v$ M1 @" A- c  Y平时顺序执行没问题,
3 w0 a7 T4 H$ u- t假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !$ D# m" v. ~' Q) E; l4 V
要这么巧啊,所以故障很难在调试时出现  !!!2 ]* c& Y  l( Y1 m- x$ y' J
在现场出现问题, 但调试时重现不了啊  !!!; m) _& _1 |! E2 y
4 Q: z/ l, b# K* p. h* [9 |' h$ M
这个错误存在于 多个版本中。
( i' Q' N6 H* l: ~! {' f3 r! V
; S8 x5 G" D$ J3 p+ n6 {3 Q+ u1 {& u2 C1 y& w( n' q. S
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) G1 i+ |+ y0 y( @  S8 j+ u: X
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
1 Y0 i( b; i: w  ]
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创( t$ F3 u$ A8 }% |1 Z. V0 O) {
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()吧.) p5 Q, K' L9 ]2 p+ c2 Z# R
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

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