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

STM32F1 Cube库的2个bug

[复制链接]
cloudcn 发布时间:2017-10-19 17:24
& F( g9 L. t1 O1 \( d
写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查6 _& X  S! o9 o0 w9 Z% T
下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因' ]  D# c2 s. V% z6 o
最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视
* F& a5 O2 c2 z& d. \===========================================================================================
, {! M. |- {" ~7 z. J# i7 |3 B) }4 p9 m5 `
这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题
' g: b0 ^) y0 X  A: `) U- z5 C旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题8 ^% I4 l: V9 y: l' @

, G) U1 y. z: l4 A: @STM32Cube_FW_F1_V1.6.0
% E9 s& I5 N: Q8 h. [8 Z
! T% v8 [' s+ L0 L% r' B$ w3 [+ U& z  ******************************************************************************+ _/ U5 k& w! Y- {  l9 o1 a
  * @file    stm32f1xx_hal_can.h6 T( a' Z" v7 @! O  K0 s6 M
  * @author  MCD Application Team
+ h: k; j5 |, P8 p; I/ O; c$ v6 h3 a  * @version V1.1.1: N1 D" m( O$ C9 Q
  * @date    12-May-2017) M- Z& H4 F# e2 e: Z9 u& k
  * @brief   Header file of CAN HAL module.: H1 k6 r+ U; G3 H9 T
  ******************************************************************************
2 }# Z4 x# K! w. D# A/ t
+ C3 O" _7 s7 a0 B& e; J( @$ q' u7 |2 _/ K5 G+ ^, {  x) ?8 C# a& {$ ^
' ~1 }% R. V4 Q$ @% E3 s: C

& z" X" C! m. E+ f9 h#define CAN_FLAG_TXOK0             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION))  /*!< Transmission OK MailBox0 flag */
0 f6 @% \  E/ N. @7 k9 b2 U! U#define CAN_FLAG_TXOK1             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION))  /*!< Transmission OK MailBox1 flag */) l: l1 S  H  o% a; R- P) ?0 @
  V2 S- K/ h, `6 k% v
第379行
6 f- X- p0 j. z! q7 }5 x" ?  A4 D# }#define CAN_FLAG_TXOK2             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION))  /*!< Transmission OK MailBox2 flag */# i. c. r7 j6 ?5 P0 s" t0 S. N

+ V/ O* l' K' p' k; @) b+ G
7 F) \3 e' `8 b8 ?" u
/ ^$ Z! {9 z+ t( X/ O; }0 z
明显应该是 CAN_TSR_TXOK2_BIT_POSITION
2 m3 p7 v$ m( G; a7 P2 I+ L. t
" f" k$ g8 M. W  Y5 u& \+旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- Q- d6 Z. `* ^# A) l9 @
  /* Check End of transmission flag */
5 [4 K/ J: O6 X4 _: l- b  if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))  c/ O3 f: {6 q8 `
  {
( j  ?( ^1 \, K+ n8 R( P+ ]    if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||" Q5 I3 ^  s3 l) @% i, ?
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||
6 l" r# w2 p0 E" v$ d       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2))); S' k2 G0 ]; z* K2 S( S. i
    {
8 ~$ t8 o5 Q4 q5 S" F8 v6 ^      /* Call transmit function */1 G/ P/ m4 Z/ v' L
      CAN_Transmit_IT(hcan);
4 u* x9 v: @/ J7 C9 S4 Q: e    }+ m& L4 v1 ~( F% W* q9 \+ w
  }' m- I, \" \" q' b& S- m: O
$ N! A- Z, T5 z* }5 X' ~" B. t
+新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++
) G* C( X$ L- K9 D# h2 r" _9 K3 C0 z2 z, B

& _& \* e9 W3 z% K
7 A$ W% o; Q- O- g7 V) z
if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))# Z9 H( ^+ O! t2 v% v' \
  {0 {8 p' [/ k6 w- y) _6 U- b
    /* Check Transmit request completion status */
- k8 \3 P. z& \9 u" C! q    tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
7 Z3 r/ t& u3 w1 J, ?+ H4 \    tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);) O: m, ]( e$ q# d( d
    tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);
# p; s- S6 J& b: _, m$ s, A8 L9 F    if(tmp1 || tmp2 || tmp3)  7 p8 L" W( D! ^" D  ]- p
    {
& p/ H  d  b5 U, O1 ]# T      tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);) a1 ?& F$ |( u$ \' X; T  m
      tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);. X, ]) b8 h  G. A4 q
      tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);
