在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
' }7 Z0 n* ~* ]9 I9 n8 S$ C: A, {% X* F - #define TIM7_DAC_IRQn TIM7_IRQn% r; o( `; q+ L& G- D* h" F* A
- #define COMP4_5_6_IRQn COMP4_IRQn% J+ R# L4 l- ~, T6 L& a; f% J/ U# v
- ' b4 S% I- ^9 G
- /* Aliases for __IRQHandler */
$ w/ z$ e, v# i& ` - #define TIM7_DAC_IRQHandler TIM7_IRQHandler
1 c/ F& X* k/ k. R0 N3 q5 s - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.
$ `' I, s v6 e0 f- p& `/ @3 H* h/ | 但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.; o/ Q+ S! |: X" i, p4 i# L. h0 R. G- x& e
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:
; x3 I3 n& q$ p) A% P8 D- /* Aliases for __IRQn */
& L; o3 b! v0 Y( r! I0 p - #define TIM7_DAC_IRQn TIM7_IRQn
$ K6 q& ]0 f( [1 w! g - #define COMP4_5_6_IRQn COMP4_IRQn
- ?6 ?( l! W8 n* D% ?
) ^0 h- v% y) n( @5 ], i- /* Aliases for __IRQHandler */0 R) {2 U# m* ]
- #define TIM7_IRQHandler TIM7_DAC_IRQHandler* Q4 T, `4 l4 d- \) a
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
9 j: H1 L% q0 D9 F6 H; E% _
, }' B M* W3 r& H8 N+ ?3 X g$ ^. C' E% E. Y: t* x$ A
; @5 ^( w) F; q' x( Q/ S9 Q/ f
* r8 h" w7 X) g. j! W5 d# o3 T1 J9 r
9 M, Q% ?$ ]; I) `
# ~$ L( R* I4 D% N
. `; V8 U& W5 r1 o6 c6 @% L
|
哦,感谢分享