/**
* @brief Configures the SysTick. 系統(tǒng)時鐘配置函數(shù) main.c
* @param None
* @retval None
*/
void SysTick_Configuration(void)
{
/* Setup SysTick Timer for 100 msec interrupts */
if (SysTick_Config((SystemCoreClock) / 10)) // 1/10s=100ms
{
/* Capture error */
while (1);
}
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
/**
* @brief This function handles SysTick Handler. 系統(tǒng)時鐘中斷函數(shù) stm32f10x_it.c
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
/* Generate TIM1 COM event by software */
TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
}
SysTick_Config(SystemFrequency / 10) 函數(shù)的形參就是systick重裝定時器的值。
systck計數(shù)頻率為每秒72000000次,所以72000次就是1/10秒,也就是100ms。
SysTick是1個24bit遞減計數(shù)器,通過對SysTick控制與狀態(tài)寄存器的設置,可選擇HCLK時鐘(72M)或HCLK的8分頻(9M,缺省是這個)作為SysTick的時鐘源。
SysTick的重裝寄存器決定了定時器頻率。
若SysTick的時鐘源是72M, SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時基。
// 1/1000 s=1ms
關于SysTick校準寄存器的介紹 (大多數(shù)情況下,我們可以不必理會它)
校準值寄存器提供了這樣一個解決方案:它使系統(tǒng)即使在不同的CM3產品上運行,也能產生恒定的SysTick中斷頻率。最簡單的作法就是:直接把TENMS的值寫入重裝載寄存器,這樣一來,只要沒突破系統(tǒng)極限,就能做到每10ms來一次 SysTick異常。如果需要其它的SysTick異常周期,則可以根據(jù)TENMS的值加以比例計算。只不過,在少數(shù)情況下,CM3芯片可能無法準確地提供TENMS的值(如,CM3的校準輸入信號被拉低),所以為保險起見,最好在使用TENMS前檢查器件的參考手冊。
SysTick定時器除了能服務于操作系統(tǒng)之外,還能用于其它目的:如作為一個鬧鈴,用于測量時間等。要注意的是,當處理器在調試期間被喊停(halt)時,則SysTick定時器亦將暫停運作。
下面利用 SysTick 產生的 硬件延時函數(shù) 延時 dly_ms 毫秒
/*******************************************************************************
* Function Name : SysTickHandler
* Description :系統(tǒng)時鐘,一般調教到1MS中斷一次
*******************************************************************************/
void SysTick_Handler(void)
{
if(Timer1)
Timer1--;
}
/********************************************
**函數(shù)名:SysTickDelay
**功能:使用系統(tǒng)時鐘的硬延遲
**注意事項:一般地,不要在中斷中調用本函數(shù),否則會存在重入問題.另外如果屏蔽了全局中斷,則不要使用此函數(shù)
********************************************/
volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)
{
Timer1=dly_ms;
while(Timer1);
}