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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑
; ^& Z, n' H; ^6 c
6 b1 ~0 |' B0 l4 b/ n0 \. p==========================================================
" p: j, [6 `; j. D+ M2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
9 B9 g; E; T. C; ?/ W, N* v其它的版本没看不知道.8 Z5 D5 N, x( J8 o* \5 a
===========================================================
$ o1 j& d" J; @版本 :   , {' Z/ v* p8 b; M4 Q. j
  * @file    stm32f1xx_hal_can.c' x- O4 R, |9 W. A- o
  * @author  MCD Application Team- G. G2 k5 `/ h
  * @version V1.0.1
  s$ V6 B3 E5 v# v7 }  * @date    31-July-2015
- x; X( o' |) v! }+ |, b5 V* V$ C& I  D1 v  H; a, E: O2 b' e
错误点 1:7 L6 s5 x8 \9 a  O
在  stm32f1xx_hal_can.c 的 L294 :  B6 D, I3 M5 V* \/ z. k
               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))1 i/ N. _2 {: o7 T2 Z6 W5 \
应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
& r: X; X3 Y: F) ]# {( q# x# q  y" q$ e, U5 M" f' k+ y
错误点 2:) l! }( U$ y. Q7 b
在  stm32f1xx_hal_can.c 的 L308 :0 A6 |5 n' j0 W
               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
7 W  i. w; `! w) W9 X应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
% r1 \5 Q, f- Z# V
: y. {" G, D  X  E3 y) E& C- a5 K上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 4 j; j( ]8 q: H! F8 m5 X
需核查其它版本相应代码.
! C6 Q& t$ w( A! c6 \. f====== 2018/03/14 增加 ================================
& s: A' Z. e; C6 N! e
) S0 w, g+ Y, u" k8 L% k, E) o平时顺序执行没问题,
% _  n5 S- H& x+ F2 \, j假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
6 L) r( Z1 T7 _要这么巧啊,所以故障很难在调试时出现  !!!
. O  E  Q7 n5 ?5 {% B8 X% i" ?( \+ x在现场出现问题, 但调试时重现不了啊  !!!5 z- M3 U2 i4 a5 E5 U9 ]
8 k; l$ c# y. v$ U! U" Y
这个错误存在于 多个版本中。 -
5 f% X% i2 }5 L8 M-
* @1 r0 p. `! x# h0 J=========2018/0316  增加:  分析  ======================================
# T$ E! L" ]" @! k4 }以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-
- n/ S4 X: ~* B- k! _& m6 T-
% C: r1 t" l4 b  _  H287:    /* Request leave initialisation */
# p& T& e1 r. g) w1 S+ y288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive
$ g5 b* w& p# k5 ]9 q/ M, H5 Rrecessive bits have been monitored on the Rx signal the CAN hardware is synchronized and, [3 x! q* X2 T3 [' S
ready for transmission and reception. Hardware signals this event by clearing the INAK bit in9 I8 t7 y$ I! d! M
the CAN_MSR register. */
5 I; O/ b# S- X' N, e/ c
  F* g! Z& P, I0 p0 D290:     /* Get timeout */
* I$ P* o; A' E& K2 l291:     tickstart = HAL_GetTick();   
. B& k0 M5 y) x7 {6 e
- d2 |/ v( {8 ]- r293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */7 J, d3 A/ t/ S0 T# h: o: m
294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
# S  H- G% L2 B2 k1 n: H295:     {
6 M3 y4 ~, b" A0 A5 r& L2 Q& o0 @; G296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)0 }9 e# p' Q1 ^# k& r
297:       {
$ W( [4 G; u$ m4 j# }298:         hcan->State= HAL_CAN_STATE_TIMEOUT;! H; }$ m7 U4 U. I, M& O8 G
! v# @+ H2 {6 O# ]5 y
300:         /* Process unlocked */
% p0 f3 U$ _  w  ]: J301:         __HAL_UNLOCK(hcan);: Z2 h' g: q" X# K

/ x+ ^$ B" F1 B303:         return HAL_TIMEOUT;
/ A! |, F# B/ q* W/ v  h! ^304:      }$ R0 `, j/ V! |0 ], x
305:    }0 N' N6 U* _7 ^4 W& c

1 q; z6 J+ a; O$ T  D1 ~2 T2 z1 }0 K/* 该错误引发的后果及表现,自行分析 */8 [) j* z, l8 s8 t8 `
) a  b# }  |0 i( f; b
9 U4 r7 x0 p. i$ r1 F" M, `8 m

$ @" D0 Q, [; G; w  o% B2 a6 V6 `; ~; z

) v0 d* K5 o) w& b
) M4 Y5 j9 c* `9 @5 a

评分

参与人数 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 编辑
+ j% s  ?; W; S$ J
MrJiu 发表于 2018-3-14 16:56+ A4 Q, W  n9 R# I5 h4 R
支持一个!!!!期待验证的人

2 q9 n3 E, W! I& w1 P2 G/ B; |$ h+ g
, _& g, k; A6 C0 l" u9 k平时顺序执行没问题,
# y9 @$ @, d9 m! d3 s" B. x0 `假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
% _8 @/ G% n, X' o/ r; n$ ]5 q要这么巧啊,所以故障很难在调试时出现  !!!) ^& Q+ P9 |* n
在现场出现问题, 但调试时重现不了啊  !!!
0 m0 S5 d- H( e
- i: k4 V+ f" n7 S) q* D这个错误存在于 多个版本中。 . \/ Z5 V; X; |  e8 R

  r0 b9 ]8 O( S4 x+ O, x5 ?0 t$ @( i4 _  v- o4 V! a5 x1 ?1 b
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# @/ V8 \  v  k3 M+ p. H5 p- X" r
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...

, C, C! r3 T7 J# e) S这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创8 S) ]  |6 s. l, K, }
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()吧.
) ~* }3 `8 a2 z' S7 F  M1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版