最近我在看我一个同事使用HAL编写的STM32F107RCT6芯片的代码,发现SysTick定时器已经开始运行,并且不断产生中断。因为在stm32f1xx_it.c中有中断服务函数的入口:

中断服务函数内部不断对全局变量uwTick进行读写操作。那现在就有一个问题了,SysTick定时器是在哪里配置的,并且中断使能是在哪里?
我找了好长时间也没有找到,不过我通过投机取巧的搜索找到了。
首先找到SysTick定时器对应中断服务号:SysTick_IRQn。然后使用vscode的搜索工具进行搜索(区分大小写、全字搜索),发现在源文件:stm32f1xx_hal.c源文件中的HAL_InitTick()函数内部调用了这个中断服务号:

这里对SysTick定时器的NVIC相关寄存器的优先级进行了配置。
剩下的就比较简单了,搜索关键字“HAL_InitTick”,也是区分大小写、全字搜索,发现存在2处调用,如下所示:
(1)main()---》SystemClock_Config()--->HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)---》HAL_InitTick (TICK_INT_PRIORITY);---》HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);

(2)main()--->HAL_Init()---》HAL_InitTick(TICK_INT_PRIORITY)---》HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
最后,看一下函数:HAL_SYSTICK_Config()函数内部


在SysTick_config()函数中使用了寄存器SysTick的相关寄存器。这里对寄存器进行了配置。
联想:
以上办法是使用关键字函数SysTick_IRQn搜索找到的相关调用关系,既然我们知道寄存器才是驱动的根源,能否通过搜索寄存器关键字呢?这里的关键字为“SysTick”。我测试了一下直接搜索相关寄存器还是一种比较便捷、捷径的方法。
如下所示:
搜索SysTick->CTRL寄存器的关键字

首先,我们知道STM32F103RCT6单片机是Cortex-M3内核,所以只需看core_cm3.c、stm32f1xx_hal_cortex.c、stm32f1xx_hal.c这3个源文件。

main()-->SystemClock_Config()--->HAL_InitTick(TICK_INT_PRIORITY)---》HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq))---》SysTick_Config()---》SysTick->CTRL
main()--->HAL_Init()---》 HAL_InitTick(TICK_INT_PRIORITY); ---》HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) ---》SysTick_Config(TicksNumb);---》SysTick->CTRL
以上2个调用关系其实都是确切到了“函数调用”而非“函数定义”上,具体过程:
如果搜索了某一个函数然后往前查看函数名是在哪个函数名内部,然后再搜索函数名,找到当前函数名所在第三个函数内部调用关系;
函数调用关系(省略了函数名所在主函数名)---》函数调用关系(省略了函数名所在主函数名)--->函数调用关系(省略了函数名所在主函数名)---》...---》函调用关系(省略了函数名所在主函数名)
搜索的时候使用键盘“上下箭头”可以往回或者往后 会到上一次搜索内容或者已经搜索内容。后面多练习。
以上函数调用关系---》函数调用关系,我现在用的不熟悉,后面多多练习。
2746

被折叠的 条评论
为什么被折叠?



