在使用STM32G431KBT6时, 发现TIM7的中断服务函数一直进不去, 一直跳进启动文件的弱函数里, 使用STM32CubeMX自动生成的代码也是一样, 那肯定是有BUG了, 通过寻找, 发现了以下问题. 在文件<stm32g431xx.h>最下面,官方的原代码如下:- /* Aliases for __IRQn */
3 @5 v6 T/ {( v: K" O - #define TIM7_DAC_IRQn TIM7_IRQn
7 c2 J9 ?: s# N6 F. v - #define COMP4_5_6_IRQn COMP4_IRQn& U1 q, ^4 g7 T. T) T
- ; W$ U/ h* }: ]3 Z
- /* Aliases for __IRQHandler */
5 o, n" [; Q0 V9 {/ _) S5 ? - #define TIM7_DAC_IRQHandler TIM7_IRQHandler# t/ ?) s" q! m1 J
- #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 官方是想通过宏定义一个新的命名让用户使用<TIM7_DAC_IRQn>和<TIM7_DAC_IRQHandler>也可以.
( `: n0 I M @. [- R5 z 但是, 文件<startup_stm32g431xx.s>中的中断向量命名为<TIM7_DAC_IRQHandler>, 而因为#define重定义, 导致用户编写代码时, 无论是使用<TIM7_DAC_IRQHandler>还是<TIM7_IRQHandler>, 都转为了<TIM7_IRQHandler>, 并无法替换启动文件中的弱函数. 所以就是进不去用户编写的中断服务函数, 一直跳进启动文件中的弱中断服务函数里.
+ m; T7 w4 g; k5 F* y2 J 通过以下的一个小修改, 即将<TIM7_DAC_IRQHandler>与<TIM7_IRQHandler>调换以下, 便可以解决这个问题:
/ Z( P( L6 P! n! O1 k- /* Aliases for __IRQn */
; r& I* f9 T4 @# ]- }0 q - #define TIM7_DAC_IRQn TIM7_IRQn s1 L! n3 ^& P5 M( A- [! t+ e
- #define COMP4_5_6_IRQn COMP4_IRQn
+ ?$ d3 I% \# R8 r. Y9 r& l y
' G( i( @/ a, |+ l; m5 D/ V- /* Aliases for __IRQHandler */
5 F/ {1 @2 I# d U1 l - #define TIM7_IRQHandler TIM7_DAC_IRQHandler
# G3 t$ R/ F" c$ r - #define COMP4_5_6_IRQHandler COMP4_IRQHandler
复制代码 <COMP4_5_6_IRQHandler>与<COMP4_IRQHandler>没有这个问题, 是因为启动文件中的弱函数确实是<COMP4_IRQHandler>,所以这里是对的. 通过此方法解决后, 可以正常使用TIM7的中断服务函数了, 但隐隐感觉官方没有好好测试, 造成这种很低级的错误.
2 u# ?( v# e! h1 }
' ?# a& m5 g C4 N% M
$ N1 i( _+ U4 q e7 }& C% B2 J! n$ S9 I2 Y
% \7 q7 ?% L d! _! g- r% L& L7 _* i
2 {) I! y9 a+ A# {( c+ {" Y
+ o& g W3 r* I! Z
$ h& \4 L# h z3 H' G+ l
|
哦,感谢分享