在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
) L) ]7 o/ W/ y5 w% f3 V - #define TIM7_DAC_IRQn TIM7_IRQn
4 c' j( U. y9 q0 ^/ J- r - #define COMP4_5_6_IRQn COMP4_IRQn
* w+ l0 C* }: }( r2 }8 o
' y. [( l/ B e- A/ P* J- /* Aliases for __IRQHandler */1 c) j$ |' R$ d! r/ }! u4 g
- #define TIM7_DAC_IRQHandler TIM7_IRQHandler7 a( J/ h9 N* E8 _" l( m
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.1 I3 W5 _9 i9 H! r
但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.8 ^3 t* U- u4 _% L% X% h
通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:
0 P9 w* \# h, [1 x! _. u- /* Aliases for __IRQn */
+ {4 J, z3 I) F - #define TIM7_DAC_IRQn TIM7_IRQn1 C0 d7 s1 {9 z' }, j' N' W
- #define COMP4_5_6_IRQn COMP4_IRQn
' P" l7 G7 u' @+ H8 L: |
0 b. c2 ?# N2 ~7 b* n- /* Aliases for __IRQHandler */
6 o# z' E" e. ^- [' q - #define TIM7_IRQHandler TIM7_DAC_IRQHandler
$ v/ k2 d' r+ ]( m0 l1 l6 H: o4 s - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.5 s" M& \) r. \9 x& D' d; _
$ [0 ]6 C {, f- X2 a: {9 F
! n8 V2 [) w6 |( Y
& \- L/ `. {; b- d# V F
8 Y! V5 }. g2 {# A4 I+ c5 Z- h B- y: m; ]8 Y% h+ w
! l4 a: H' \2 Y/ L: ^; U Q1 L3 K
5 _' |! d1 \/ k" C4 v9 Q |
哦,感谢分享