在使用STM32单片机的HAL库函数编程时,会发现好多中断函数里面都有各种回调函数,还有好多函数的调用深度比较深,在编写代码的时候,有时候想查看某个函数是如何被调用的,查看起来非常麻烦。这时候就可以使用Understand软件来查看函数的调用关系图。
这个软件的使用方法可以查看 嵌入式代码查看分析利器—Understand这篇文章。
用Understand软件查看keil工程编写的单片机代码时,会出现一种情况就是许多库函数不能跳转。
比如要查看HAL_CAN_IRQHandler
这个函数,按住ctrl键单击鼠标时,发现并没有跳转到HAL_CAN_IRQHandler
这个函数内部。
直接打开函数所在的文件后发现,这个函数并没有被编译,全是是灰色的界面,这是为什么呢?明明在keil工程中可以正常使用,但是在Understand中却没有被编译。这是在keil软件中有一个设置专门来声明头文件的。
keil软件中单击魔术棒工具,打开选项设置界面,切换到C/C++选项,此时在Difine选项后面填写的USE_HAL_DRIVER,STM32F407xx
这两个值就是宏定义的声明,当keil软件编译时,会自动把这两个声明编译进去。但是Understand软件在工程代码中却找不到这两个宏定义,所以就默认这两个宏定义没有定义,相关的代码就不会被编译。如果想要Understand软件编译相关代码,那么就需要手动将这两个宏定义声明添加到代码中去。由于HAL库的代码都包含 stm32f4xx.h
这个头文件,那么就将宏定义写在这个头文件里面。这个头文件的名称和自己使用的单片机型号有关,我用的单片机是STM32F407所以头文件名称就是·stm32f4xx.h·,如果使用的是STM32F103系列单片机就找·stm32f1xx.h·头文件。
在Understand打开stm32f4xx.h
这个头文件,在最开始的位置添加宏定义声明
#ifndef USE_HAL_DRIVER
#define USE_HAL_DRIVER
#endif
#ifndef STM32F407xx
#define STM32F407xx
#endif
然后在工具栏选择Project — Analyze All Files,重新编译所有文件。
这时候再打开stm32f4xx_hal_can.c
文件
此时中断函数就被编译了,在HAL_CAN_IRQHandler
函数名上面按住ctrl键单击鼠标,此时就能正常跳转到这个函数内部了。
这时候如果想查看can中断的回调函数,就选中HAL_CAN_RxFifo0MsgPendingCallback
函数,然后再调用关系中选择Called By
这时就可以清晰的看出,从can.c文件里面调用了HAL_CAN_IRQHandler
函数,而这个函数又调用了can.c文件里面的 HAL_CAN_RxFifo0MsgPendingCallback
函数。
也可以查看HAL_CAN_IRQHandler
函数里面都调用了哪些回调函数,鼠标双击选中HAL_CAN_IRQHandler
函数名,然后再工具蓝调用关系图中选择Calls。
可以看到HAL_CAN_IRQHandler
函数中回调函数有很多个。
通过这种手动增加宏定义的方法,就可在Understand软件中查看HAL库函数的调用关系了,通过图形化的界面帮助我们在写程序的时候更加高效。