在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */9 \" ^2 U3 R$ }0 X/ O3 R+ Z! ~
- #define TIM7_DAC_IRQn TIM7_IRQn
% _* W7 G3 |2 x8 F7 k, ~) p' a% c - #define COMP4_5_6_IRQn COMP4_IRQn
' R+ j$ B, a% T3 S4 R; C - * ^' x, u5 c/ K$ A
- /* Aliases for __IRQHandler */
1 R% _: |. V! A, o: m - #define TIM7_DAC_IRQHandler TIM7_IRQHandler* U5 T5 V6 H/ y
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.
q+ b2 \2 _. N) O8 c, S9 s- S 但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.4 w+ O) a* A) [
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:
1 t) c% B& v$ y1 P( B1 ]0 h3 P- /* Aliases for __IRQn */
8 [. w: q. e7 @, D7 a - #define TIM7_DAC_IRQn TIM7_IRQn
* `+ t6 D* `+ S7 _! S# ] - #define COMP4_5_6_IRQn COMP4_IRQn1 E- J/ q1 `5 e# J5 M- H- P& Z
4 y0 T1 S. f' M+ ~; f1 ?. c7 c- /* Aliases for __IRQHandler */
1 U9 z# U' m9 u5 K1 U+ ] - #define TIM7_IRQHandler TIM7_DAC_IRQHandler5 h$ S$ Z. w1 F6 R8 X9 _
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.5 T! m |5 E q) i4 {7 A- S5 r
9 K% ~ u# h5 w6 A" \) Y6 N5 [' S) e% v7 n( V
: w2 C& R2 h8 z" O; M, w- F
5 O2 B. b5 n3 K0 W$ V9 V. V3 `/ R* _: q) `: Y
; V8 v+ q$ z7 d
% `/ c. M! E! w) x0 P6 K) b
|
哦,感谢分享