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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑
: {2 o5 t, w8 \. Z3 ]' [6 Z0 w( K) G% R3 |- g- ]
==========================================================& e( E3 H. _' I3 y! K
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.
+ ~6 E6 g  J7 N) B: M: b其它的版本没看不知道.  R' W$ {7 o( F( B+ T9 j
===========================================================
; U1 D% D, W* _; A# F版本 :   
+ q' y( E5 W$ x, {  * @file    stm32f1xx_hal_can.c% l  s$ ~8 }' A# c
  * @author  MCD Application Team! s0 b+ p% ?" o- m, `) y
  * @version V1.0.1) e/ }+ [' {( Z" ?- v. t# n
  * @date    31-July-2015
9 n% {% E( Z$ o+ o) r" L3 Y2 w+ C: g; z, j" f5 T$ l9 }
错误点 1:0 p' J% n# Y, U; G3 a
在  stm32f1xx_hal_can.c 的 L294 :0 S. k2 B# c6 }0 m8 V5 \( ]" |
               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
9 D4 k' j) h( F应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
) L9 b9 r7 S- \" E" t* s! z2 `* l! J3 _: P1 N( Y3 h" C& r6 q
错误点 2:
  P3 r" R; Q& ^1 l6 b 在  stm32f1xx_hal_can.c 的 L308 :5 ]9 n$ t! [' ]3 |0 L
               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
5 e% A) k" U" w, [& W0 m1 F1 H应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
# A) {/ z! m% S# A& t3 e, y9 p
# p0 j, {( t- a+ @5 m0 y1 e上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。
& m, }2 \" p0 y1 \1 E! `需核查其它版本相应代码.. A. D4 H& ]8 j
====== 2018/03/14 增加 ================================
5 D" ^3 _% y4 l3 Y
  a! N+ A; a+ }5 b; ~( T* Z, t平时顺序执行没问题,
* k# Y* d/ u9 h8 C假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !; S) O7 C; W# X2 |0 _# z
要这么巧啊,所以故障很难在调试时出现  !!!
4 b# G: K6 Z3 Z/ ~6 Y" @2 @在现场出现问题, 但调试时重现不了啊  !!!
( g" N. `, m# c( ]
5 w9 z( E' q0 a# {+ N这个错误存在于 多个版本中。 -
! S. p6 L$ @+ [1 x) Z0 n2 W# R-
; U9 J4 L, \3 @% S- z=========2018/0316  增加:  分析  ======================================+ w( |5 k5 S+ n/ M; P$ X8 |
以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-
5 [. b9 \" o' M: Z* u$ W) L-
: S% U, R2 N1 y+ M( F! r. ?287:    /* Request leave initialisation */
6 |! K9 x& `' B- C$ z( r5 g. E( U288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive/ X5 c% f: k7 e  Z
recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and7 Q$ ?. ^: \2 `0 R3 d7 W
ready for transmission and reception. Hardware signals this event by clearing the INAK bit in
* D& F! ]' \" G( {! Lthe CAN_MSR register. */: k+ B! k& a+ {% I  m# ]9 C

! n: s; ~, Z5 s* s* H" h" k290:     /* Get timeout */- h# r% i* \9 i# T! _7 p
291:     tickstart = HAL_GetTick();   
& D# X3 {% Q( J
4 e; U5 {% m  j3 E6 D293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */! |3 w) S  k: q; H1 l' B
294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
8 ]1 W- T/ |/ B& U7 Z2 i- D0 v+ C295:     {. g2 u2 T  ~1 |6 O* z5 x/ y8 D$ I
296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
7 E) z! o( [" e297:       {/ G. E  J, p7 j+ g. I* C
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;
0 f; s# ?3 s# K, u+ v. n9 {7 T/ y, w5 C* E* B" U$ k
300:         /* Process unlocked */
) P% c" u) W. b9 k301:         __HAL_UNLOCK(hcan);  l/ y  Q4 c+ A8 r/ D: h
8 [2 k# ^% x4 }3 ~1 R
303:         return HAL_TIMEOUT;( O1 y7 ?( i. J' O7 k; l1 @! h! d3 C. Q
304:      }0 g) y, {9 R5 T
305:    }: \6 H5 W6 u$ @* E

$ U# K3 R8 A* A6 H* r$ i/* 该错误引发的后果及表现,自行分析 */8 {0 K' }( }5 m8 C& m( Y: n
8 G, l$ q4 L- Z  S9 c1 ^
) F" u6 _) M, v$ w- ^, z
' g$ Y* X! m; I! V

/ p- V/ v/ y6 d9 l- C6 c& M( o9 Z  R1 P

, T! K5 J6 @' X  U. g& ?

评分

参与人数 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 编辑 # a4 X; S( I) u* F
MrJiu 发表于 2018-3-14 16:56
  g7 E+ ]/ V) x4 f" N# y9 N  X支持一个!!!!期待验证的人
& S- R# {7 b* U

  d# Q0 h3 \: _' V平时顺序执行没问题, 0 s; _; Z' w6 j5 O8 K# S
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
4 O. |- \% c. M! K& C7 \. i# h6 R: P要这么巧啊,所以故障很难在调试时出现  !!!- X2 S2 _) V$ s, ^1 i6 G
在现场出现问题, 但调试时重现不了啊  !!!
9 z% D0 i( _3 h+ }: Z2 `. E- M+ c$ U; h  W. g
这个错误存在于 多个版本中。 * ?: U7 K) u. V- T) y

. b+ T0 g# ~5 @; t8 ^# X8 v+ o5 _! ~6 W3 n
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
5 C5 m  q  V5 y; ^) E$ |1 Y0 k最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...
9 v$ d; O! z8 @1 V
这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创- V8 V3 C2 _' ^" u$ H: Q1 v0 z6 Z/ d
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 ]0 |- D! t1 o6 v% d% ^& F! u1.60,1.61之后版本已经改过来了.1.60是L316和L330;1.61是L314和L328.

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版