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

stm32 HAL 库 can 代码 纠误

[复制链接]
hi201803 发布时间:2018-3-14 16:10
本帖最后由 hi201803 于 2018-3-20 13:53 编辑   L0 H' J. S4 r  D5 ?' L
7 I4 i) S2 G' H/ [8 I' H
==========================================================1 b' |! n1 }+ y5 Y, F
2018/03/20  刚才看了一下最新版 F1  v1.6.1, 这个BUG已经没有了。要用最新版,因为其它地方也有错误.8 \5 [1 p$ K' b7 q5 b
其它的版本没看不知道./ G+ `5 o& R& ^( R+ g
===========================================================9 M: j# y- |: D8 r: o" [
版本 :   $ T2 Y7 B. T# ?0 Z
  * @file    stm32f1xx_hal_can.c
" v$ ?" p- k+ ^# i" O  * @author  MCD Application Team
; `' {% R3 A& a& ~, T; F  * @version V1.0.1
! z/ g5 d. G5 ^( o9 h9 F! B  * @date    31-July-20151 Q* W4 X; Z' c. a7 N4 r0 P& H

) N0 v# ^: @( {3 {错误点 1:
: }* J, _/ I7 R4 h6 |% p: B 在  stm32f1xx_hal_can.c 的 L294 :
/ _; p& o8 ~0 y  i# ~               while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
4 F6 a$ a4 f- ?/ X' @. q  b应该是:  while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
$ N& Y/ W  V. Z# q8 D$ S0 h4 B  v* O: H* T. n
错误点 2:' O& t; m: A- J5 X1 `9 P4 a  M
在  stm32f1xx_hal_can.c 的 L308 :
  @  K" f, F5 z! D               while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))+ {4 w  I" [1 @
应该是:  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))% R6 d: \8 S: z8 l/ q9 G! U! V! V
" M6 v: {4 a: s# Z$ w
上述错误,在调试时发现, 只有在极少情况才会造成运行的错误,极难发现。 7 X7 b# z- U6 s1 l
需核查其它版本相应代码.) }4 ^/ R8 e- l# n
====== 2018/03/14 增加 ================================
' }5 l, E5 o+ J: y' g
3 k9 @! l& e$ `& w' B平时顺序执行没问题, 8 v  ]& _' u# K3 E- r1 t* z
假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !" Z! `1 ]- Y1 z  X1 P" `. T, C8 r
要这么巧啊,所以故障很难在调试时出现  !!!0 X% g. Z7 l* z3 T  `
在现场出现问题, 但调试时重现不了啊  !!!( Q; Z9 Y* A# L- v& ?1 J
% P0 |2 w, `, v6 e% W( C$ J' f
这个错误存在于 多个版本中。 -
" L" h2 W: Y$ s7 ?8 T9 t-
* K. m0 T) S# j=========2018/0316  增加:  分析  ======================================
$ _9 S8 a$ R7 I) K以下是   stm32f1xx_hal_can.c 摘录: 橙黄色字是我的加注-9 T+ Z0 X7 E: t) h% B8 w
-
* E* M& `2 F7 ~287:    /* Request leave initialisation */* S5 E) _# ~6 f8 b
288:     CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);    /*  从参考手册摘录: The software clears this bit to switch the hardware into normal mode. . Once 11 consecutive: q+ m2 |$ p7 N& C
recessive bits have been monitored on the Rx signal the CAN hardware is synchronized and8 W3 Z) g- E0 H
ready for transmission and reception. Hardware signals this event by clearing the INAK bit in% v" r( K# r- z9 J, e" i
the CAN_MSR register. */1 G- Q% W/ [2 h) G. e# Z5 F6 m% \
7 y! n; Q# Y; z0 L, Q
290:     /* Get timeout */, f; g- h5 o; ^% o
291:     tickstart = HAL_GetTick();   
% P* K' N9 \/ g# `. p/ n' f
. D# U4 ~  L6 q7 {- b# f+ j293:     /* Wait the acknowledge */                      /*  按参考手册, 如果动作完成, 就清除   CAN_MSR 的 CAN_MSR_INAK */
0 b8 a) {3 t6 P  @, b' ?294:     while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK)) /*  而这里是等待CAN_MSR_INAK 变高,是错误的  */
6 a& k. ^% E, m295:     {
4 ~: a6 S: d, ]# j( \: X+ Q296:       if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
" S9 w9 {7 Z9 x297:       {$ H( U8 g( S, Z' R- P5 ~* ?
298:         hcan->State= HAL_CAN_STATE_TIMEOUT;
; w' L  B1 C0 |  q2 H3 [
9 ?' e. |, o# [. l9 F1 z# @2 Z300:         /* Process unlocked */
/ t0 [3 a& i  l+ J; T+ f301:         __HAL_UNLOCK(hcan);2 i3 i( e& g6 v, \% N1 P
+ y; I( W- W; W/ ~% u1 Q
303:         return HAL_TIMEOUT;
- v& k) U- j- Y  d( f8 H304:      }
6 l( V; B- ^: \9 K% w' Z" [  k305:    }+ ?" i4 e  I$ P0 F3 A

! r# v" R7 V: g# V6 {6 X$ u2 }/* 该错误引发的后果及表现,自行分析 */: c2 }" U2 S' l+ @! i0 c1 i
4 @' n4 @- o; h5 r- O

1 p, n8 h* l& n7 ?6 O! u) v" `% t( }. T
1 ^1 E) _! N6 ]* w, d& F8 t

1 x2 K( l: X" x3 n& K# r& t' ?* ?
8 n7 C2 U# P% h' y4 L7 F% Q$ O

评分

参与人数 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 编辑 : R  s: s1 I" m4 M; F5 Q" l) f
MrJiu 发表于 2018-3-14 16:567 \7 Z+ I2 B9 L, b7 K7 e  N8 L
支持一个!!!!期待验证的人
$ n# z0 H4 B5 P$ Y( O

% v) U8 T4 J5 E# W" k% k* s平时顺序执行没问题,
6 P; H4 h9 w9 ~" z5 X  b假若 在这个代码之前被打断, 比如响应中断, 就可能玩完 !! !
' B; ^. y7 _5 {+ D; p9 h要这么巧啊,所以故障很难在调试时出现  !!!: O4 T) q* b5 w
在现场出现问题, 但调试时重现不了啊  !!!, E0 k3 _- n5 ?" g
/ |, Y! I6 r* w, {2 ?2 m
这个错误存在于 多个版本中。   ?5 L1 K! x8 s' j* e3 H" d

# Q3 m2 `( r# C: A
9 _4 W5 g, D" F4 v7 V$ J- u/ p
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:331 a( V0 _$ s. A6 v
最好是贴图说明,直观一些,版本不同代码的行数也不同,支持楼主多多发现问题 ...

4 T% R1 H$ {& I* Q' ]) V5 I2 \% O这个已经很直接了,甚至告诉了多少行了。。。具体地址都说了。。。剩下的就是怎么去验证了。。。不过楼主这么说了,应该是有可靠的保证了。。。
zero99 回答时间:2018-3-19 09:54:59
感谢分享,已汇总到3月原创$ x- Z0 ^  D3 v% w- {- a
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()吧.
6 w' ?, }; a1 g, I5 b1.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 手机版