党国特派员 发表于 2015-1-4 23:07:26

学习STM32,必学滴答定时器

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

这个模块就是一个简单的倒计时器,对于它,有三个常用的寄存器
ØCTRL 控制状态寄存器ØLOAD重装载寄存器ØVALUE当前数值寄存器
CTRLBIT16                                                                                     BIT2         BIT1      BIT0
FLAG













0/1ENABLE

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

与非朋 发表于 2015-1-4 23:57:39

楼主讲解的很到位

巅峰残狼 发表于 2015-1-5 09:05:53

通俗易懂,适合初学者理解
页: [1]
查看完整版本: 学习STM32,必学滴答定时器