热度 7
2012-5-18 20:57
3367 次阅读|
1 个评论
/** * @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); } 科技成就生活,创新源自智拓 www.ourjcdz.com