背景
研究STM32F10xxx定時器的時候,無意間看到了System tick Timer,於是比較深入的了解下,在此做個記錄。
正文
System tick Timer是Cotex-M內核的24位計數的系統定時器。它的自動重載值可被隨時配置更改,並且如果配置了系統定時器,那么它的中斷也即被跟着使能。需要強調的是,在STM3210xxx的用戶手冊里,基本上找不到關於系統定時器的信息,所以想要深入了解配置該定時器,得去看內核相關文檔,不過好在有了庫函數,可以暫時不去深究內核文檔,即可利用ST提供的庫函數來進行配置。本文即記錄了利用ST的庫函數將該定時器的時鍾配置為“AHB Clock”8分頻並實現微妙(us)延時的方法。
首先是配置系統定時器的時鍾源,庫函數如下:
/**
* @brief Configures the SysTick clock source.
* @param SysTick_CLKSource: specifies the SysTick clock source.
* This parameter can be one of the following values:
* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
* @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
* @retval None
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
從以上的說明可以看出,系統定時器可被選擇為AHB時鍾或者AHB 8分頻。本例則配置為 AHB 8分頻:
/**
* SysTick時鍾源由HCLK/8提供,當系統頻率為72MHz時,最小計數周期為1/9MHz,計滿9次為1us,
* tick_us以9為單位,在此為基礎實現us延時。
*/
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
tick_us = sysclk/8; // sysyclk = 72
tick_ms=(u16)tick_us*1000;
接着實現Delay_us(uint us)函數
void Delay_us(uint us)
{
uint temp;
SysTick->LOAD = us * tick_us; // 滴答9次就是1us
SysTick->VAL = 0x00; // 賦初值為"0"
SysTick->CTRL = 0x01 ; // 開啟定時器
do
{
temp = SysTick->CTRL;
}
while( (temp&0x01) && (!(temp&(1<<16))) );
SysTick->CTRL = 0x00; // 停止計數器
SysTick->VAL = 0x00; // 清空計數器
}
以上函數則實現了us定時。
當然也可以使用它的中斷函數:
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
// 要做什么,自行發揮。
}
參考鏈接
此文章參考借鑒了"ARM KEIL"官方文檔:"System Tick Timer" 。
至此,記錄完畢
記錄時間:2016-12-29
記錄地點:深圳WZ