Systick 部分简单解析
总结:其官方资料在Cortex-M4中:
Systick是一个24位计数器,vlue自减等于0时触发中断,并重新加载load值,如此循环。
SystemCoreClock是时钟频率=168000000,执行SystemCoreClock次tick的时间是1秒。
其官方资料:
int main(void)
{
/* Initialize Leds mounted on STM32F4-Discovery board */STM_EVAL_LEDInit(LED4);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED5);
STM_EVAL_LEDInit(LED6);
/* Turn on LED4 and LED5 */
STM_EVAL_LEDOn(LED4);
STM_EVAL_LEDOn(LED5);
/* Setup SysTick Timer for 1 msec interrupts.
------------------------------------------
1. The SysTick_Config() function is a CMSIS function which configure:
- The SysTick Reload register with value passed as function parameter.
- Configure the SysTick IRQ priority to the lowest value (0x0F).
- Reset the SysTick Counter register.
- Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
- Enable the SysTick Interrupt.
- Start the SysTick Counter.
2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
inside the misc.c file.
3. You can change the SysTick IRQ priority by calling the
NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
call. The NVIC_SetPriority() is defined inside the core_cm4.h file.
4. To adjust the SysTick time base, use the following formula:
Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
- Reload Value is the parameter to be passed for SysTick_Config() function
- Reload Value should not exceed 0xFFFFFF
*/
if (SysTick_Config(SystemCoreClock /1000 ))
{
/* Capture error */
while (1);
}
while (1000)
{
/* Toggle LED3 and LED6 */
STM_EVAL_LEDToggle(LED3);
STM_EVAL_LEDToggle(LED6);
/* Insert 50 ms delay */
Delay(1000 );
/* Toggle LED4 and LED5 */
STM_EVAL_LEDToggle(LED4);
STM_EVAL_LEDToggle(LED5);
/* Insert 100 ms delay */
Delay(1000 );
}
}
/**
* @brief Inserts a delay time.
* @param nTime: specifies the delay time length, in milliseconds.
* @retval None
*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/**
* @brief Decrements the TimingDelay variable.
* @param None
* @retval None
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}