|
& F( g9 L. t1 O1 \( d 写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查6 _& X S! o9 o0 w9 Z% T 下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因' ] D# c2 s. V% z6 o 最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视 =========================================================================================== 7 |3 B) }4 p9 m5 ` 这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题 ![]() 旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题8 ^% I4 l: V9 y: l' @ STM32Cube_FW_F1_V1.6.0 ******************************************************************************+ _/ U5 k& w! Y- { l9 o1 a * @file stm32f1xx_hal_can.h6 T( a' Z" v7 @! O K0 s6 M * @author MCD Application Team * @version V1.1.1: N1 D" m( O$ C9 Q * @date 12-May-2017) M- Z& H4 F# e2 e: Z9 u& k * @brief Header file of CAN HAL module.: H1 k6 r+ U; G3 H9 T ****************************************************************************** 7 |2 _/ K5 G+ ^, { x) ?8 C# a& {$ ^ ' ~1 }% R. V4 Q$ @% E3 s: C #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 */) l: l1 S H o% a; R- P) ?0 @ V2 S- K/ h, `6 k% v 第379行 #define CAN_FLAG_TXOK2 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION)) /*!< Transmission OK MailBox2 flag */# i. c. r7 j6 ?5 P0 s" t0 S. N / ^$ Z! {9 z+ t( X/ O; }0 z 明显应该是 CAN_TSR_TXOK2_BIT_POSITION +旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- Q- d6 Z. `* ^# A) l9 @ /* Check End of transmission flag */ if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME)) c/ O3 f: {6 q8 ` { if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||" Q5 I3 ^ s3 l) @% i, ? (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) || (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2))); S' k2 G0 ]; z* K2 S( S. i { /* Call transmit function */1 G/ P/ m4 Z/ v' L CAN_Transmit_IT(hcan); }+ m& L4 v1 ~( F% W* q9 \+ w }' m- I, \" \" q' b& S- m: O $ N! A- Z, T5 z* }5 X' ~" B. t +新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++ " _9 K3 C0 z2 z, B 7 A$ W% o; Q- O- g7 V) z if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))# Z9 H( ^+ O! t2 v% v' \ {0 {8 p' [/ k6 w- y) _6 U- b /* Check Transmit request completion status */ tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0); tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);) O: m, ]( e$ q# d( d tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2); if(tmp1 || tmp2 || tmp3) 7 p8 L" W( D! ^" D ]- p { tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);) a1 ?& F$ |( u$ \' X; T m tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);. X, ]) b8 h G. A4 q tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2); /* Check Transmit success */ if((tmp1) || (tmp2) || (tmp3))# E' R7 r+ m z' h% [ {" S4 R3 D2 g9 P9 b /* Call transmit function */ CAN_Transmit_IT(hcan);8 ^9 E0 v7 ^- W- ?" [8 ^ } else /* Transmit failure */. p2 Y5 f7 @: [4 g3 g {' i( N1 y8 T" T" n% F& ?# y /* Set CAN error code to TXFAIL error */ errorcode |= HAL_CAN_ERROR_TXFAIL;2 s* d% h5 n: y4 v2 x" B } " R" n& `9 m9 l O( Z& A /* Clear transmission status flags (RQCPx and TXOKx) */5 S) |9 \) k0 N% B% q, N$ H SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \: `! J5 O' ~2 j$ H6 q3 [; S- j CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2); } }) b5 \. Q+ W2 a 8 v5 A$ q7 j& j =========================================================================================== 第二个问题关于AFIO的 表现为设置管脚映射时会失去与调试器的通讯 原因是AFIO中关于调试端口的设置是 只写的 不能读5 t# w( P; S/ X 而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回 然后就是调试器丢失通讯 4 p+ c7 S" I" Q6 e & a: e: @$ ~) h 解决办法是修改 stm32f1xx_hal_gpio_ex.h文件8 i9 Y4 }* K$ W; p9 R 将关于AFIO操作的宏定义全改了 改法如下,里面有好多处,都要改 改好的文件在后面 下载后把 STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的替了就行了. V7 O5 y* K; |( \5 c 只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题 ; G0 I7 w o" g 错误的写法' h0 { a; T0 K8 X2 C0 h# }. K 7 c% F( Z" k: q /** * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.7 G7 ]$ G7 Q$ q * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)/ U6 M! y! H$ L: S * @retval None* w I/ G: u4 }& i */7 T f. y" ]' D1 Q #define __HAL_AFIO_REMAP_SPI1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)2 q2 n K- J* ~. W- e* u4 v6 I/ H 8 Q9 A ~4 z v$ i5 W /**9 I1 ]- |0 c7 H* F5 T" B2 X5 ? * @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); K% T3 y; G; [! h z: X * @retval None */0 `2 Y3 G2 X, q #define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)% G# b. P( E" v + O0 j: [" o* Z5 t 修正过的9 w% E$ E/ ^7 G$ h( V( M 4 w( G5 W! E- A. p9 L: y$ _ /**) F6 Z* g; {8 U * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5)* x' M9 D$ a6 _ * @retval None *// M3 K0 f$ P- c9 C; v5 [ #define __HAL_AFIO_REMAP_SPI1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)* j2 e* v: y! `5 e& \" B- N 8 e7 w8 U2 Q6 J+ P /*** A6 g* H1 d4 W, p- e * @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)$ i. x- P, d& a% g * @retval None */* f4 Y/ |# f: V2 x #define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG)! g# l$ @2 U e- M7 X; I( e) r & i* Z- e9 F0 f1 L: k ' m% X. I0 K$ m2 n& c( b4 `7 P+ ` 3 Z# N7 A7 n6 O" o ; v0 Q J, x( W3 I0 o3 m6 a
stm32f1xx_hal_gpio_ex.rar
(5.26 KB, 下载次数: 21)
|
| 支持一下,我也是感觉到ST没有对中国地区一个友好的BUG提交模式,其实是对自己很大的损失,自己产品线那么多,中国用户量大,很多问题能快速的帮助发现BUG。 |
| 不错不错,很好的,支持 |
| 坑不少啊,谢谢指正 |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版