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

STM32F1 Cube库的2个bug

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

8 |- l8 H. t8 h  d2 e2 e写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查( W. a. S$ \) O. p
下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因
8 N% `2 s2 k- e' I4 u3 l! m( U% v最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视1 P: d* V' Z3 T3 G
===========================================================================================- o4 V$ R; R" i: N" @
9 m8 c) [, ~  \& X
这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题
' l$ s' V8 E6 k* U5 X旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题- q" j7 D! P# Q* F

- B5 I' h% l, O+ B2 p5 [& YSTM32Cube_FW_F1_V1.6.0
2 O, P3 ?0 ~8 N! b- r3 s7 c* v9 K) p- Q
  ******************************************************************************
6 O+ [1 y5 R9 z  * @file    stm32f1xx_hal_can.h- i; i' r; o$ C
  * @author  MCD Application Team2 }7 Z3 ?' i5 D' h6 _6 m+ U0 ]6 u
  * @version V1.1.14 [" _) H- w3 i/ O
  * @date    12-May-2017
4 n3 M. W1 P/ r9 J6 v  * @brief   Header file of CAN HAL module.
0 I9 V6 m  {2 }2 p% e  ******************************************************************************% P7 x! }& m, X. c& p, M" s

7 o% ]7 O% S4 T; P5 `
8 {# Y, t* L' }( B( Y' Y3 O# }' s! L7 y. M5 I0 \

2 J. _1 J& O) G3 Y$ J& \#define CAN_FLAG_TXOK0             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION))  /*!< Transmission OK MailBox0 flag */9 p, U1 Y5 \1 u- }
#define CAN_FLAG_TXOK1             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION))  /*!< Transmission OK MailBox1 flag */
/ o" |& X/ \) ^0 l% \" D" K) k
, [6 W# h7 T$ d' O/ `第379行
  }, t! g, ^! F! ^+ m7 }#define CAN_FLAG_TXOK2             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION))  /*!< Transmission OK MailBox2 flag */
- `$ D$ `0 @* a! T) v# I
6 g/ C8 _5 D% l' T% j! L" ?8 Y" O, B2 W! l- z/ t: A! e
0 j6 S. b6 H4 Z% a& b5 V
明显应该是 CAN_TSR_TXOK2_BIT_POSITION
6 W" d* d" E9 v% m
* E. `$ X! q# r2 a1 I( K( N+旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; R& i2 T" m5 M; ?. w6 u
  /* Check End of transmission flag */
; f& b( z- r$ i& O  if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))( Y' n- w5 [+ y! T, z( o
  {
  j- p2 ]7 N8 Z6 A    if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||( F  D' {1 K$ H6 `: r% j
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||
; ^& b& Y- ^, w  h) q; P0 J       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2)))
, c+ q) }5 J# e# `1 V  \    {* q; z: ?0 t3 i: L- s# u
      /* Call transmit function */6 R+ k3 d( i( F- N7 H3 d
      CAN_Transmit_IT(hcan);
& K, u! b7 P; |2 r* ^    }  e5 E$ o1 b8 q9 Z+ M
  }6 U5 M. T9 O4 w- @0 z1 G, t2 ]- C

; w0 B" D- W- {+新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++( G; R& g1 @6 j7 l. s9 u- F

: ?# n# P; ^# x
, K; j3 c1 J1 k7 A# ?# f# s; R

2 m% R$ j+ J4 Fif(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
) q2 q$ J" ~6 }( I4 X( H5 [3 t. z  {7 J# b* Q1 }6 z/ W4 s2 l' Y5 i
    /* Check Transmit request completion status */
, ^% _% K+ t1 _& k7 Q    tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
# u8 g! m( ^) D1 `' ?" @3 \/ e    tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);& g. u+ |' |: e, B5 J2 W# r
    tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);- V: L5 N' n0 l+ @* R6 M) F0 k* \
    if(tmp1 || tmp2 || tmp3)  ! \* H  E" {% T1 h; h. u0 U
    {0 }/ Q, |8 q7 Y) [; w
      tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);
