微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何设置STM32时间基准SysTick

如何设置STM32时间基准SysTick

时间:10-02 整理:3721RD 点击:

在做控制的时候,经常会需要一个时间基准,通常都是通过一个定时器来产。
但是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

不错不错,stm和pic相比,stm的缺点就是定时的问题,会给调试带来不少的疑虑,
比如运行一个子程序耗用了多长时间呢?在MPLAB IDE里显而易见,但IAR里就不行了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top