在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
8 ?8 L5 S; a% Z( s$ L. o2 P - #define TIM7_DAC_IRQn TIM7_IRQn) V9 x& C/ ?6 `9 G% L. K
- #define COMP4_5_6_IRQn COMP4_IRQn- q5 P; r+ A/ z: K( R T7 \: q& ]3 V6 A. K
4 L& K6 g9 {2 k. Y$ g6 G- /* Aliases for __IRQHandler */
% B+ `1 b$ D) e. Q9 O: o$ } - #define TIM7_DAC_IRQHandler TIM7_IRQHandler
) _7 v+ l/ y1 d/ P( z - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.3 p( z ?4 G/ c4 Y6 `# h3 @
但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.2 g4 A& }! p) f9 \, a% C
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:/ ^2 P8 N9 z! x: H
- /* Aliases for __IRQn */4 l# T1 o7 o9 o& [8 L
- #define TIM7_DAC_IRQn TIM7_IRQn& z! f* e1 b6 P4 m. u. c6 W6 Q9 Z
- #define COMP4_5_6_IRQn COMP4_IRQn' v7 ]( R" A* e, p+ @* e- q: z
- ' {4 l5 z. J; e8 H
- /* Aliases for __IRQHandler */
! }4 B1 K( M( ?* a( \ - #define TIM7_IRQHandler TIM7_DAC_IRQHandler
8 p/ L: }$ W) Z, F3 {* w9 J$ R - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.& H+ g) E) I, o7 w
1 B! O6 n' N3 s9 V/ T9 W* D
! l0 u% A0 N1 `+ Z. l! ?
) T/ ?/ f8 E+ {8 i+ X8 Y* d
: A1 z E( `/ N
$ J0 A7 r5 k2 a' a; ]" w7 X! x, N: Q& z6 {5 e) P9 w7 a& p
4 v8 N/ c' G0 S9 Y
|
哦,感谢分享