你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

学习STM32,必学滴答定时器

[复制链接]
党国特派员 提问时间:2015-1-4 23:07 /
     一个正常运行的电路系统需要一个时基,这个时基就好似人的心脏。在STM32系统中,充当这个时基的东东,我们称之为“系统滴答定时器”,英文名为Systick Time.
我们在51系列芯片的编程中,通常会用到延时函数,当时我们是用死循环来达到这个效果的,在STM32电路系统里面,我们就可以用Systick Time这个模块达到更胜一筹,精确延时的目的。这个模块即使在系统睡眠的时候也是工作的,这样可以用之做一个系统闹钟或者是实现待机唤醒这个功能。
那么如何使用这个模块呢?下面这个文档进行了,详细的介绍。

这个模块就是一个简单的倒计时器,对于它,有三个常用的寄存器

Ø  CTRL 控制状态寄存器
Ø  LOAD重装载寄存器
Ø  VALUE当前数值寄存器

CTRL
BIT16                                                                                     BIT2         BIT1      BIT0
  
FLAG
  














0/1
ENABLE

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

LOAD
BIT23                                                                                                                    BIT0
  
  



















可以对其进行赋值,但是赋值不一定立马奏效,当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;                  //关闭计数器
}

收藏 1 评论2 发布时间:2015-1-4 23:07

举报

2个回答
flintlovesam 回答时间:2015-1-4 23:57:39
楼主讲解的很到位
巅峰残狼 回答时间:2015-1-5 09:05:53
通俗易懂,适合初学者理解

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版