注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深海精灵

水里的一滴油,透明地飘零在空气中。。。

 
 
 

日志

 
 
关于我

神秘诡谲,令人费解。可以很执着,也可以很破坏。冰冷,沉默。渴望单纯,渴望自由。躲在文字的背后,用心聆听世界,用直觉洞察世情。

网易考拉推荐

STM32的Systick定时器  

2011-03-16 09:13:12|  分类: Cortex-M3 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统城要一个硬件定时器来产生操作系统需要的滴嗒中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围给予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴嗒定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

  Cortex-M3处理器内部包含了一个简单的定时器。因为所有的Cortex-M3芯片都带有这个定时器,软件在不同Cortex-M3器件间的移植工作得以简化。该定时器的时钟源可以是内部时钟(FCLK),或者是外部时钟(STCLK)。不过STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,需要检视芯片的器件手册来决定选择什么作为时钟源。

  下面介绍STM32中的Systick。Systick部他内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:

                STK_CSR,        0xE000E010  --  控制寄存器
                STK_LOAD,      0xE000E014  --  重载寄存器
                STK_VAL,         0xE000E018  --  当前值寄存器
                STK_CALRB,    0xE000E01C  --   校准值寄存器

SK_CSR控制寄存器(0xE000E010 ):

STM32的Systick定时器 - 深海精灵 - 深海精灵

第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

STK_LOAD  重载寄存器(0xE000E014  ):

STM32的Systick定时器 - 深海精灵 - 深海精灵

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。

STK_VAL当前值寄存器(0xE000E018):

STM32的Systick定时器 - 深海精灵 - 深海精灵

也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

STK_CALRB  校准值寄存器(0xE000E01C):

STM32的Systick定时器 - 深海精灵 - 深海精灵

位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用

位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms

Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

  SysTick定时器除了能服务于操作系统之外,还能用于其它目的,如作为一个闹铃、用于测量时间等。要注意的是,当处理器在调试间被喊停(halt)时,SysTick定时器亦将暂时停运作。

  以下是例程:

/*---------------- 基于外设库V2.0.3 -----------------------------------------------------------------------------------------*/

static vu32 TimingDelay;

void Systick_Configuration(void)  // 定义
{
  SysTick_CounterCmd(SysTick_Counter_Disable); 
  SysTick_ITConfig(DISABLE);
  
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);   HCLK/1,
  SysTick_SetReload(72000);  // 72MHz时,定1ms
  // SysTick_SetReload(32000);  // 32MHz时,定1ms
 
  SysTick_ITConfig(ENABLE);
}

void SysTickHandler(void)  // 中断程序
{
  if (TimingDelay != 0x00)  // TimingDelay 为全局变量
   TimingDelay--;
}


void Delayms(u32 mtime)  // 延时mtime毫秒
{
  SysTick_CounterCmd(SysTick_Counter_Enable);
  TimingDelay = mtime;
  while(TimingDelay != 0);
  SysTick_CounterCmd(SysTick_Counter_Disable);
  SysTick_CounterCmd(SysTick_Counter_Clear);
}

  在V3.0.0外设库移除了SysTick的驱动,CMSIS提供了一个SysTick设置的函数,替代了原有SysTick驱动的全部函数。该函数设置了自动重载入计数器LOAD的值,IQR的优先级,复位了计数器VAL的值,开始计数并打开IRQ中断。SysTick时钟默认使用系统时钟。

  例程:SysTick_Config(SystemFrequency/1000);

 

  评论这张
 
阅读(852)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017