写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查2 F" \" P1 B0 h, z8 }% V! M E6 } 下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因8 b, z+ w; M1 i/ ?* G 最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视 =========================================================================================== 这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题 旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题* G! D5 x# v5 c STM32Cube_FW_F1_V1.6.0 ****************************************************************************** * @file stm32f1xx_hal_can.h. h) t) d0 H4 D6 f# @, H6 j * @author MCD Application Team * @version V1.1.1 * @date 12-May-2017$ o {, [1 z6 X7 U" S- G * @brief Header file of CAN HAL module. ****************************************************************************** / p0 e5 { n4 s1 U6 Y #define CAN_FLAG_TXOK0 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION)) /*!< Transmission OK MailBox0 flag */1 E* m/ P6 _+ y- ?, [1 Z: \ #define CAN_FLAG_TXOK1 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK1_BIT_POSITION)) /*!< Transmission OK MailBox1 flag */* A6 V! {3 A% t% q ) m" ]+ X, S3 x- ^9 s2 d 第379行; j8 P# k) H7 A- t' w7 L #define CAN_FLAG_TXOK2 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION)) /*!< Transmission OK MailBox2 flag */- {* p2 w6 b' M* i! x9 d 明显应该是 CAN_TSR_TXOK2_BIT_POSITION * k, N6 B% x4 k) ~( g9 g +旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ j p9 o g, |- M: n /* Check End of transmission flag */& c3 ~3 z2 ~% U) { if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))% P- R) e$ E) ?' e {3 k4 k% v' n6 d( q4 e {* G if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) || (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||( O. Y1 U" {4 ]" i4 q3 b (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2))) { /* Call transmit function */ CAN_Transmit_IT(hcan);, I* s, U2 L9 @ T6 Y8 ? }6 C" A+ h2 }4 }/ P }* W3 x* L0 U7 _/ R +新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 R `' J$ c* Y, s if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))1 _4 e0 `" t+ Z4 w& g# Q6 Z { /* Check Transmit request completion status */4 b4 F) W( n) u- Q. m& f tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0); tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);1 O, H; S( h& s0 C tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);4 V; V; d3 `! y' h- H9 D) Y6 Z if(tmp1 || tmp2 || tmp3) { tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0); tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);0 v6 M& E7 T# }' ?7 N8 c! ?" L' e tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);, ~' y3 j/ h: t0 s /* Check Transmit success */7 G) s" v$ X( o2 z if((tmp1) || (tmp2) || (tmp3)) { /* Call transmit function */ CAN_Transmit_IT(hcan);0 \" n( f$ w3 H: i } else /* Transmit failure */ {, ?$ ^3 I! E8 P# I) j /* Set CAN error code to TXFAIL error */ errorcode |= HAL_CAN_ERROR_TXFAIL; }; {. F7 Q" V2 E% g& d7 j /* Clear transmission status flags (RQCPx and TXOKx) */0 S' d! M# v2 s SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \) s$ x' d6 y) J* P: w3 Y& ]* F CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);; `6 m! [; s5 N ~9 N9 i8 L+ f7 N( v }8 d, a( W2 t, r4 e }, \# Q6 Q3 H% @6 A' \1 I ' q% f: y0 @5 ^3 Z# x =========================================================================================== ' N" g* `4 B) z 第二个问题关于AFIO的 表现为设置管脚映射时会失去与调试器的通讯 z+ _' [2 R: z4 W/ ?6 P7 p 原因是AFIO中关于调试端口的设置是 只写的 不能读7 O, O0 Q9 m/ ~7 Z% V' f1 S 而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回 然后就是调试器丢失通讯0 h7 g% ?$ L; n$ ~* q [# @ ) Y/ E% }; c/ l. O- P 解决办法是修改 stm32f1xx_hal_gpio_ex.h文件/ V e4 `3 M) T- ` 将关于AFIO操作的宏定义全改了1 u9 U6 o' j" M) c. {8 g 改法如下,里面有好多处,都要改 改好的文件在后面 下载后把 STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的替了就行了, g8 Z4 B. |, `( i9 O! F% G 只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题 错误的写法 /**' j: G3 e# G% t! k, f * @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: t4 e# f6 f2 W3 P0 D3 g$ Q */* g2 G" m1 ~1 | O; G) a #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)! I6 a6 K) G+ L! \1 L* v * @retval None */ #define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)& r# S' P8 ]6 x- z4 z5 R5 p & K4 B8 I L* g! z5 d5 G 修正过的 /** * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI./ [9 _9 c1 D5 d: u2 z; n * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5) * @retval None */. P x" B; V* A, C( e #define __HAL_AFIO_REMAP_SPI1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)* _ X2 q' I2 g7 ?# k" Z 8 C# R* l$ t1 J! r: s /** * @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)) V$ i! y& K( n. K * @retval None */% Q; \( {8 r7 ^# R #define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG) , y, F( H0 h4 t# b& ~/ \ + Y6 G* h3 `% } & }2 t; a0 R7 U/ W' X' B |
支持一下,我也是感觉到ST没有对中国地区一个友好的BUG提交模式,其实是对自己很大的损失,自己产品线那么多,中国用户量大,很多问题能快速的帮助发现BUG。 |
不错不错,很好的,支持 |
坑不少啊,谢谢指正 |
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32固件库分享,超全系列整理
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
基于STM32F1的CAN通信之之串口IAP