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

STM32F1 Cube库的2个bug

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

+ y- m; q6 g; R' y写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查2 o% d# s! B% W% U
下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因
% r0 S/ A+ J4 L2 {! F: b3 x- C最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视
! C! s3 x, M# e: M0 y% d: i===========================================================================================2 i3 y4 M. n" V8 ~; S

8 ^4 Q+ F1 u, i7 l) \$ z这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题+ y0 x) S7 l9 C, t+ J' Z9 x/ n
旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题
6 \0 F! J  E2 x# u
" u( w: |4 _! p/ mSTM32Cube_FW_F1_V1.6.0
$ u/ ?3 L, E- W. x, t  r' I: h7 N+ [5 _+ W& w, F2 S4 c  y
  ******************************************************************************
7 `  l1 w% }! _7 g, m+ |$ W  * @file    stm32f1xx_hal_can.h9 C$ R9 n3 a6 x& j2 k. G' D- }) k# ~
  * @author  MCD Application Team4 q/ I; G( @) C! M
  * @version V1.1.1% }' k, h+ e  |' M$ |3 C
  * @date    12-May-2017* B; r0 [4 p, |5 R; F# K
  * @brief   Header file of CAN HAL module.; R  b6 }% M. ^% Q3 d; y
  ******************************************************************************" R8 ]8 d4 V3 p$ v
: o4 f  r% U8 I7 _- g# u

  g! a$ y+ R2 W& h
  J, j$ Z1 H# ~6 W+ W6 s' f, T% ?  e2 Y! }' v: [& g1 m
#define CAN_FLAG_TXOK0             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION))  /*!< Transmission OK MailBox0 flag */
" `, \% a) @2 m$ d7 k#define CAN_FLAG_TXOK1             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION))  /*!< Transmission OK MailBox1 flag */
4 s4 E7 A$ o7 Q0 d8 Q% u- n0 K* n1 |
第379行
7 O, v5 |* S5 f  {% T0 L#define CAN_FLAG_TXOK2             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION))  /*!< Transmission OK MailBox2 flag */2 R8 W% F( b6 O. n- A1 B$ f
+ c6 ]" J5 [+ V: _- e4 i

/ ?3 U$ d% g8 a: M' Q# \  u
& U4 N0 l) p' B
明显应该是 CAN_TSR_TXOK2_BIT_POSITION
$ T( h8 j) H, Z. A" \: R3 t4 H- v# h1 r1 m% u) t6 p
+旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& ]. {! j/ {! A6 L& R' s
  /* Check End of transmission flag */' R8 B" z' T+ ?
  if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))% g! k( {- p) C7 o- M+ W0 x# q1 C
  {
/ e! m# O( C& Y) X9 B& \    if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||3 I9 u1 p6 _% A' }: s  p' T8 r  q2 l
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||6 r( c+ n/ ~5 k
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2)))
- c$ }; w# i' c8 f# i9 @    {7 [0 ~2 m* P4 J
      /* Call transmit function */
3 I3 d7 ]! m  `; g# A: w* U      CAN_Transmit_IT(hcan);6 x8 K/ w* e5 H6 P3 H" L
    }
0 P/ H" K: n! t; l7 L! o  F  }$ i! {& k& p" {2 d$ U/ r
) Z& s" G2 Y5 h& B  ?, m5 a
+新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 b6 A' f0 C" L3 ?$ Z0 Y1 m
0 [  m% s6 q6 \1 b" S, x; @' V  r! C! c2 K  {) N
4 ?- [) N! F; y7 r$ \$ ~% g: ]
if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))& {: F# F0 m! t! F
  {! l2 u) M" ]: m. G5 t8 Q
    /* Check Transmit request completion status */
/ k! Z* h6 g8 B" m    tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);9 k  E0 n: a' `3 k6 \. r
    tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);
$ U+ b* M% d1 V$ j    tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);# ]# T7 C$ Q8 g3 ^( P0 ^
    if(tmp1 || tmp2 || tmp3)  
: N" d1 L) k4 u    {
# v  i# _3 Y3 k      tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);3 y3 x; i" R1 v- C
      tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);
2 d, @: F& U- j) T      tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);3 }2 ^2 I5 _2 c, H, O
      /* Check Transmit success */
