welcom ! Handel home

2014年6月17日 星期二

ST32教程( 12 )

                                STM32筆記之十二:時鐘不息工作不止,systic時鐘應用

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("");函數將停止工作,這個現象很奇怪


沒有留言: