一、准备工作:

     将上一节搭建的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. eclipse下使用java调用weka(转)

    原文链接:http://blog.csdn.net/felomeng/article/details/4688257 weka是很好用的机器学习库,这里就不详细介绍了. 言归正传,要使用程序方式使用w ...

  2. Vivado Launching SDK "Importing Hardware Specification" error的解决方法

    解决方法是通过参考http://forum.digilentinc.com/topic/611-vivado-launching-sdk-importing-hardware-specificatio ...

  3. [Caffe] ubuntu14.04下使用OpenBLAS加速Caffe

    一.apt安装 sudo apt-get install libopenblas-dev 二.手动从source安装 1. 下载OpenBLAS并编译 git clone https://github ...

  4. c++与C# winform的消息通讯--(结构体与byte数组的使用)

    近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 b ...

  5. (WinForm)FormBorderStyle属性

    此属性就是获取或设置窗体的边框样式,默认值为 FormBorderStyle.Sizable.共7个值. 属性 意义 None 无边框 FixedSingle 固定的单行边框 Fixed3D 固定的三 ...

  6. jquery右下角返回顶部

    实现的效果也就是,当有滚动条是,滚动条未动或与顶部距离小于多少像素是,返回顶部按钮处于隐身状态,当滚动条与顶部距离大于一定像素时,返回顶部按钮出现,实现点击‘返回按钮’后,从当前位置回到等不位置.要先 ...

  7. linux重新增加硬盘容量

    1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...

  8. torch7在mac上的安装

    在安装torch7的时候,一开始一直参考的是官方的文档: http://torch.ch/docs/getting-started.html#_ 但是无论怎么装都无法成功,主要是卡在了source那一 ...

  9. C#winform程序安装时自动卸载新版本覆盖旧版本

    vs2005为winform程序做的安装包.在以有程序旧版本的机子上用新版本的安装包安装软件时提示  “以经安装该产品的另一个版本.无法继续安装此版本........” 在安装部署项目中设“Remov ...

  10. 【web安全】第一弹:利用xss注入获取cookie

    首先一定要先来吐槽一下tipask系统.这是一枚开源的类似百度知道的系统,但是漏洞多多,最基本的XSS注入都无法防御. 言归正传: [准备1] cookie接收服务器. 平时喜欢用sae,所以在sae ...