请选择 进入手机版 | 继续访问电脑版
搜索
查看: 2917|回复: 3

[原创] STM32F1 Cube库的2个bug

[复制链接]

该用户从未签到

4

主题

60

帖子

30

蝴蝶豆

高级会员

最后登录
2021-2-25
发表于 2017-10-19 17:24:38 | 显示全部楼层 |阅读模式

写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查
下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因
最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视
===========================================================================================

这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题
旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题

STM32Cube_FW_F1_V1.6.0

  ******************************************************************************
  * @file    stm32f1xx_hal_can.h
  * @author  MCD Application Team
  * @version V1.1.1
  * @date    12-May-2017
  * @brief   Header file of CAN HAL module.
  ******************************************************************************




#define CAN_FLAG_TXOK0             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION))  /*!< Transmission OK MailBox0 flag */
#define CAN_FLAG_TXOK1             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION))  /*!< Transmission OK MailBox1 flag */

第379行
#define CAN_FLAG_TXOK2             ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION))  /*!< Transmission OK MailBox2 flag */



明显应该是 CAN_TSR_TXOK2_BIT_POSITION

+旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  /* Check End of transmission flag */
  if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
  {
    if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||
       (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2)))
    {
      /* Call transmit function */
      CAN_Transmit_IT(hcan);
    }
  }

+新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++



if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
  {
    /* Check Transmit request completion status */
    tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
    tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);
    tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);
    if(tmp1 || tmp2 || tmp3)  
    {
      tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);
      tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);
      tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);
      /* Check Transmit success */
      if((tmp1) || (tmp2) || (tmp3))
      {
        /* Call transmit function */
        CAN_Transmit_IT(hcan);
      }
      else /* Transmit failure */
      {
        /* Set CAN error code to TXFAIL error */
        errorcode |= HAL_CAN_ERROR_TXFAIL;
      }

      /* Clear transmission status flags (RQCPx and TXOKx) */
      SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0  | CAN_TSR_RQCP1  | CAN_TSR_RQCP2 | \
                                   CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);
    }
  }

===========================================================================================

第二个问题关于AFIO的
表现为设置管脚映射时会失去与调试器的通讯
原因是AFIO中关于调试端口的设置是 只写的 不能读
而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回  然后就是调试器丢失通讯


解决办法是修改 stm32f1xx_hal_gpio_ex.h文件
将关于AFIO操作的宏定义全改了
改法如下,里面有好多处,都要改
改好的文件在后面 下载后把  STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc  里的替了就行了
只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题

错误的写法

/**
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
  * @retval None
  */
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)

/**
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)
  * @retval None
  */
#define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)


修正过的

/**
  * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
  * @note  ENABLE: Remap     (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)
  * @retval None
  */
#define __HAL_AFIO_REMAP_SPI1_ENABLE()  SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)

/**
  * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.
  * @note  DISABLE: No remap (NSS/PA4,  SCK/PA5, MISO/PA6, MOSI/PA7)
  * @retval None
  */
#define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)





stm32f1xx_hal_gpio_ex.rar (5.26 KB, 下载次数: 18)
回复

使用道具 举报

该用户从未签到

43

主题

296

帖子

38

蝴蝶豆

金牌会员

最后登录
2022-3-31
发表于 2017-10-20 02:03:31 | 显示全部楼层
支持一下,我也是感觉到ST没有对中国地区一个友好的BUG提交模式,其实是对自己很大的损失,自己产品线那么多,中国用户量大,很多问题能快速的帮助发现BUG。
回复 支持 反对

使用道具 举报

该用户从未签到

227

主题

828

帖子

32

蝴蝶豆

金牌会员

最后登录
2021-1-15
发表于 2017-12-5 21:52:23 | 显示全部楼层
不错不错,很好的,支持
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

11

帖子

1

蝴蝶豆

中级会员

最后登录
2020-11-14
发表于 2018-5-20 00:21:43 | 显示全部楼层
坑不少啊,谢谢指正
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 14:50 , Processed in 1.197281 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表