新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 SysTick 系統(tǒng)時(shí)鐘 超簡(jiǎn)易定時(shí)器SysTick

STM32 SysTick 系統(tǒng)時(shí)鐘 超簡(jiǎn)易定時(shí)器SysTick

作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
/**

* @brief Configures the SysTick. 系統(tǒng)時(shí)鐘配置函數(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);
}

本文引用地址:http://m.butianyuan.cn/article/201611/316413.htm

NVIC_SetPriority(SysTick_IRQn, 0x0);
}

/**
* @brief This function handles SysTick Handler. 系統(tǒng)時(shí)鐘中斷函數(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重裝定時(shí)器的值。
systck計(jì)數(shù)頻率為每秒72000000次,所以72000次就是1/10秒,也就是100ms。

SysTick是1個(gè)24bit遞減計(jì)數(shù)器,通過對(duì)SysTick控制與狀態(tài)寄存器的設(shè)置,可選擇HCLK時(shí)鐘(72M)或HCLK的8分頻(9M,缺省是這個(gè))作為SysTick的時(shí)鐘源。
SysTick的重裝寄存器決定了定時(shí)器頻率。

若SysTick的時(shí)鐘源是72M, SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時(shí)基。
// 1/1000 s=1ms

關(guān)于SysTick校準(zhǔn)寄存器的介紹(大多數(shù)情況下,我們可以不必理會(huì)它)


校準(zhǔn)值寄存器提供了這樣一個(gè)解決方案:它使系統(tǒng)即使在不同的CM3產(chǎn)品上運(yùn)行,也能產(chǎn)生恒定的SysTick中斷頻率。最簡(jiǎn)單的作法就是:直接把TENMS的值寫入重裝載寄存器,這樣一來,只要沒突破系統(tǒng)極限,就能做到每10ms來一次 SysTick異常。如果需要其它的SysTick異常周期,則可以根據(jù)TENMS的值加以比例計(jì)算。只不過,在少數(shù)情況下,CM3芯片可能無法準(zhǔn)確地提供TENMS的值(如,CM3的校準(zhǔn)輸入信號(hào)被拉低),所以為保險(xiǎn)起見,最好在使用TENMS前檢查器件的參考手冊(cè)。
SysTick定時(shí)器除了能服務(wù)于操作系統(tǒng)之外,還能用于其它目的:如作為一個(gè)鬧鈴,用于測(cè)量時(shí)間等。要注意的是,當(dāng)處理器在調(diào)試期間被喊停(halt)時(shí),則SysTick定時(shí)器亦將暫停運(yùn)作。

下面利用 SysTick 產(chǎn)生的 硬件延時(shí)函數(shù) 延時(shí) dly_ms 毫秒

/*******************************************************************************
* Function Name : SysTickHandler
* Description :系統(tǒng)時(shí)鐘,一般調(diào)教到1MS中斷一次
*******************************************************************************/

void SysTick_Handler(void)
{
if(Timer1)
Timer1--;
}

/********************************************
**函數(shù)名:SysTickDelay
**功能:使用系統(tǒng)時(shí)鐘的硬延遲
**注意事項(xiàng):一般地,不要在中斷中調(diào)用本函數(shù),否則會(huì)存在重入問題.另外如果屏蔽了全局中斷,則不要使用此函數(shù)
********************************************/
volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)
{
Timer1=dly_ms;
while(Timer1);
}



評(píng)論


技術(shù)專區(qū)

關(guān)閉