在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
) _7 i" r# j3 V! `0 L - #define TIM7_DAC_IRQn TIM7_IRQn
& o9 H l" H: | - #define COMP4_5_6_IRQn COMP4_IRQn
: V! {: n0 D" o z4 p# u; ?- }5 q - : [$ r, _* t4 p. C4 n; Y
- /* Aliases for __IRQHandler */' y4 G1 g: w" Q
- #define TIM7_DAC_IRQHandler TIM7_IRQHandler+ f$ l, W% {/ p ^% }$ i/ K
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.
1 A8 w, Y* @' P7 n 但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.& O" u* g4 [& j0 V
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:' {/ l+ k7 F- V% I
- /* Aliases for __IRQn */* `" c7 I% A% h2 P' a
- #define TIM7_DAC_IRQn TIM7_IRQn
* H: S+ c7 l- v9 C, G - #define COMP4_5_6_IRQn COMP4_IRQn1 n5 u( s4 m4 y* \3 c; {
; |$ K& f- c8 g- K; J2 t( h" e- /* Aliases for __IRQHandler */
; c1 v: O8 k; p" t( ^- a" ?6 o - #define TIM7_IRQHandler TIM7_DAC_IRQHandler. V) u8 ?- L! [5 w* h
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
' D; t: y* h% k% X S
6 M" B1 O' B! f' N) r+ A5 K, [, A. S; y2 |
C; r- I6 c5 r$ S4 @0 s S9 r. _7 n, O
. u, z" p4 s- c
) I' a( f4 V' B# |1 r0 P: H% l7 L8 D
/ e/ N' A- V4 b# m/ L |
哦,感谢分享