查看: 1600|回复: 0

​Atmel SAM4S学习笔记(九)--SysTick(系统定时器)

[复制链接]
  • TA的每日心情
    慵懒
    2016-10-17 12:07
  • 签到天数: 306 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-12-11 14:22:47 | 显示全部楼层 |阅读模式
    分享到:

                                                    
    系统定时器SysTick(System Timer):由图9-1可知是ARM Cortex-M 内核里的一个简单的系统节拍计数器,是中断向量控制器NVIC的一个功能。计时器是24位的,从重新加载数值,一直倒计时到0,在下一个时钟沿系统时间重新载入值到寄存器中,并开始时钟倒计时。SysTick一般用于操作系统(如uC/OS),产生滴答信号。当然也可以作为一个普通的定时器来试用。
    图9-2就是SysTick 的寄存器

      
    4个寄存器都是32bit的。
    SYST_CSR
    SysTick控制和状态寄存器(如图9-3)

      
    COUNTFLAG:返回1如果计数器自减到0;
    CLKSOURCE:时钟源选择:1 :选择处理器时钟 0:选择外部时钟
    TICKINT:SysTick 异常请求允许
      0:禁止异常请求  1:允许异常请求
    ENABLE:计时器允许  0:禁止  1:允许
    SYST_RVR
    SysTick 时间重载值寄存器(如图9-4所示)

      
    SysTick使能的时候,当SYST_CVR中的值自减到0的时候,,会将SYST_RVR
    的值重新加载到SYST_CVR寄存器中。
    SYST_CVR
    SysTick当前时间寄存器

      
    可以读取SysTick的当前时间
    SYST_CALIB
    SysTick校准值寄存器

      
    NOREF:No REFerence clock  
      0:无参考时钟  1:有参考时钟
    SKEW:TENMS Value Verification
    0:TENMS值是精确的   1:TENMS值是不精确的,或未给出。
    TENMS:TEN Milliseconds
    系统时钟误差的10ms的重载值。如过这个值是0,则校准值是未知的。
    在这里这是简单的给大家讲了一下SysTick,仅供参考,具体请以数据手册为准。
    下面这个例程是让板子上的LED灯,以间隔一秒的时间亮灭。
    #include "sam4sd32c.h"unsigned int TIME_DELAY=0;int main (void){        SystemInit();//系统初始化        PIOC-&gtIO_PER  = (uint32_t)0x00800000;        PIOC-&gtIO_OER  = (uint32_t)0x00800000;        PIOC-&gtIO_OWER = (uint32_t)0x00800000;        PIOC-&gtIO_SODR = (uint32_t)0x00800000;        SysTick_Config(SystemCoreClock); //设置为 1s 执行一次 SysTick 中断        NVIC_ClearPendingIRQ(SysTick_IRQn);        NVIC_EnableIRQ(SysTick_IRQn);         //在NVIC中使能中断        while(1);}void SysTick_Handler(){        TIME_DELAY++;        if(TIME_DELAY%2==0)             PIOC-&gtIO_CODR = (uint32_t)0x00800000;        else              PIOC-&gtIO_SODR = (uint32_t)0x00800000;}上面那个程序是将控制LED灯的程序放入SysTick 中断中,下面这个程序是使用SysTick做一个延时函数,来实现LED等的闪烁。
    #include "sam4sd32c.h"static volatile unsigned int TIME_DELAY=0;void delay_ms(unsigned int n){  TIME_DELAY = n;  while(TIME_DELAY != 0x00);}int main (void){        SystemInit();//系统初始化        PIOC-&gtIO_PER  = (uint32_t)0x00800000;        PIOC-&gtIO_OER  = (uint32_t)0x00800000;        PIOC-&gtIO_OWER = (uint32_t)0x00800000;        PIOC-&gtIO_SODR = (uint32_t)0x00800000;        SysTick_Config(SystemCoreClock/1000); //设置为 1ms 执行一次 SysTick 中断        NVIC_ClearPendingIRQ(SysTick_IRQn);        NVIC_EnableIRQ(SysTick_IRQn);         //在NVIC中使能中断        while(1)        {                        PIOC->PIO_SODR = (uint32_t)0x00800000;                delay_ms(500);                PIOC->PIO_CODR = (uint32_t)0x00800000;                delay_ms(500);        }}void SysTick_Handler(){   if(TIME_DELAY !=0x00 )        {                TIME_DELAY--;        }}Atmel SAM4S Xplained pro学习笔记(一)-- 开发套件介绍
    Atmel SAM4S 学习笔记(二)-- 开发环境搭建
    Atmel SAM4S 学习笔记(三)-- 示例代码分析
    Atmel SAM4S学习笔记(四)——ASF详解
    Atmel SAM4S学习笔记(五)——GPIO
    Atmel SAM4S学习笔记(六)--CHIPID(芯片编号)
    Atmel SAM4S学习笔记(七)——实时定时器 (RTT)
    Atmel SAM4S学习笔记(八)——RTC(实时时钟)
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-29 17:08 , Processed in 0.125385 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.