a) 目的:使用系统时钟来进行两项实验——周期执行代码与精确定时延迟。 b) 初始化函数定义: void SysTick_Configuration(void); c) 初始化函数调用: SysTick_Configuration(); d) 初始化函数: void SysTick_Configuration(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟除8 SysTick_SetReload(250000); //计数周期长度 SysTick_CounterCmd(SysTick_Counter_Enable); //启动计时器 SysTick_ITConfig(ENABLE); //打开中断 } e) 在NVIC的初始化函数里面增加以下代码打开相关中断: NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//中断等级设置,一般设置的高一些会少受其他影响
f) 在stm32f10x_it.c文件中找到void SysTickHandler 函数 void SysTickHandler(void) { 执行代码 }
g) 简单应用:精确延迟函数,因为systic中断往往被用来执行周期循环代码,所以一些例程中使用其中断的启动和禁止来编写的精确延时函数实际上不实用,我自己编写了精确计时函数反而代码更精简,思路更简单。思路是调用后,变量清零,然后使用时钟来的曾变量,不断比较变量与延迟的数值,相等则退出函数。代码和步骤如下: i. 定义通用变量:u16 Tic_Val=0; //变量用于精确计时 ii. 在stm32f10x_it.c文件中相应定义: extern u16 Tic_Val;//在本文件引用MAIN.c定义的精确计时变量 iii. 定义函数名称:void Tic_Delay(u16 Tic_Count);//精确延迟函数 iv. 精确延时函数: void Tic_Delay(u16 Tic_Count) //精确延时函数 { Tic_Val=0; //变量清零 while(Tic_Val != Tic_Count){printf("");}//计时 } v. 在stm32f10x_it.c文件中void SysTickHandler 函数里面添加 Tic_Val++;//变量递增 vi. 调用代码:Tic_Delay(10); //精确延时 vii. 疑问:如果去掉计时行那个没用的printf("");函数将停止工作,这个现象很奇怪。 |