[原创] STM32时间基准

楞伽山人   2013-11-30 13:44 楼主
这次主要是想写下时间基准(SysTick),我们在做控制的时候,经常会需要一个时间基准,通常都是通过一个定时器来产生的,而M0的芯片自己已经有一个用于产生时间基准的东西:Systick,这样就可以不浪费定时器。
使用Systick,现在固件库做的让我们使用起来更简单了,只需要SysTick_Config(X)函数就可以了,其中X为定时中断的分频因素(呵呵,暂时就这样叫了),用了这句后,Systick的计数器寄存器就被复位,同时使能了Systick中断并开始使能了Systick计数器。
在手册中,有这样的一句话:SysTick 校准值设置为6000 ,  当SysTick 时钟设置为6  MHz  (fHCLK/8 的最大值) 时,会产生
1ms 时间基准。所以有如下的初始化产生1ms的定时中断。
void Systick_Init(void)
{
  if (SysTick_Config(SystemCoreClock / 1000))//1ms            
  {
    while (1);
  }
}
在中断函数stm32f0xx_it.c中,加入下面的函数,进行1ms减1的操作:
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
如果要想比较准确的延时,比如延时N毫秒,新建一个systick.c文件,包含以下函数:
void Delay_ms(int nTime)
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}
这样就完成了延时N毫秒的程序。
为了验证,我在主程序中加入下面几句:(其中RCC_Configuration();  GPIO_Configuration();在前面的笔记中写过,不详细介绍了。
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
Systick_Init();
    while(1)
{
  LED0_ON();
  Delay_ms(1000);
  LED0_OFF();
  Delay_ms(1000);
}
}
此时可以看到LED4蓝色发光二极管亮1秒,然后熄灭1秒,如此反复闪烁。

写到这,那么SystemCoreClock 是什么东西呢?
其实在system_stm32f0xx.c中已经有这样的定义:uint32_t SystemCoreClock    = 48000000;也就是48MHz

回复评论 (1)

不错,stm比pic缺点就是定时的问题,给调试带来不少的疑虑,比如运行一个子程序耗用了多长时间呢?在MPLAB IDE里显而易见,但IAR里就不行了!
点赞  2013-11-30 17:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复