一、准备工作:

     将上一节搭建的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. OpenGl入门——视口及物体移动函数

    大学的时候有个选修课,要用OpenGl,很初级的内容,同样入门的学弟学妹适用 推荐个学习的资料NeHe的OpenGl教程,很完整而且有示例,讲的很明白.比某些破书好. 可以配合那本所谓的“红宝书”看看 ...

  2. 九度OJ 1019 简单计算器 -- 2006年浙江大学计算机及软件工程研究生机试真题

    题目地址:http://ac.jobdu.com/problem.php?pid=1019 题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: ...

  3. @font-face

     /**  * jQuery.hhNewSilder 滚动图片插件  * User: huanhuan  * QQ: 651471385  * Email: th.wanghuan@gmail.com ...

  4. demo_08webStroage案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 批量执行sql语句

    基本使用 $sqls="sql语句1;sql语句2;sql语句n"; 或 $sqls="insert into xx;";  $sqls.="inse ...

  6. 前端工程的构建工具对比 Gulp vs Grunt

    1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...

  7. Android使用adb工具及root权限完成手机抓包

    1.环境准备/注意: 手机要求已经root. 首先需要配置JDK环境变量,这里主要讲解抓包,JDK环境变量配置跳过. 将包内附带的adb.zip解压到C盘根目录.  整个操作过程都需要用手机用数据线连 ...

  8. VS2015安装开发ios android

    前几天很火,装了一下,结果是不是太满意,装了VS2015只是多了一个android和ios的模版,最终还是要装xamarin ,最后装了个xamarin ,然后破解 破解地址:http://www.c ...

  9. 密室经典逃脱N部--考验你的智力!据说全球没几人走出去!不要看攻略!【工作之余也来休闲一下】

    密室经典逃脱N部-考验你的智力!据说全球没几人走出去!不要看攻略![工作之余也来休闲一下] 更多经典逃脱尽在:点击进入更多经典逃脱 测试你的反映速度:躲避小红球 测试你对鼠标的控制力 叫美女起床 ↓↓ ...

  10. 黑马程序员-------.net基础知识一

    一 初识.net  .net是一种多语言的编程平台,可以用多达几十种的语言来进行开发,而C#就是基于.net平台的其中一种开发语言. 它的特点是: ⒈多平台:该系统可以在广泛的计算机上运行,包括从服务 ...