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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑 & @6 v3 S$ p+ u" F
; B$ u/ J" i& A, `; m! A
==========================================================
  p  M% T& L2 x! s8 q+ `) {7 }2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
. v. F2 y8 e) [& B$ L+ s其它的版本没看不知道.
" F" \8 g* @) d4 l% X8 D  I===========================================================
3 [: t5 c' L; |版本 :   
# d1 {/ d( k6 h+ b  * @file    stm32f1xx_hal_can.c
* X9 I  B1 c+ k' @$ T* }  * @author  MCD Application Team) F( ]/ _9 ]- ?; Y
  * @version V1.0.1  _# I' k* T) Y5 C& ]% y( D( C
  * @date    31-July-2015- A2 f& A1 b2 a5 Z' S* R
6 I2 \6 H) f6 Z1 `8 h/ P1 H
错误点 1:; a! h; v2 y$ M8 m# B
在  stm32f1xx_hal_can.c 的 L294 :
4 A( K0 u9 T$ z) B+ f: `) r               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
8 r9 ^6 k2 r! O5 X. E应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
4 F8 N1 E3 B! k9 ~& s7 L2 j% d' F6 W: b, J
错误点 2:
5 q$ s. U2 K" j+ K! M& q 在  stm32f1xx_hal_can.c 的 L308 :
& R# Q& J+ S" ~  J! a$ j8 \! ?               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
6 u* R4 A, b# ^: R' L# d应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
1 I! f; s; ]0 L5 H9 b* ]1 Y! M/ u3 O
上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 + ^3 T# y8 Y' b3 ^) i, Y) O
需核查其它版本相应代码.
5 j- e! U; G/ ]2 b! j* g2 h====== 2018/03/14 增加 ================================1 `* q; H( J; i" m- @- j( I5 A
/ `0 O7 ~0 v, t8 ^% n: H
平时顺序执行没问题,
( L  {+ d8 J) j6 `假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
9 e0 s+ |8 q3 ]- H- g要这么巧啊,所以故障很难在调试时出现  !!!" u' j% N1 u% l" M, [
在现场出现问题, 但调试时重现不了啊  !!!" J. B& i) d( o

- H0 ~* H! L& V/ W- c0 \这个错误存在于 多个版本中。 -
! y4 u7 I+ x  R8 M( e-0 D* v% u" {5 a# H6 f
=========2018/0316  增加:  分析  ======================================. p& P( {" k6 R& D( ^
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-  b; M7 c! S- r
-+ L6 f, g3 R; R6 R1 ^3 v2 s
287:    /* Request leave initialisation */7 e, |0 l% s% N
288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive* T2 ?; z, K* j# S
recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and
( \6 p* p# ^6 T  Q. O$ ^0 @' L$ o! Qready for transmission and reception. Hardware signals this event by clearing the INAK bit in3 P8 T+ ^8 |' d9 {9 P
the CAN_MSR register. */6 L$ ~1 R" c3 j

5 ]$ u; h7 w! S9 L3 C2 L8 [290:     /* Get timeout */
6 p$ S, B5 c' K( W8 j5 Y3 c/ m291:     tickstart = HAL_GetTick();   + z! I1 z" p$ |1 n9 E7 y1 d

! X6 {: ]0 ?. `3 ^" Z  p! O5 `* G' Z293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */! b+ h6 h, a) y$ M1 D6 u- ^4 g
294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
8 o% q; w( Q; h* N4 r295:     {
2 Y0 Y* i4 u. ^. W; R! y/ H* C5 H296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)3 w# ~2 y, w5 i( J
297:       {) h: ~+ e. _& m$ y' I5 F* m# @2 v
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;3 Q1 j. W, n5 r( ^& F" M

2 p3 B/ Y4 v3 j& m300:         /* Process unlocked */6 {. N- C2 ]7 o5 c7 {+ c
301:         __HAL_UNLOCK(hcan);& m' C. i; \) k9 H7 }' M

2 s! a. }" c7 P8 ~7 j! {+ A. E$ k' c303:         return HAL_TIMEOUT;
# l0 X; O/ B: |+ O' o8 S/ d304:      }
) y4 s' Y5 d$ J4 A305:    }
' G9 P- W9 \9 W3 p) O9 N* b+ U
: V+ e, K8 B# e) X/* 该错误引发的后果及表现,自行分析 */
2 A! M, y. x$ i, J. j: s# B
& `5 s/ E) L( l+ G" ]3 O8 f
) \: H5 {0 m0 y
) ~5 V) Z! m- j' y* {# @+ d
, W0 ]6 [# J9 Y6 p& _3 x; ]
% H- \4 C! S( y3 N* y
( K) v! f" ~2 W0 w

评分

参与人数 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 编辑 8 ^& K$ r. G% g. j, z3 A+ P# Z7 z, Y1 M
MrJiu 发表于 2018-3-14 16:56! m# ~2 W- z5 e
支持一个!!!!期待验证的人
$ T' g" r5 h2 f  `& ?, @5 a

9 C: N6 d6 @4 R平时顺序执行没问题,
) K) t3 @! B5 ]! q# y假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
7 N' p+ u1 E4 o2 d. A要这么巧啊,所以故障很难在调试时出现  !!!+ z- K/ F% A& G2 W* K3 S. f
在现场出现问题, 但调试时重现不了啊  !!!
% U+ t5 a( P4 \* t- n; k+ \
1 `/ c7 m; H/ H这个错误存在于 多个版本中。
( k$ |8 K8 Z. o: ]* g" g$ u; l5 ]& U  X+ M; ~
9 S' U, h' P% ~9 T
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:339 P  h8 \( w9 K  `0 s# Z6 s) R7 k
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...

) z+ c; y& G6 l这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创
; X3 `3 S0 F, v; ?6 ~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()吧.) Z7 `7 e/ n/ K  g0 o% q+ }* E# n- \
1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

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