打印
[应用相关]

学习STM32,必学滴答定时器

[复制链接]
2165|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 powerful1 于 2015-2-26 21:37 编辑

一个正常运行的电路系统需要一个时基,这个时基就好似人的心脏。在STM32系统中,充当这个时基的东东,我们称之为“系统滴答定时器”,英文名为Systick Time.
我们在51系列芯片的编程中,通常会用到延时函数,当时我们是用死循环来达到这个效果的,在STM32电路系统里面,我们就可以用Systick Time这个模块达到更胜一筹,精确延时的目的。这个模块即使在系统睡眠的时候也是工作的,这样可以用之做一个系统闹钟或者是实现待机唤醒这个功能。
那么如何使用这个模块呢?
这个模块就是一个简单的倒计时器,对于它,有三个常用的寄存器
Ø  CTRL 控制状态寄存器
Ø  LOAD重装载寄存器
Ø  VALUE当前数值寄存器

CTRL


Ø  BIT0  对其写1,使能定时器
Ø  BIT1  对其写1,开启中断,如果保持默认值则无动作
Ø  BIT2  该模块的时钟源,对其写1用内核时钟(FCLK CORTEX);对其写0,用外部时钟;默认为外部时钟(从系统时钟过来的)
Ø  BIT16  是标志位,当CNT=0,该位硬件置1;当CNT不等于0,该位为0。该位读取后,自动清零,属于读取自动清零。


可以对其进行赋值,但是赋值不一定立马奏效,当CNT为0时,所赋值流入该寄存器,同时以该值为到计数的起点。

VALUE
读取时返回当前倒计数的值;写之则清零该寄存器,同时还会清除在CTRL
的标志位。
下面写一段代码,作为本节的结尾。
void delay_init()         
{
   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  //选择外部时钟  HCLK/8即为9M的时钟
  fac_us=SystemCoreClock/8000000;                                      
  //每个us需要的systick时钟数  
  fac_ms=(u16)fac_us*1000;                                               
  //每个ms需要的systick时钟数   
}
void delay_us(u32 nus)
{
  SysTick->VAL=0X00;                    //清空计数器
  SysTick->LOAD=nus*fac_us;            //初始值加载
  SysTick->CTRL|=0X01;                  //ENABLE,开始计数
  while(!(SysTick->CTRL>>16));     //等待标志位为1  
  SysTick->CTRL&=0X00;                  //关闭计数器
}

沙发
energy1| | 2015-2-26 23:01 | 只看该作者
这个滴答时钟在学习STM32时确实很重要

使用特权

评论回复
板凳
sting_yang| | 2015-2-27 01:22 | 只看该作者
不止stm32,只要是m0、m1、m3、m4,不论厂牌,都很重要

使用特权

评论回复
地板
grant_jx| | 2015-2-27 09:08 | 只看该作者
Systick只是个基本定时器,倒没做到心脏的地步。
当它是普通定时器就好,有ROTS的时候,可以较为方便的提供一个定时器,不占用其它功能定时器。

使用特权

评论回复
5
搞IT的| | 2015-2-28 18:29 | 只看该作者
定时器确实很重要,这个必须掌握啊

使用特权

评论回复
6
小浣熊| | 2015-2-28 22:56 | 只看该作者
顶一个!!!

使用特权

评论回复
7
songzhige| | 2015-2-28 23:25 | 只看该作者
必须赞一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

430

帖子

4

粉丝