写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查( W. a. S$ \) O. p 下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因 最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视1 P: d* V' Z3 T3 G ===========================================================================================- o4 V$ R; R" i: N" @ 9 m8 c) [, ~ \& X 这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题 旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题- q" j7 D! P# Q* F STM32Cube_FW_F1_V1.6.0 - r3 s7 c* v9 K) p- Q ****************************************************************************** * @file stm32f1xx_hal_can.h- i; i' r; o$ C * @author MCD Application Team2 }7 Z3 ?' i5 D' h6 _6 m+ U0 ]6 u * @version V1.1.14 [" _) H- w3 i/ O * @date 12-May-2017 * @brief Header file of CAN HAL module. ******************************************************************************% P7 x! }& m, X. c& p, M" s ( B( Y' Y3 O# }' s! L7 y. M5 I0 \ #define CAN_FLAG_TXOK0 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_TXOK0_BIT_POSITION)) /*!< Transmission OK MailBox0 flag */9 p, U1 Y5 \1 u- } #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 */ " ?8 Y" O, B2 W! l- z/ t: A! e 0 j6 S. b6 H4 Z% a& b5 V 明显应该是 CAN_TSR_TXOK2_BIT_POSITION +旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; R& i2 T" m5 M; ?. w6 u /* Check End of transmission flag */ if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))( Y' n- w5 [+ y! T, z( o { if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||( F D' {1 K$ H6 `: r% j (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) || (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2))) {* q; z: ?0 t3 i: L- s# u /* Call transmit function */6 R+ k3 d( i( F- N7 H3 d CAN_Transmit_IT(hcan); } e5 E$ o1 b8 q9 Z+ M }6 U5 M. T9 O4 w- @0 z1 G, t2 ]- C +新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++( G; R& g1 @6 j7 l. s9 u- F if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME)) {7 J# b* Q1 }6 z/ W4 s2 l' Y5 i /* Check Transmit request completion status */ tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0); tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);& g. u+ |' |: e, B5 J2 W# r tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);- V: L5 N' n0 l+ @* R6 M) F0 k* \ if(tmp1 || tmp2 || tmp3) ! \* H E" {% T1 h; h. u0 U {0 }/ Q, |8 q7 Y) [; w tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0); tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);* @( ^: J% U& t4 O5 W* P& E7 e! K tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);! H; C- n* I9 A. Y6 Y9 n. X /* Check Transmit success */ X: [2 \" {/ Q5 y* k+ L( P if((tmp1) || (tmp2) || (tmp3)), B4 \7 V' C' `$ D. x { /* Call transmit function */4 m* Y7 X8 z* _8 L# A+ \' h CAN_Transmit_IT(hcan); } else /* Transmit failure */3 y+ ?+ k* M" d6 X {. @: P4 X' [/ J; v /* Set CAN error code to TXFAIL error */: {3 l4 v7 p# x$ P errorcode |= HAL_CAN_ERROR_TXFAIL;/ |+ b' |2 \5 V } /* Clear transmission status flags (RQCPx and TXOKx) */ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \+ i5 p5 |2 y9 ^- W/ E* v7 O* |2 } CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);; O; T& X1 t9 t( j" z } } 3 q! _0 Y D9 g9 h: n. D! f' f =========================================================================================== 9 K% v& _7 g1 y6 d. k 第二个问题关于AFIO的 表现为设置管脚映射时会失去与调试器的通讯, p5 E0 t- S' [6 O: z2 V 原因是AFIO中关于调试端口的设置是 只写的 不能读8 z1 q* v$ |$ }! B( A- i6 R 而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回 然后就是调试器丢失通讯 ) i: G. s# P! N+ d7 Z( u 解决办法是修改 stm32f1xx_hal_gpio_ex.h文件4 Y$ J0 |& y0 P( j2 E, I 将关于AFIO操作的宏定义全改了 改法如下,里面有好多处,都要改 改好的文件在后面 下载后把 STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的替了就行了 只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题1 R- @( ]3 E' B) S- A; Z; u* b7 m # z6 B2 y* }5 c& _) v; n 错误的写法 2 |4 K: U1 L5 Y* T: a Q( ?* N/ 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)0 t8 p/ ~1 F& Q5 @. y9 ]0 z6 c * @retval None */ #define __HAL_AFIO_REMAP_SPI1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP)& E, F; W( y0 U7 [; y/ E 3 r5 P; N4 h% v W0 r4 s1 ]! U /**) ~3 l. E" w- V$ u+ h * @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 None1 u8 L) h; f& Z8 k */ #define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP) 6 f1 h% w( M* p4 \2 W 修正过的5 w2 |# S. R- d2 ~ 0 n* n! Y/ G' a- u" f /**9 \3 ]- o# H+ \' y * @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) 6 k2 {4 _ @5 K! V- _) f /** * @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)# {+ A/ N, m6 g+ ~4 J8 M8 ^ * @retval None */; t/ R2 {1 [5 Y' ? #define __HAL_AFIO_REMAP_SPI1_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP,AFIO_MAPR_SWJ_CFG) 3 a$ @6 O ], o0 {: G& K " @+ Y8 M- @2 E 2 Z* d" k, p- S$ h7 t( O9 L% U |
支持一下,我也是感觉到ST没有对中国地区一个友好的BUG提交模式,其实是对自己很大的损失,自己产品线那么多,中国用户量大,很多问题能快速的帮助发现BUG。 |
不错不错,很好的,支持 |
坑不少啊,谢谢指正 |
【管管推荐】STM32经验分享篇
STM32固件库分享,超全系列整理
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED