一、准备工作:

     将上一节搭建的LED工程复制一份,命名为“2.systick”。这一节主要讲如何使用系统的SysTick节拍定时器来进行精准延时程序。

二、程序编写:

SysTick是CM3/CM4内核芯片提供的一个定时器,我们的板子使用的SAM4N芯片是CM4内核的,自然少不了这个定时器。

首先在Drivers文件夹中建立delay.c和delay.h文件并添加到工程中,在delay.c中写入如下代码:

#include "delay.h"

uint32_t timeout=0;

/**************************************************************************

* 函数名:SysTick_Handler()

* 参数  :void

* 返回值:void

* 描述  :系统节拍中断服务函数

**************************************************************************/

void SysTick_Handler(void)

{

/*定时计数自减1*/

    timeout--;

}

/**************************************************************************

* 函数名:systick_hw_init()

* 参数  :void

* 返回值:void

* 描述  :系统节拍初始化函数

**************************************************************************/

void systick_hw_init(void)

{

//选择系统节拍定时器的时钟源为系统内核时钟

SysTick->CTRL|=0x01<<2;

//设置重装值,配置系统节拍定时器为1ms中断一次

/*1ms <-->SystemCoreClock/1000

* 100us <-->SystemCoreClock/10000

* 10us <-->SystemCoreClock/100000

*/

SysTick->LOAD = SystemCoreClock/1000 - 1;

//使能系统节拍时钟中断

SysTick->CTRL|=0x02;

//使能系统节拍时钟

SysTick->CTRL|=0x01;

}

/**************************************************************************

* 函数名:delay_ms()

* 参数  :uint32_t n  延时的毫秒数

* 返回值:void

* 描述  :使用系统节拍进行精准延时函数

**************************************************************************/

void delay_ms(uint32_t n)

{

   timeout = n;        //设置系统节拍延时

   while(timeout!=0);      //等待延时时间到

}

/**************************************************************************

* 函数名:delay()

* 参数  :uint32_t n  延时的循环个数

* 返回值:void

* 描述  :简单的循环延时函数

**************************************************************************/

void delay(uint32_t n)

{

while(n--);

}

虽然注释已经写得很清楚了,但还是讲一下吧,主要是systick_hw_init函数,这是初始化配置SysTick的代码,第一步先选择SysTick的时钟源,这里我选择使用系统内核时钟作为时钟源;第二步是设置SysTick的Load值,这里设置为ystemCoreClock/1000 - 1;,这样SysTick就会每毫秒中断一次,最后是开启中断和使能SysTick。

延时主要是通过设定timeout的值,然后等待timeout为0,在Systick中断中,timeout会自减1,直到为0。这样就实现了ms级的精准延时函数delay_ms()。

在delay.h中主要写写函数声明,如下:

#ifndef __DELAY_H

#define __DELAY_H

#include "sam4n16c.h"

/**************************************************************************

* 函数名:SysTick_Handler()

* 参数  :void

* 返回值:void

* 描述  :系统节拍中断服务函数

**************************************************************************/

void SysTick_Handler(void);

/**************************************************************************

* 函数名:systick_hw_init()

* 参数  :void

* 返回值:void

* 描述  :系统节拍初始化函数

**************************************************************************/

void systick_hw_init(void);

/*************************************************************************

* 函数名:delay_ms()

* 参数  :uint32_t n  延时的毫秒数

* 返回值:void

* 描述  :使用系统节拍进行精准延时函数

**************************************************************************/

void delay_ms(uint32_t n);

/**************************************************************************

* 函数名:delay()

* 参数  :uint32_t n  延时的循环个数

* 返回值:void

* 描述  :简单的循环延时函数

**************************************************************************/

void delay(uint32_t n);

#endif

接下来把main.c中的delay改掉,如下:

int main(void)

{

systick_hw_init();

led_hw_init();

while(1){

led_hw_on();

delay_ms(500);

led_hw_off();

delay_ms(500);

}

}

好了,下载程序到板子,这下是不是延时很准?

[SAN4N学习笔记]使用SysTick精准延时的更多相关文章

  1. stm32学习笔记之SysTick的思考

    原文来自--SevenZ的笔记.http://blog.21ic.com/user1/8247/archives/2011/85920.html ? 首先我们要明白什么是SysTick定时器? Sys ...

  2. STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)

    系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...

  3. STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时

    前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...

  4. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  5. 操作系统学习笔记(五)--CPU调度

    由于第四章线程的介绍没有上传视频,故之后看书来补. 最近开始学习操作系统原理这门课程,特将学习笔记整理成技术博客的形式发表,希望能给大家的操作系统学习带来帮助.同时盼望大家能对文章评论,大家一起多多交 ...

  6. 【工作笔记】BAT批处理学习笔记与示例

    BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...

  7. 学习笔记-----Android的View绘制过程

    边看源码边参考别人的博客等,做一下学习笔记. 要了解View的绘制,首先得知道View树的结构:(可以参考http://blog.csdn.net/qinjuning/article/details/ ...

  8. spark学习笔记总结-spark入门资料精化

    Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...

  9. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

随机推荐

  1. nginx详细配置文件 (转)

    Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能:还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑 ...

  2. Linux 内核学习的经典书籍及途径

    from:http://www.zhihu.com/question/19606660 知乎 Linux 内核学习的经典书籍及途径?修改 修改 写补充说明 举报   添加评论 分享 • 邀请回答   ...

  3. 【收集整理】Linux下的目录讲解

    Linux下的目录介绍:在Linux系统中,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始.以文件来表示所有逻辑实体和非逻辑实体,逻辑实体指文件和目 ...

  4. em,pt和px之间的换算

    任意浏览器的默认字体高度16px(16像素).所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的b ...

  5. MarkDown教程

    MarkDown笔记 在线编辑器其他教程 [1.标题] 标题1 标题1=== 标题2 标题2--- 标题3 1 2 3 4 5 6 7 7 #1 ##2 ###3 ####4 #####5 ##### ...

  6. 禁止选择文本和禁用右键 v3.0

    禁止选中字体(注:在火狐浏览器没有起到效果作用) <script> function disableselect(e) { var omitformtags = ["input& ...

  7. php 接口 implements 使用

    主要对类名,类所拥有的方法,以及所传参数起约束和规范做用,感觉跟php abstract 抽象类又有点像. 一,接口的定义和调用 <?php interface face1 { const pa ...

  8. 读《CSCW的一种建模与实现方法》

    这篇论文为我们描述了作者构建的一种基于交互.活动.协作三层结构的协同工作模型,并提出了一种采用“镜头焦点”和“自由交互”相结合的协作模型实现方法. 计算机支持的协同工作就是利用计算机技术将时间上分离. ...

  9. hibernate配置文件详细解释

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  10. 注解方式传LIST@RequestBody

    在SpringMVC中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解 //创建文件夹 @RequestMapping(value=" ...