7 |) Z. y7 @" d1 w* ~      /* Check Transmit success */
% i1 [4 q& Q1 `/ h) x/ E, L& p% X      if((tmp1) || (tmp2) || (tmp3))# E' R7 r+ m  z' h% [
      {" S4 R3 D2 g9 P9 b
        /* Call transmit function */
. _6 ?0 ~: G7 {9 a        CAN_Transmit_IT(hcan);8 ^9 E0 v7 ^- W- ?" [8 ^
      }
$ A4 P# `8 z' S: x      else /* Transmit failure */. p2 Y5 f7 @: [4 g3 g
      {' i( N1 y8 T" T" n% F& ?# y
        /* Set CAN error code to TXFAIL error */
& P( u) P6 ?3 t+ j        errorcode |= HAL_CAN_ERROR_TXFAIL;2 s* d% h5 n: y4 v2 x" B
      }
5 S" |) P4 }, [% k7 ^" R" n& `9 m9 l  O( Z& A
      /* Clear transmission status flags (RQCPx and TXOKx) */5 S) |9 \) k0 N% B% q, N$ H
      SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \: `! J5 O' ~2 j$ H6 q3 [; S- j
                                   CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);
" E, P+ G, p* w& L6 t    }
9 B9 Q/ N+ h! H$ h8 [( M  V  }) b5 \. Q+ W2 a
8 v5 A$ q7 j& j
===========================================================================================
9 Z4 e- `* d' P. |5 u* Y( l4 B
0 g4 u, f# U+ r第二个问题关于AFIO的
% a3 L1 p# M7 p0 N* y) e3 B表现为设置管脚映射时会失去与调试器的通讯
) j1 Y4 f# v( W3 a8 A原因是AFIO中关于调试端口的设置是 只写的 不能读5 t# w( P; S/ X
而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回  然后就是调试器丢失通讯
2 F3 d3 U6 l% W4 c9 Q! S' s' y4 p+ c7 S" I" Q6 e
& a: e: @$ ~) h
解决办法是修改 stm32f1xx_hal_gpio_ex.h文件8 i9 Y4 }* K$ W; p9 R
将关于AFIO操作的宏定义全改了
3 z# S$ u1 y$ h改法如下,里面有好多处,都要改
/ |' c# |+ p' G; \% w' s改好的文件在后面 下载后把  STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc  里的替了就行了. V7 O5 y* K; |( \5 c
只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题
; [' `5 B( r4 B4 L; G0 I7 w  o" g
错误的写法' h0 {  a; T0 K8 X2 C0 h# }. K
7 c% F( Z" k: q
/**
6 }  O4 A) M5 W+ R4 f' G3 T5 E  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.7 G7 ]$ G7 Q$ q
  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)/ U6 M! y! H$ L: S
  * @retval None* w  I/ G: u4 }& i
  */7 T  f. y" ]' D1 Q
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)2 q2 n  K- J* ~. W- e* u4 v6 I/ H
8 Q9 A  ~4 z  v$ i5 W
/**9 I1 ]- |0 c7 H* F5 T" B2 X5 ?
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
; x7 ^; w) ~' H  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7); K% T3 y; G; [! h  z: X
  * @retval None
4 z; L, a) N( Y. o  */0 `2 Y3 G2 X, q
#define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)% G# b. P( E" v

( j$ e- i7 ~/ A+ O0 j: [" o* Z5 t
修正过的9 w% E$ E/ ^7 G$ h( V( M
4 w( G5 W! E- A. p9 L: y$ _
/**) F6 Z* g; {8 U
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
0 |9 X+ W& C/ ~: B  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)* x' M9 D$ a6 _
  * @retval None
8 h+ Q$ g, c) [& P( u$ P( M/ F  *// M3 K0 f$ P- c9 C; v5 [
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)* j2 e* v: y! `5 e& \" B- N
8 e7 w8 U2 Q6 J+ P
/*** A6 g* H1 d4 W, p- e
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
2 Z( H9 J% X) w  k8 w  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)$ i. x- P, d& a% g
  * @retval None
) W1 _1 D7 R; c! A  */* f4 Y/ |# f: V2 x
#define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)! g# l$ @2 U  e- M7 X; I( e) r
& i* Z- e9 F0 f1 L: k
' m% X. I0 K$ m2 n& c( b4 `7 P+ `
3 Z# N7 A7 n6 O" o
; v0 Q  J, x( W3 I0 o3 m6 a

: F/ _8 Y0 J6 L2 W# Z stm32f1xx_hal_gpio_ex.rar (5.26 KB, 下载次数: 21)
赞 收藏 1 评论3 发布时间:2017-10-19 17:24

举报

3个回答
kylongmu 回答时间:2017-10-20 02:03:31
支持一下,我也是感觉到ST没有对中国地区一个友好的BUG提交模式,其实是对自己很大的损失,自己产品线那么多,中国用户量大,很多问题能快速的帮助发现BUG。
hpdell 回答时间:2017-12-5 21:52:23
不错不错,很好的,支持
米开朗基罗 回答时间:2018-5-20 00:21:43
坑不少啊,谢谢指正

所属标签

相似技术帖

官网相关资源

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