在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
4 d0 X2 u( f8 f( s- @ - #define TIM7_DAC_IRQn TIM7_IRQn
. z( E2 K' U( G$ D - #define COMP4_5_6_IRQn COMP4_IRQn3 ]) U8 V2 E8 y6 z2 x
- ( S, @1 E3 C1 F! z+ u( w
- /* Aliases for __IRQHandler */. X& i2 {; t' B/ V0 n
- #define TIM7_DAC_IRQHandler TIM7_IRQHandler
) J: x( I% q* {. ^( h - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.
, y& u. n6 w( b3 e& P* s 但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里." h+ z! y3 ^. c! _# }& Q9 p
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:9 x1 P! ?0 `4 ^( Y7 j8 a
- /* Aliases for __IRQn */. v) H/ u1 X- Y$ ^& A: i! w. r
- #define TIM7_DAC_IRQn TIM7_IRQn/ q# C5 O, e% y* ]9 k# B. |+ Q4 F- b; G
- #define COMP4_5_6_IRQn COMP4_IRQn" w, K- k9 B$ Y! e
- E& K# J0 w4 O. u+ f% d; J {) S- /* Aliases for __IRQHandler */2 G+ E* {/ j0 m* v
- #define TIM7_IRQHandler TIM7_DAC_IRQHandler. Y1 F- E. d6 j0 p* y! i; w
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
: L) f) M' ~9 [' y, o0 v6 [" Q( S
$ d- U0 {8 y$ ], @ W7 d) q4 v% }* K' O" s9 ]3 J. V! V- O& {3 O
f9 Y' g" u5 \5 Q7 Z
& N* U+ ~4 V3 O% L8 j- Z& L8 O
7 s. \( u& D6 h* X: m2 F6 I' l
: `) p8 S2 m; ~: p* z/ ~6 R% `2 P* R0 J9 h m/ g
|
哦,感谢分享