原创 STM32 SysTick 系统时钟 超简易定时器SysTick

2012-5-18 20:57 3366 6 7 分类: 工程师职场

/**
* @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);
}

科技成就生活,创新源自智拓

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1605777 2011-7-12 14:27

谢谢分享可以啊
相关推荐阅读
用户566234 2012-05-29 11:47
MSP430仿真器
  特别声明:ZT-FET430UIF为智拓科技仪器最新开发的产品,电路为原装TI电路,无进行任务删减更改,主要为了能保证产品的可靠性和完整性,现在网上有很多价格便宜的产品都经过了电路的...
用户566234 2012-05-29 11:47
MSP430 BSL编程方式
MSP430有三种编程方式,JTAG,BSL或SBW程序,这三种编程方式各有各的优点。JTAG的优势在于速度快,如果要加密就必须使用JTAG方式。一旦加密后JTAG就不能在访问芯片了,这时如果要更...
用户566234 2012-05-21 14:43
超声波测距器的设计
超声波测距器在汽车倒车,建筑工地和一些工业现场有着很广泛的用途。其测量范围0.10~4.0 m,测量精度可高达1 cm左右  本设计采用新型8051控制器c8051...
用户566234 2012-05-18 21:37
单片机MSP430F5438学习笔记
通过430一年的学习遇到的很多问题,也收获了很多,以下是学习中遇到的一些问题,和解决方法,还有很多没有整理出来,慢慢整理中。。。。 一、多源中断问题 #pragma vector = POR...
用户566234 2012-05-18 21:01
MDK中STM32无法用printf()的问题
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,但是把.hex文件烧写进板子后却发现串口接收不到任何数据。用Keil仿真是,串口可以正确的输出。有点纳闷,然后调用...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条