在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
+ J1 T/ @# J. E4 k - #define TIM7_DAC_IRQn TIM7_IRQn
; n* S- P' s u' x/ a - #define COMP4_5_6_IRQn COMP4_IRQn2 _# T( U6 `4 Q$ h1 _
* Q9 h" h: S/ T4 f2 x% f( k" @. Z. D2 G- /* Aliases for __IRQHandler */' R# O0 }, x F
- #define TIM7_DAC_IRQHandler TIM7_IRQHandler
O$ I4 J* y4 V' S' ` - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.& i8 c* M4 A- j2 w# A
但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.$ r9 S# t) q- u) w
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:
! ~( N4 Z+ _6 I$ j- /* Aliases for __IRQn */2 j7 u1 K8 A" [. U
- #define TIM7_DAC_IRQn TIM7_IRQn W6 H* K/ L3 f+ g8 W! F6 V- a* q
- #define COMP4_5_6_IRQn COMP4_IRQn' |: ]8 r+ s" S$ ^1 B
- 2 @$ @; n- \1 Q% a
- /* Aliases for __IRQHandler */$ T) H2 k' M# o+ z3 C
- #define TIM7_IRQHandler TIM7_DAC_IRQHandler
- P( X! V5 I- j0 K9 p - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
7 U, z0 d2 A1 i8 |# ?( Z
1 f. W" W% u' ]: T2 X) y; `; r% K. ?3 @* Q
/ O9 X0 H5 o! s9 S
1 ~8 v8 P. E0 e5 R* O
# o- M' H5 K# {" E
5 B* p' R& B6 p$ v4 f! F& s) U, e9 y# A7 ?
|
哦,感谢分享