在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */& \5 X# D- D' J3 `- y* p
- #define TIM7_DAC_IRQn TIM7_IRQn; o- Q- R2 q0 G+ B2 l
- #define COMP4_5_6_IRQn COMP4_IRQn
/ B5 N. `& B2 h3 D( t; o1 n
; M: M& ~+ k2 F w$ {& s4 K- /* Aliases for __IRQHandler */
6 u* e: N8 F. p; `0 E: r - #define TIM7_DAC_IRQHandler TIM7_IRQHandler+ j$ L3 r' w( [$ h* T0 Y* q
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以./ f5 R2 A6 h" v- Z, z0 t5 G0 o
但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.
& J9 o' ^% ~9 c, u 通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:0 T7 T! d3 h9 }' z2 @9 W
- /* Aliases for __IRQn */8 M- L, u' }$ _% {. x
- #define TIM7_DAC_IRQn TIM7_IRQn7 \6 n8 U) F9 p% I
- #define COMP4_5_6_IRQn COMP4_IRQn3 b" e( _ r# Y8 j D t
- 9 ~) ~& d! [8 }1 F q0 }
- /* Aliases for __IRQHandler */
E; k/ Z0 b b6 w( P - #define TIM7_IRQHandler TIM7_DAC_IRQHandler
* {: J! D1 ^ T2 R$ t - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
?5 H3 g" {2 u- e! R
+ q/ Q: Z# n) V3 R- q2 t" S' Q1 ~# U# L! [) |8 ]' z
" a2 G8 @. H7 J5 M; _& Q
( n3 f; L7 z/ [) [2 O
( G. ^1 M, A/ O! ]) L8 P
) v2 w* T1 J) b4 F4 f7 _" g
, ]6 a/ T2 s' C h6 L |
哦,感谢分享