预备知识:

对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率。

SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000。
SysTick计数时间的计算:t=重装载值*1/AHB时钟频率。1/AHB时钟频率即是计数一次的时间。一般把重装载值定为128000000/100000=1280,则10us中断一次;一般不设置为1us中断一次,这样中断频率太高,偏移了程序重心。

正文:

程序源码:

在main.c中

#include "sys.h"
#include "led.h" // "__IO"在Core_cm4.h中被重定义,原型是"volatile" ①
__IO uint32_t TimingDelay; // 延时函数
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
} // 主函数
int main(void)
{
// 初始化LED端口
LED_Init();
// 初始化SysTick ②
if(SysTick_Config(SystemCoreClock/1000))
{
// Capture error
while(1);
}
// LED闪烁
while(1)
{
Delay(250); GPIO_SetBits(GPIOF,GPIO_Pin_9);
Delay(250); GPIO_ResetBits(GPIOF,GPIO_Pin_9);
}
} /*------------------------------------------------------------------------------------
注释:
①:volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。
写一段测试代码如下:
u8 test;
test = 1;
test = 2;
test = 3; 设置优化级别中级
运行后test会被直接取值为3 只有最后一个语句被编译 如用volatile:
volatile u8 test;
test = 1;
test = 2;
test = 3;
则所有语句都会被编译。test先后被设置成1、2、3
由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。
②:SysTick_Config的参数,是一个时钟次数,叫systick重装定时器的值。意思就是多少个
1/fosc 时间后中断一下。
这里 SystemCoreClock/1000 为没过1ms中断一次,SystemCoreClock为系统时钟频率。
计算方法为:
SystemCoreClock ÷ timer = 1ms
假设SystemCoreClock为128M,单位为Hz。则:
1ms = 1128MHz ÷ timer
= 128M/s ÷ timer 128M
------
timer = 1s
------
0.001s 128M
timer = ------
1000 ------------------------------------------------------------------------------------*/

在stm32f4xx_it.c中

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h" /* 变量定义 ------------------------------------------------------------------*/
// 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数
extern __IO uint32_t TimingDelay; /**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{ if(TimingDelay != 0x00)
{
TimingDelay--;
}
}

注意:

1.在stm32中,中断函数在stm32f4xx_it.c中,不能像51那样写在main.c文件下。

2.关键字extern拓展变量作用范围的用法。

3.__IO == volatile

参考资料:

https://blog.csdn.net/u010834669/article/details/80204195

利用滴答定时器(SysTick)实现简单的延时函数的更多相关文章

  1. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  2. Cortex-M0系统滴答定时器Systick详解

    上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...

  3. STM32 的系统滴答定时器( Systick) 彻底研究解读

    作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...

  4. STM32之系统滴答定时器

    一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...

  5. HAL库与Cubemx系列|Systick-系统滴答定时器详解

    Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...

  6. uCOS的软件定时器、uCOS时钟节拍和滴答定时器的关系

    uCOS2.81后的版本中有软件定时器的概念,如果要开启定时器任务,需要在OS_CFG.H文件中 #define  OS_TMR_EN                 1 软件定时器其实跟硬件中断是相 ...

  7. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  8. STC51几种简单的延时函数

    STC51几种简单的延时函数 ,* 延时子程序 * * * ********************************************************************** ...

  9. STM32 - SYSTICK(系统滴答定时器)

    SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...

随机推荐

  1. Typora使用Gitee图床

    前言 现在比较流行的Markdown编辑器应该是Typora,但是Typora本身不支持本地上传图片的云端存储,所以当我们写博客的时候,需要上传图片,就得自己设置图床,今天给大家推荐一款免费的图床-G ...

  2. Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel

    Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...

  3. MATLAB—信号与系统中的应用

    文章目录 一. 理论知识 1.线性系统的响应 2.微分方程的解 Ⅰ.经典解 Ⅱ.完全响应 3.零输入响应 4.零状态响应 5.冲激响应 6.阶跃响应 7.卷积求零状态响应 二.连续信号的MATLAB描 ...

  4. SpringBoot启动标识修改

    在src/main/resources下新建一个banner.txt ${AnsiColor.BRIGHT_RED} ///////////////////////////////////////// ...

  5. 深入浅出Mybatis系列(五)---配置详解之settings设置

    settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...

  6. hive -- 外部表、内部表、临时表

    1.外部表 关键字:EXTERNAL 外部表创建时需要指定LOCATION 删除外部表时,数据不被删除 CREATE EXTERNAL TABLE page_view(viewTime INT, us ...

  7. 区间k大数训练

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  8. transient用法

    1 import java.io.FileInputStream; 2 import java.io.FileNotFoundException; 3 import java.io.FileOutpu ...

  9. kettle 查询 tinyint 值为 Y,kettle 查询 tinyint 为布尔值

     问题解决方法 1.在数据库连接中的[选项]命令参数中加入:tinyInt1isBit = false,如下图: 实际场景:

  10. 常见面试题:java8有什么新特性?

    常见面试题:java8有什么新特性? 主要有以下这些新特性: lambda 表达式,经常配合函数式接口使用,可以有效减少代码量 Runnable 是一个函数式接口,下面展示了创建线程三种写法,显然最后 ...