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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑
! T2 k# W. @' `  h% y' R' k  _2 |, W7 f: L' w
==========================================================) c  d. D) b& ]" a: p/ N
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.- P+ M7 I8 L1 n+ \8 d; [, d
其它的版本没看不知道.
1 _' E+ o  g+ B! i===========================================================
  a/ y0 v3 _! z8 S7 y版本 :   
: i& o5 |( D. N5 `7 R# m, B  * @file    stm32f1xx_hal_can.c
7 b3 _" A* |/ ~  * @author  MCD Application Team$ w6 e! M) r$ W* }9 g
  * @version V1.0.1
/ [: n- I7 u4 D; M- k2 x0 I  * @date    31-July-2015
: ?2 r! g3 u: Q0 A( H* L: p1 {) n! R2 j$ C0 T
错误点 1:
% W1 U" `7 {; j# D 在  stm32f1xx_hal_can.c 的 L294 :
2 e  W( a, ?6 ]               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
; d- Z  |' Q  f0 y# }应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))- N0 E4 B+ F' @  U
& d4 Q2 S8 L( I2 N) {
错误点 2:
6 c1 ]9 t! F' z) D2 c 在  stm32f1xx_hal_can.c 的 L308 :
- |! }: K+ k$ N3 j. D               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
, _( v6 E  }  X& h. H0 A* |应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
8 @) ~) C  D) K* R0 K$ `, b) M$ }: W+ @3 M2 M0 Y0 d: U9 W$ S% d8 M
上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 . `0 Z3 b# A" s6 x
需核查其它版本相应代码.& [1 e9 i3 }( b- G( C  F. a
====== 2018/03/14 增加 ================================
4 o2 M! W* k, k! d4 a  d5 ^6 `% x. D8 `1 V4 K0 J" G8 I: u
平时顺序执行没问题,
# J- o/ h( p- |* k+ {) ~9 o假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !- x( u  u9 o4 V
要这么巧啊,所以故障很难在调试时出现  !!!  m5 S; p; t" j  w6 a# z  l+ Y
在现场出现问题, 但调试时重现不了啊  !!!
; ~3 B5 `6 l7 F3 }, S4 \6 [% g% X0 ^  ~
这个错误存在于 多个版本中。 -
( Z$ _& |+ q6 ^# v7 B7 I# B-/ _: k$ v: {4 L) Z. ~9 J
=========2018/0316  增加:  分析  ======================================! y) Z3 F3 b& }; c  ~3 X
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-2 t1 M6 W# ?0 I+ m' r
-
7 V7 _/ j- K2 s3 K$ t% R287:    /* Request leave initialisation */; j3 W1 R( j6 a" |* q7 }' ~; g" a  B( t
288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive. D) Z+ [5 _% i: {
recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and
! z' I8 p) U' Wready for transmission and reception. Hardware signals this event by clearing the INAK bit in( M' v' n% W# R/ _& a! c
the CAN_MSR register. */
3 [$ D" s9 P2 N. P
6 ^+ d8 m  F4 m( e290:     /* Get timeout */8 [$ B7 n% |% |# I9 V# h  N/ I
291:     tickstart = HAL_GetTick();   6 z! M, y$ \4 o2 u- a
5 @& ?, P, y  P
293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */& s' |4 W* W! u  X% {
294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
* z1 g% r! p  z3 @/ v9 J7 U295:     {
( c" q4 G3 a& T: ~5 r. |296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
  b; B- t' {; E/ Y/ H7 h297:       {& o6 W$ C( W8 B# S% o3 T
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;
: y2 K2 z* V8 e5 c/ k! o9 Z0 N1 U9 v
/ B! [& I8 c8 d" y300:         /* Process unlocked */" L1 @/ n( J1 O+ q# g  A' u
301:         __HAL_UNLOCK(hcan);+ p% J! w+ L* K0 z- [/ Z8 J/ ]
& [0 ~" ?- D: |) n  t' I+ _; Q) R
303:         return HAL_TIMEOUT;7 i9 P: v) p* u$ M/ x8 V
304:      }! y# n  x% F7 ?4 C2 _% Z( M: E
305:    }( b$ D( A# `6 n; b9 Z7 |" D
: L9 l2 ]  o* h. X5 Q1 Q
/* 该错误引发的后果及表现,自行分析 */
% n1 Q6 q; x/ x. p* ?! R
" W( z" l: T/ G( q* D% A: K; |5 O
4 Q' s9 e# y4 `9 A

8 a1 ^: f' I6 j6 ]" `" t+ Y- R3 W+ F! I$ ?, h; \* i& M2 R

, m$ V+ I% _' `+ F

评分

参与人数 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 编辑
% b$ F8 n! c; r3 I1 T
MrJiu 发表于 2018-3-14 16:56. ~/ y/ l9 U7 |5 U2 _& n% \4 m* b% a
支持一个!!!!期待验证的人

2 E" Q' d4 A, m' B$ Q
1 L; {, u- E2 g平时顺序执行没问题,
  u3 b- U0 _, R! X3 K假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
  S0 z5 g  k7 A0 \2 Y- R( U+ h5 |7 s要这么巧啊,所以故障很难在调试时出现  !!!. |# Q" j7 g" A
在现场出现问题, 但调试时重现不了啊  !!!
/ g. {  h( y2 w+ w# |7 @5 t1 k) @( S
这个错误存在于 多个版本中。 2 H% c2 q2 n7 ]$ }- r* u( T
5 A. d+ U9 W: n, v7 L1 i' }

9 P+ p) g; B! q: r1 D
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
  t0 W8 ]+ J; W" h3 ^最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
$ q9 A. G1 q* l1 I& \
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创
9 V2 A2 U% X; t7 I" ?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()吧.
2 T/ s; J6 A8 J! N; J1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

相似分享

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