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

STM32F1 Cube库的2个bug

[复制链接]
cloudcn 发布时间:2017-10-19 17:24

# ?/ I) R& K) V4 g, N写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查2 F" \" P1 B0 h, z8 }% V! M  E6 }
下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因8 b, z+ w; M1 i/ ?* G
最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视
8 y) l% T- o, J& I: {( G===========================================================================================
8 e" f1 z; s  t! J$ g, i; `* X
: Z9 F2 q7 V1 X0 j8 e3 |这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题
0 B# t! q6 [4 A  s$ t5 b& Y旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题* G! D5 x# v5 c

! C9 Q1 c) O* Q. w; ySTM32Cube_FW_F1_V1.6.0
( H% f2 w& f. J! e! \) r  e5 v
! v/ J0 Y: j2 F9 K- a  ******************************************************************************
  j, k8 E2 O% Y  * @file    stm32f1xx_hal_can.h. h) t) d0 H4 D6 f# @, H6 j
  * @author  MCD Application Team
1 z& z4 j; @6 m: J4 C$ w  * @version V1.1.1
$ t  l* W/ U+ Q) C% ]  * @date    12-May-2017$ o  {, [1 z6 X7 U" S- G
  * @brief   Header file of CAN HAL module.
, f! F' C. `. g2 x0 q+ L  ******************************************************************************
; V1 |1 v$ J+ |( K* f1 i
+ c2 Z5 R7 c: ~6 [/ p0 e5 {  n4 s1 U6 Y

* h* L8 t* F# ~1 w# {( H2 p
% j" D0 A1 f4 r! ~. G1 W" v  X#define CAN_FLAG_TXOK0             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION))  /*!< Transmission OK MailBox0 flag */1 E* m/ P6 _+ y- ?, [1 Z: \
#define CAN_FLAG_TXOK1             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION))  /*!< Transmission OK MailBox1 flag */* A6 V! {3 A% t% q
) m" ]+ X, S3 x- ^9 s2 d
第379行; j8 P# k) H7 A- t' w7 L
#define CAN_FLAG_TXOK2             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION))  /*!< Transmission OK MailBox2 flag */- {* p2 w6 b' M* i! x9 d

7 P  j9 R$ ]7 Z# C2 K# z5 v" x
2 i. b$ T9 z, N2 |8 {# R

( f* J2 l3 T8 _' T. K+ X明显应该是 CAN_TSR_TXOK2_BIT_POSITION
0 i8 m& O8 L% u( @( ?7 R* k, N6 B% x4 k) ~( g9 g
+旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  j  p9 o  g, |- M: n
  /* Check End of transmission flag */& c3 ~3 z2 ~% U) {
  if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))% P- R) e$ E) ?' e
  {3 k4 k% v' n6 d( q4 e  {* G
    if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||
# T3 b+ @4 X2 y9 K9 C% R       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||( O. Y1 U" {4 ]" i4 q3 b
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2)))
% e( r' A9 ?7 u9 w) F& Y, k8 q    {
+ |3 b4 z+ s3 Y1 m  \* c      /* Call transmit function */
- [9 V& ]* [; p9 _2 g4 J. e; R9 W      CAN_Transmit_IT(hcan);, I* s, U2 L9 @  T6 Y8 ?
    }6 C" A+ h2 }4 }/ P
  }* W3 x* L0 U7 _/ R

) u  {( h5 B6 n# K* @2 Q8 ?+新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% R) K& e2 o: B5 V7 }1 Z; D' A
1 A6 d& V! |/ ?$ W" n- N# y" @, ^7 R  `' J$ c* Y, s

7 L; R$ b7 J$ Qif(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))1 _4 e0 `" t+ Z4 w& g# Q6 Z
  {
0 ^' c2 c5 y/ k    /* Check Transmit request completion status */4 b4 F) W( n) u- Q. m& f
    tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
  l" N" O; s/ E: a    tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);1 O, H; S( h& s0 C
    tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);4 V; V; d3 `! y' h- H9 D) Y6 Z
    if(tmp1 || tmp2 || tmp3)  
) N& ~! C0 S# @/ s; ?    {
# ]& w  Q: ~* h* j0 L* V8 |      tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);
) W; `: e! H) X2 H2 f: S. |& u5 V      tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);0 v6 M& E7 T# }' ?7 N8 c! ?" L' e
      tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);, ~' y3 j/ h: t0 s
      /* Check Transmit success */7 G) s" v$ X( o2 z
      if((tmp1) || (tmp2) || (tmp3))
- K+ r( ]7 Z, H7 u8 D      {
" h/ N4 v7 `4 v! `( L! D        /* Call transmit function */
9 m# `' v9 @% [        CAN_Transmit_IT(hcan);0 \" n( f$ w3 H: i
      }
" U& p6 T( l5 }8 ^% N      else /* Transmit failure */
; t: `; {- v- n, ]1 X$ E" ]      {, ?$ ^3 I! E8 P# I) j
        /* Set CAN error code to TXFAIL error */
# \4 y; A( @- I5 _        errorcode |= HAL_CAN_ERROR_TXFAIL;
, ^5 j0 E9 H4 p: k1 u; `; I      }; {. F7 Q" V2 E% g& d7 j

. F- b- n( b/ ^. f: G) P+ D0 x      /* Clear transmission status flags (RQCPx and TXOKx) */0 S' d! M# v2 s
      SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \) s$ x' d6 y) J* P: w3 Y& ]* F
                                   CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);; `6 m! [; s5 N  ~9 N9 i8 L+ f7 N( v
    }8 d, a( W2 t, r4 e
  }, \# Q6 Q3 H% @6 A' \1 I
' q% f: y0 @5 ^3 Z# x
===========================================================================================
0 K" X9 \' s4 |6 H& o' N" g* `4 B) z
第二个问题关于AFIO的
1 m4 Y3 T, d7 T表现为设置管脚映射时会失去与调试器的通讯  z+ _' [2 R: z4 W/ ?6 P7 p
原因是AFIO中关于调试端口的设置是 只写的 不能读7 O, O0 Q9 m/ ~7 Z% V' f1 S
而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回  然后就是调试器丢失通讯0 h7 g% ?$ L; n$ ~* q  [# @

7 G* f8 R- G! t* t8 }- y
) Y/ E% }; c/ l. O- P
解决办法是修改 stm32f1xx_hal_gpio_ex.h文件/ V  e4 `3 M) T- `
将关于AFIO操作的宏定义全改了1 u9 U6 o' j" M) c. {8 g
改法如下,里面有好多处,都要改
8 X/ Y8 Z8 B/ j* [  L# ^3 M改好的文件在后面 下载后把  STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc  里的替了就行了, g8 Z4 B. |, `( i9 O! F% G
只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题
  I7 l3 O6 |0 S. j
3 `' f0 F" \8 z4 _! v" Q! }' t错误的写法
/ j5 M$ X1 K/ V% u# F
# O& c' q% }0 G/**' j: G3 e# G% t! k, f
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
1 o7 f# N( Q- R- C) n  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
6 e0 L$ W, _$ P, O9 I  * @retval None: t4 e# f6 f2 W3 P0 D3 g$ Q
  */* g2 G" m1 ~1 |  O; G) a
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)
. z% V1 j4 I1 z- A( m
. x) ^0 ~! B9 `/ u; ~4 ?, ~$ m! F/**
9 q3 \; T1 h8 P: i% E! [  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
8 X1 V2 d( E* ^( c  a  Y, ^2 ~% m# W  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)! I6 a6 K) G+ L! \1 L* v
  * @retval None
3 F! K4 ]8 A# z* G  */
$ @% r, Z6 \! t#define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)& r# S' P8 ]6 x- z4 z5 R5 p

4 T) g8 J; w0 `/ L& K4 B8 I  L* g! z5 d5 G
修正过的
1 I7 z0 Q" o" }5 z) K% l+ W9 \" A
0 D! c1 A7 A5 E; \/**
4 c4 {% f+ ~( e7 A  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI./ [9 _9 c1 D5 d: u2 z; n
  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
1 Z' [$ ~# @/ {* z  y  * @retval None
8 G( |1 r) J) m  */. P  x" B; V* A, C( e
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)* _  X2 q' I2 g7 ?# k" Z
8 C# R* l$ t1 J! r: s
/**
0 h8 x4 u6 ]+ _& K" ~  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
) o) `  Z* M/ ^1 n# I: B  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)) V$ i! y& K( n. K
  * @retval None
: q# H4 @3 ^# j1 g! G# F, Y  \) L  */% Q; \( {8 r7 ^# R
#define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)
' R0 w. X' E. [0 ~
/ b" D/ O) n# S. `' ]
2 Q: V8 c) v3 p% `$ a7 u, y, F( H0 h4 t# b& ~/ \
+ Y6 G* h3 `% }
& }2 t; a0 R7 U/ W' X' B
stm32f1xx_hal_gpio_ex.rar (5.26 KB, 下载次数: 20)
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版