在线时间29 小时
UID3251847
ST金币802
蝴蝶豆30
注册时间2016-3-15
该用户从未签到
高级会员
- 最后登录
- 2021-2-25
|
写在前面 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)
|
|