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

作者: liunian__92
上传时间为: 2014-12-11 02:22 PM
2014-12-11
阅读:

系统定时器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->PIO_PER  = (uint32_t)0x00800000;
	PIOC->PIO_OER  = (uint32_t)0x00800000;
	PIOC->PIO_OWER = (uint32_t)0x00800000;
	PIOC->PIO_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->PIO_CODR = (uint32_t)0x00800000;
	else 
	     PIOC->PIO_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->PIO_PER  = (uint32_t)0x00800000;
	PIOC->PIO_OER  = (uint32_t)0x00800000;
	PIOC->PIO_OWER = (uint32_t)0x00800000;
	PIOC->PIO_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(实时时钟)

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示