a)目的:使用系統(tǒng)時鐘來進行兩項實驗——周期執(zhí)行代碼與精確定時延遲。b)初始化函數定義:
本文引用地址:http://2s4d.com/article/201611/322070.htmvoid 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)
{
執(zhí)行代碼
}
g)簡單應用:精確延遲函數,因為systic中斷往往被用來執(zhí)行周期循環(huán)代碼,所以一些例程中使用其中斷的啟動和禁止來編寫的精確延時函數實際上不實用,我自己編寫了精確計時函數反而代碼更精簡,思路更簡單。思路是調用后,變量清零,然后使用時鐘來的曾變量,不斷比較變量與延遲的數值,相等則退出函數。代碼和步驟如下:
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("");函數將停止工作,這個現象很奇怪
評論