写在前面 ST的CUBE是个很好用的工具,但是由于产品较多,好多细节照顾不周 代码存在bug也正常,但是库代码的BUG极其难查2 o% d# s! B% W% U 下面这两个bug 在多个版本一直存在 一直没改,不知道是用的人少还是什么原因 最可恨的是发现BUG 连个上报bug的通道都没有,ST不知道,新版本照旧,不知道多少人还会被坑,在这点对ST表示鄙视 ===========================================================================================2 i3 y4 M. n" V8 ~; S 这一个是新发现的 足足被坑了快一周,表现在CAN用中断发送大量发数据时 一旦用到 TX MailBox2 就死掉了 结果发现是这的问题+ y0 x) S7 l9 C, t+ J' Z9 x/ n 旧版本也存在,但是由于V1.6.0的 HAL_CAN_IRQHandler 改变了TXOK位的使用方法 所以旧版的CUBE库没发现问题 STM32Cube_FW_F1_V1.6.0 ' I: h7 N+ [5 _+ W& w, F2 S4 c y ****************************************************************************** * @file stm32f1xx_hal_can.h9 C$ R9 n3 a6 x& j2 k. G' D- }) k# ~ * @author MCD Application Team4 q/ I; G( @) C! M * @version V1.1.1% }' k, h+ e |' M$ |3 C * @date 12-May-2017* B; r0 [4 p, |5 R; F# K * @brief Header file of CAN HAL module.; R b6 }% M. ^% Q3 d; y ******************************************************************************" R8 ]8 d4 V3 p$ v : o4 f r% U8 I7 _- g# u , T% ? e2 Y! }' v: [& g1 m #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 */ 8 Q% u- n0 K* n1 | 第379行 #define CAN_FLAG_TXOK2 ((uint32_t)((TSR_REGISTER_INDEX << 8U) | CAN_TSR_RQCP0_BIT_POSITION)) /*!< Transmission OK MailBox2 flag */2 R8 W% F( b6 O. n- A1 B$ f + c6 ]" J5 [+ V: _- e4 i & U4 N0 l) p' B 明显应该是 CAN_TSR_TXOK2_BIT_POSITION 4 H- v# h1 r1 m% u) t6 p +旧版的代码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& ]. {! j/ {! A6 L& R' s /* Check End of transmission flag */' R8 B" z' T+ ? if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))% g! k( {- p) C7 o- M+ W0 x# q1 C { if((__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0)) ||3 I9 u1 p6 _% A' }: s p' T8 r q2 l (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1)) ||6 r( c+ n/ ~5 k (__HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2))) {7 [0 ~2 m* P4 J /* Call transmit function */ CAN_Transmit_IT(hcan);6 x8 K/ w* e5 H6 P3 H" L } }$ i! {& k& p" {2 d$ U/ r ) Z& s" G2 Y5 h& B ?, m5 a +新版的代码 STM32Cube_FW_F1_V1.6.0++++++++++++++++++++++++++++++++++++++++++++++++++++++++ " S, x; @' V r! C! c2 K {) N 4 ?- [) N! F; y7 r$ \$ ~% g: ] if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))& {: F# F0 m! t! F {! l2 u) M" ]: m. G5 t8 Q /* Check Transmit request completion status */ tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);9 k E0 n: a' `3 k6 \. r tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1); tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);# ]# T7 C$ Q8 g3 ^( P0 ^ if(tmp1 || tmp2 || tmp3) { tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);3 y3 x; i" R1 v- C tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1); tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);3 }2 ^2 I5 _2 c, H, O /* Check Transmit success */ if((tmp1) || (tmp2) || (tmp3)) {# ^: v1 @6 [! c- X+ E/ X, e /* Call transmit function */" o8 b5 Y5 P! l7 H CAN_Transmit_IT(hcan);. f+ Z6 m7 Q, B. x+ U- _ }4 d' z2 w( E. t, a* O1 P) ? else /* Transmit failure */0 _" e, |# l2 W+ V, m' } {7 ]# K& z( e! U# r( n /* Set CAN error code to TXFAIL error */ errorcode |= HAL_CAN_ERROR_TXFAIL;9 o0 w7 E' ]7 s! b }" q, J# `! P; ~! ]3 A /* Clear transmission status flags (RQCPx and TXOKx) */ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \" B3 @$ C2 n, j% |5 e' r" x CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);/ z' J8 C! X- ~/ \5 M7 \% q }; M; |6 Q1 x) L, k6 W3 l }- U$ {- ?- h* s' n* [ 7 s" w. u6 T% V9 v5 ^1 Z =========================================================================================== . Q" b' S& n6 `+ E( |: E 第二个问题关于AFIO的 表现为设置管脚映射时会失去与调试器的通讯 原因是AFIO中关于调试端口的设置是 只写的 不能读& z# n: ~5 `, a/ F# S; Y 而库代码没有注意到AFIO的这个特点 依旧是 读取->修改->写回 然后就是调试器丢失通讯 4 y* y) p9 C: g1 \; a 解决办法是修改 stm32f1xx_hal_gpio_ex.h文件 将关于AFIO操作的宏定义全改了/ t; A. ~+ @ S: o" N 改法如下,里面有好多处,都要改 改好的文件在后面 下载后把 STM32Cube_FW_F1_V1.6.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的替了就行了 只收1金币算是支持下吧,实在不想花金币就按下面的说明照着改也没问题2 L) q, L' o2 q u; u& [3 ]6 L! J" P. e 错误的写法7 U: d u( F. w1 B2 ] r+ }/ g+ `7 L ) B. U1 U4 m! O /**1 T0 L( B- w' ?2 t) \ * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI.+ k3 M- D7 L; i# E * @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) 6 _) e+ W3 @8 V9 z! } /**5 N* p5 M$ L% {8 X k7 {1 N1 K * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI." o9 P ^$ ?0 J0 Y7 D0 j; P7 E * @note DISABLE: No remap (NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7)( d; s h e8 H( ^ * @retval None- `, K) j t# P% I3 L */: Z" k) W" f4 s) `0 n3 J #define __HAL_AFIO_REMAP_SPI1_DISABLE() CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP) # W5 ^1 f$ Y8 o% ~ 修正过的 1 E% X# X% w1 r$ N /** W8 U, C& a1 n- R * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5); o2 m6 z, U9 j, Z# r& b# ^- G * @retval None: N3 C& O+ X8 J2 x, x H3 k2 } */: d" O% }/ k' }; Y #define __HAL_AFIO_REMAP_SPI1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP|AFIO_MAPR_SWJ_CFG)7 Z3 T4 E* }& G# Q+ H ( _) g6 T- A+ V2 w( D- _: {1 K6 C /** * @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) & Z* `' {. T, ] |
支持一下,我也是感觉到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