$ V( Q( Q( [& i9 v; }& m      tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);* @( ^: J% U& t4 O5 W* P& E7 e! K
      tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);! H; C- n* I9 A. Y6 Y9 n. X
      /* Check Transmit success */  X: [2 \" {/ Q5 y* k+ L( P
      if((tmp1) || (tmp2) || (tmp3)), B4 \7 V' C' `$ D. x
      {
, D6 K  m) a( z- q. ^        /* Call transmit function */4 m* Y7 X8 z* _8 L# A+ \' h
        CAN_Transmit_IT(hcan);
+ H# A. E8 l, l+ W      }
# y* w/ q: s2 Z3 G& @6 {      else /* Transmit failure */3 y+ ?+ k* M" d6 X
      {. @: P4 X' [/ J; v
        /* Set CAN error code to TXFAIL error */: {3 l4 v7 p# x$ P
        errorcode |= HAL_CAN_ERROR_TXFAIL;/ |+ b' |2 \5 V
      }
# {7 h  P3 E# @. T
5 l+ ~" d. G* E: u/ l4 y      /* Clear transmission status flags (RQCPx and TXOKx) */
# J$ ~: b0 H3 q, l' @      SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \+ i5 p5 |2 y9 ^- W/ E* v7 O* |2 }
                                   CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);; O; T& X1 t9 t( j" z
    }
6 [$ i! F4 T& A  S( n# Y  }
1 O* [$ M$ ?$ Q) w* V9 Y6 e2 U3 q! _0 Y  D9 g9 h: n. D! f' f
===========================================================================================
' I" n1 u9 Z, N* v, W7 N/ P9 K% v& _7 g1 y6 d. k
第二个问题关于AFIO的
. l1 s# Q1 Z3 O7 J1 ]表现为设置管脚映射时会失去与调试器的通讯, p5 E0 t- S' [6 O: z2 V
原因是AFIO中关于调试端口的设置是 只写的 不能读8 z1 q* v$ |$ }! B( A- i6 R
而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回  然后就是调试器丢失通讯
8 ^  J) Z1 p  h, J/ n' {6 D
3 W% |3 C9 j/ U. l4 G# T2 m
) i: G. s# P! N+ d7 Z( u
解决办法是修改 stm32f1xx_hal_gpio_ex.h文件4 Y$ J0 |& y0 P( j2 E, I
将关于AFIO操作的宏定义全改了
* ~) y5 j2 ?% V4 X改法如下,里面有好多处,都要改
" L0 P) D5 Y: K5 _  q' A改好的文件在后面 下载后把  STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc  里的替了就行了
  E/ I5 C* h: o: Z; y2 r只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题1 R- @( ]3 E' B) S- A; Z; u* b7 m
# z6 B2 y* }5 c& _) v; n
错误的写法
6 ?; @6 E3 r8 l/ ~2 |4 K: U1 L5 Y* T: a  Q( ?* N/ F
/**
/ q0 K; v' W$ z$ [! f9 k  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
$ \0 Q; `! {! e* c( @' C9 i9 g: d  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)0 t8 p/ ~1 F& Q5 @. y9 ]0 z6 c
  * @retval None
8 k  N5 {' Z$ ^  */
4 R3 ?! E- }. b" Z2 N7 c#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)& E, F; W( y0 U7 [; y/ E
3 r5 P; N4 h% v  W0 r4 s1 ]! U
/**) ~3 l. E" w- V$ u+ h
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
, `5 R6 z) m% `. U4 [  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)
5 X, [6 t4 {9 l; @/ a/ N: A  * @retval None1 u8 L) h; f& Z8 k
  */
8 v' F9 j! ?6 i! N#define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)
! f' l, ]: x) L5 Z& y+ n" P
% D4 B( X+ t; I# t6 f1 h% w( M* p4 \2 W
修正过的5 w2 |# S. R- d2 ~
0 n* n! Y/ G' a- u" f
/**9 \3 ]- o# H+ \' y
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
, W* |1 y1 q- W; a  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
* s7 W" U  w( N& |0 b  * @retval None
2 x& |& p; `. x( p  */
$ a1 ~3 f3 F/ X" V$ k#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)
5 j/ U% ~( O* {7 e$ J" d3 }6 s6 k2 {4 _  @5 K! V- _) f
/**
2 L+ h  x# q. E7 S8 b* _6 h  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
$ N7 L2 t5 S6 c# P  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)# {+ A/ N, m6 g+ ~4 J8 M8 ^
  * @retval None
: j) i, V# {/ R" q, W- b* y5 L  */; t/ R2 {1 [5 Y' ?
#define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)
( P0 L# |  F: F" j2 `6 s( ^
: B. X( @" A- h' Q
( x% g" T2 A) \" ^! \' \3 a$ @6 O  ], o0 {: G& K
" @+ Y8 M- @2 E
2 Z* d" k, p- S$ h7 t( O9 L% U
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 手机版