2789|1

90

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32时间基准 [复制链接]

这次主要是想写下时间基准(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论坛

最新回复

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

回复
举报

676

帖子

5

TA的资源

纯净的硅(初级)

沙发
 
不错,stm比pic缺点就是定时的问题,给调试带来不少的疑虑,比如运行一个子程序耗用了多长时间呢?在MPLAB IDE里显而易见,但IAR里就不行了!
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表