CM3、CM4的内核中都有个24位的SysTick定时器。这两个MCU里边的SysTick大同小异。SysTick的介绍可以参考:(来自CSDN博客的参考)或者(来自百度文库的参考)或者参考《CM3权威指南》这个书。在ST的参考手册中没有SysTick的介绍。因为它是属于内核的东西。

这个实验是使用Systick中断方式做延时定时器。主要目的是熟悉下SysTick的使用。

首先,定义个延时函数,目的是计数

void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
} void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}

其中TimingDelay_Decrement是供SysTick的中断响应函数调用的。每次调用就将TimingDelay减少1,知道0为止.

Delay函数就是一直等着TimingDelay 减到0.

然后配置SysTick定时器。使用系统函数

SysTick_Config(SystemCoreClock/1000);

这个函数打开了SysTick的中断,同时也设置了Systick的重装载寄存器。SystemCoreClock/1000既是系通时钟频率的千分之一。也就是说没每秒钟,Systick寄存器会装满1000次,每次1ms。这就是计时的基础单位了。当重装载寄存器装满时,就会产生Systick中断,之后我们就在中断函数中处理TimingDelay这个标量了。

在文件stm32F4xx_it.c中添加一点Systick的中断处理函数:

extern void TimingDelay_Decrement(void);

void SysTick_Handler(void)
{
TimingDelay_Decrement();
}

这样,延时函数就配置好了。

在main函数中的用法:

int main(void)
{
。。。。。。 if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
} while (1)
{
Delay(500);
GPIO_WriteBit(GPIOG,GPIO_Pin_13,Bit_SET);
Delay(500);
GPIO_WriteBit(GPIOG,GPIO_Pin_13,Bit_RESET);
}
}

这里的不足之处是你不管使用没有,SysTick总是会反复地产生中断,消耗了一些MCU的资源。当然,如果SysTick用在OS中,作为OS的心跳,这个中断是免不了的。

用SysTick做的延时计时器的更多相关文章

  1. 基于Systick系统时钟延时的LED闪烁灯

    1.回顾我们的51 单片机编程,当我们需要做系统延迟的时候,最常采用的一种方式就是使用for 循环的空语句等待来实现. 当然,在STM32 里面也可以这么实现.但是在STM32 的Cortex 内核里 ...

  2. EasyDarwin做转发延时太大?

    很多人反映,在用EasyDarwin做流媒体转发服务时,延时太大,实际Darwin在转发模块中,有一个控制转发Buffer时间的配置reflector_buffer_size_sec,我们将这个配置改 ...

  3. 使用系统定时器SysTick实现精确延时微秒和毫秒函数

    SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...

  4. STM32学习及应用笔记一:SysTick定时器学习及应用

    这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...

  5. 延时函数出错,volatile一例

    莫名其妙的错误.使用Systick做的延时. 初始化是这样的: //SysTick配置 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); if ...

  6. SYSTick 定时器

        CM3 内核的处理器,内部包含了一个 SysTick 定时器,(SysTick 的时钟源自 HCLK 的 8 分频,8个系统时钟周期systick跳一个,即8*1/72M=1/9 us)Sys ...

  7. stm32的systick原理与应用

    /* SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟.无论用作延时还 ...

  8. 用Python和摄像头制作简单的延时摄影

    “延时摄影(英语:Time-lapse photography)是以一种较低的帧率拍 下图像或者视频,然后用正常或者较快的速率播放画面的摄影技术.在一段延时摄影视频中,物体或者景物缓慢变化的过程被压缩 ...

  9. 【QT】计时器制作

    应小伙伴的要求,做一个小计时器.功能是点击开始就从00:00:00开始计时,点击暂停就暂停计时,点击停止就停止计时. 界面如上图,使用ui设计师直接拖的.按钮和图标的图片都是网上下载的.用美图秀秀抠成 ...

随机推荐

  1. 第一篇博文,整理一下关于Mac下安装本地LNMP环境的一些坑

    安装的主要步骤是按照以下这篇文章进行的http://blog.csdn.net/w670328683/article/details/50628629,但是依然遇到了一些大大小小的坑(一个环境搞了一天 ...

  2. 【转】Native JavaScript Data-Binding

    原文转自:http://www.sellarafaeli.com/blog/native_javascript_data_binding Two-way data-binding is such an ...

  3. Implement Trie (Prefix Tree)

    Trie 树实现 Implement a trie with insert, search, and startsWith methods. class TrieNode { public: // I ...

  4. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

  5. Oracle_12c_RAC_service_died问题分析处理

    接上篇,通过分析listener日志发现rac1数据库无法连接时出现了listener_20160628.log:28-JUN-2016 07:55:47 * service_died * LsnrA ...

  6. 网站统计中的数据收集原理及实现(share)

    转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...

  7. jquery怎么获取radio选中的值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. FTP弱口令猜解【python脚本】

    ftp弱口令猜解 python脚本: #! /usr/bin/env python # _*_ coding:utf-8 _*_ import ftplib,time username_list=[' ...

  9. 初识Linux-4

    1,文件系统,从/开始的树状结构 2,绝对路径:/打头,相对路径:从当前目录下开始的 3,usename,passwd,uid,gid,home,shell(都是管理员指定的,这些信息都在passwd ...

  10. Apache2 部署 Django

    环境: debian8 apache2.4.10                    #请注意自己的apache版本,不同版本配置文件结构差异很大 django1.10 python3.4 默认ap ...