STM32用SysTick來做定時器
阿新 • • 發佈:2018-12-30
1 硬體電路配置
這裡還是借用前面LED電路我就不貼圖片。
2 時鐘說明
SysTick和HCK的時鐘頻率是一樣的庫函式程式碼如下
/** * @brief Initialize and start the SysTick counter and its interrupt. * * @param ticks number of ticks between two interrupts * @return 1 = failed, 0 = successful * * Initialise the system tick timer and its interrupt and start the * system tick timer / counter in free running mode to generate * periodical interrupts. */ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ }
由庫函式可知道沒有進行分頻動作所以時鐘和主時鐘一樣
配置時鐘中斷的時間間隔
<pre name="code" class="cpp">void SysTick_Init(void) { /* SystemFrequency / 1000 1ms中斷一次 * SystemFrequency / 100000 10us中斷一次 * SystemFrequency / 1000000 1us中斷一次 */ // if (SysTick_Config(SystemFrequency / 100000)) // ST3.0.0庫版本 if (SysTick_Config(SystemCoreClock / 1000)) // ST3.5.0庫版本 { /* Capture error */ while (1); } // 我需要不斷的開啟中斷所以這句話遮蔽起來 // SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; }
用中斷模式所以需要在中斷檔案中做定時標誌。一下這個函式在中斷檔案中
<pre name="code" class="cpp">/**
* @brief This function handles SysTick Handler.
* @param None
* @retval : None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
中斷函式在呼叫一個計數函式,計數函式應該放在外面一個公共檔案中方便各個檔案中資料傳遞。
/* * 函式名 :TimingDelay_Decrement * 描述 獲取節拍程式 * 輸入 無 * 輸出 無 * 呼叫 在 SysTick 中斷函式 SysTick_Handler()呼叫 */ void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } }