社区导航

 
查看: 1278|回复: 1

[原创] STM32时间基准

[复制链接]

148

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-11-30 13:44:16 | 显示全部楼层 |阅读模式
这次主要是想写下时间基准(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
此帖出自stm32/stm8论坛


回复

使用道具 举报

587

TA的帖子

2

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2013-11-30 17:13:09 | 显示全部楼层
不错,stm比pic缺点就是定时的问题,给调试带来不少的疑虑,比如运行一个子程序耗用了多长时间呢?在MPLAB IDE里显而易见,但IAR里就不行了!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-15 19:10 , Processed in 0.091678 second(s), 16 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表