: d/ h2 G: l' x/ `& J7 R, `* F      if((tmp1) || (tmp2) || (tmp3))
* ~( Q" u+ T- r+ D      {# ^: v1 @6 [! c- X+ E/ X, e
        /* Call transmit function */" o8 b5 Y5 P! l7 H
        CAN_Transmit_IT(hcan);. f+ Z6 m7 Q, B. x+ U- _
      }4 d' z2 w( E. t, a* O1 P) ?
      else /* Transmit failure */0 _" e, |# l2 W+ V, m' }
      {7 ]# K& z( e! U# r( n
        /* Set CAN error code to TXFAIL error */
- H, r1 [, c2 d        errorcode |= HAL_CAN_ERROR_TXFAIL;9 o0 w7 E' ]7 s! b
      }" q, J# `! P; ~! ]3 A

9 z8 T5 _! b! [0 w      /* Clear transmission status flags (RQCPx and TXOKx) */
: f! ^( n: O3 A" N+ X      SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \" B3 @$ C2 n, j% |5 e' r" x
                                   CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);/ z' J8 C! X- ~/ \5 M7 \% q
    }; M; |6 Q1 x) L, k6 W3 l
  }- U$ {- ?- h* s' n* [
7 s" w. u6 T% V9 v5 ^1 Z
===========================================================================================
8 E3 ]! D. I+ |6 M; E. Q" b' S& n6 `+ E( |: E
第二个问题关于AFIO的
% J; H# o; j, O) P$ n9 S表现为设置管脚映射时会失去与调试器的通讯
2 j; q& h& P% s/ p原因是AFIO中关于调试端口的设置是 只写的 不能读& z# n: ~5 `, a/ F# S; Y
而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回  然后就是调试器丢失通讯
7 i7 W- f$ x' F+ F1 Y, a
( k* k' T- K1 Q0 D# `9 `
4 y* y) p9 C: g1 \; a
解决办法是修改 stm32f1xx_hal_gpio_ex.h文件
+ |0 a9 s/ @: f( ^& Q将关于AFIO操作的宏定义全改了/ t; A. ~+ @  S: o" N
改法如下,里面有好多处,都要改
1 u! I/ v; Q6 Y/ l/ a9 w改好的文件在后面 下载后把  STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc  里的替了就行了
) J6 l4 n! p6 S7 K6 h( c. P只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题2 L) q, L' o2 q
  u; u& [3 ]6 L! J" P. e
错误的写法7 U: d  u( F. w1 B2 ]  r+ }/ g+ `7 L
) B. U1 U4 m! O
/**1 T0 L( B- w' ?2 t) \
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.+ k3 M- D7 L; i# E
  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
9 I/ z) q: Y) L, x  * @retval None
7 D! D1 z1 s5 W) n0 R1 }  */
' M5 v( j! t( b( B#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)
8 t6 ?' \7 T3 G/ Q; E4 N7 o6 _) e+ W3 @8 V9 z! }
/**5 N* p5 M$ L% {8 X  k7 {1 N1 K
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI." o9 P  ^$ ?0 J0 Y7 D0 j; P7 E
  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)( d; s  h  e8 H( ^
  * @retval None- `, K) j  t# P% I3 L
  */: Z" k) W" f4 s) `0 n3 J
#define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)
" c) o/ J: i+ S. C8 E: x5 @3 _1 E
- n( A% ^! \9 m3 v# W5 ^1 f$ Y8 o% ~
修正过的
" p$ R# T2 v4 @8 b5 w1 E% X# X% w1 r$ N
/**  W8 U, C& a1 n- R
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
9 _8 n/ f0 `1 g: x  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5); o2 m6 z, U9 j, Z# r& b# ^- G
  * @retval None: N3 C& O+ X8 J2 x, x  H3 k2 }
  */: d" O% }/ k' }; Y
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)7 Z3 T4 E* }& G# Q+ H
( _) g6 T- A+ V2 w( D- _: {1 K6 C
/**
  p; B' ]# i5 u# h1 k* S% [  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
3 o8 S0 s' f  v/ o, n. @  V) F  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)
3 d9 ?+ O: O. a  * @retval None
; w! b' t- z* O, I0 v7 f4 J  */
, j& _5 P3 x8 j3 `: w0 u  ?#define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)
8 D0 d+ f4 Z/ b% L: t$ E; ~
0 G0 x/ J: m( @! r: t2 w9 [# P( q1 a$ B& Z* `' {. T, ]

4 s# z: \2 p: h; [; d  O
' J# P7 D+ x, D0 d( j) t
+ X, U' j' A0 R 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 手机版