/**
* @brief Configures the SysTick. 体系时钟装备函数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. 体系时钟中止函数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) 函数的形参便是systick重装定时器的值。
systck计数频率为每秒72000000次,所以72000次便是1/10秒,也便是100ms。
SysTick是1个24bit递减计数器,经过对SysTick操控与状况寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。
SysTick的重装寄存器决议了定时器频率。
若SysTick的时钟源是72M, SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 便是1ms时基。
// 1/1000 s=1ms
关于SysTick校准寄存器的介绍(大多数情况下,咱们能够不用理睬它)
校准值寄存器供给了这样一个解决方案:它使体系即便在不同的CM3产品上运转,也能发生稳定的SysTick中止频率。最简略的作法便是:直接把TENMS的值写入重装载寄存器,这样一来,只需没打破体系极限,就能做到每10ms来一次 SysTick反常。假如需求其它的SysTick反常周期,则能够依据TENMS的值加以份额核算。只不过,在少量情况下,CM3芯片或许无法精确地供给TENMS的值(如,CM3的校准输入信号被拉低),所认为稳妥起见,最好在运用TENMS前查看器材的参考手册。
SysTick定时器除了能服务于操作体系之外,还能用于其它意图:如作为一个闹铃,用于丈量时刻等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。
下面运用 SysTick 发生的 硬件延时函数 延时 dly_ms 毫秒
/*******************************************************************************
* Function Name : SysTickHandler
* Description :体系时钟,一般调教到1MS中止一次
*******************************************************************************/
void SysTick_Handler(void)
{
if(Timer1)
Timer1–;
}
/********************************************
**函数名:SysTickDelay
**功用:运用体系时钟的硬推迟
**注意事项:一般地,不要在中止中调用本函数,不然会存在重入问题.别的假如屏蔽了大局中止,则不要运用此函数
********************************************/
volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)
{
Timer1=dly_ms;
while(Timer1);
}