利用滴答定时器(SysTick)实现简单的延时函数
预备知识:
对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率。
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)实现简单的延时函数的更多相关文章
- 系统滴答定时器(SysTick)中断配置
系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...
- Cortex-M0系统滴答定时器Systick详解
上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...
- STM32 的系统滴答定时器( Systick) 彻底研究解读
作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...
- STM32之系统滴答定时器
一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...
- HAL库与Cubemx系列|Systick-系统滴答定时器详解
Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...
- uCOS的软件定时器、uCOS时钟节拍和滴答定时器的关系
uCOS2.81后的版本中有软件定时器的概念,如果要开启定时器任务,需要在OS_CFG.H文件中 #define OS_TMR_EN 1 软件定时器其实跟硬件中断是相 ...
- 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)
/** ****************************************************************************** * @file main.c * ...
- STC51几种简单的延时函数
STC51几种简单的延时函数 ,* 延时子程序 * * * ********************************************************************** ...
- STM32 - SYSTICK(系统滴答定时器)
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...
随机推荐
- eclipse选中参数高亮显示设置
window - preference - java - Editor - Mark Occurrences
- 通过白码SQL数据库对接功能改进原系统
前言: 之前提到过之所以要使用数据库对接功能,就是因为原有系统上有些功能存在不完善甚至不好用的情况,需要二次开发来优化业务流程或是直接用白码用户端上的通用功能.对接了之后就不需要再写代码来搭建或者优化 ...
- Spring Boot Mybatis注解:@Mapper和@MapperScan
使用@Mapper注解 添加了@Mapper注解之后这个接口在编译时会生成相应的实现类,让其他的类进行引用 @Mapper public interface EmpMapper { public Li ...
- tcphdr结构
包含在/usr/src/linux/include/linux/tcp.h 1 struct tcphdr { 2 __be16 source; 3 __be16 dest; 4 __be32 seq ...
- Contos 7.x 中Docker安装以及使用
Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, 然 ...
- RibbitMQ 实战教程
# RabbitMQ 实战教程 ## 1.MQ引言 ### 1.1 什么是MQ `MQ`(Message Quene) : 翻译为 `消息队列`,通过典型的 `生产者`和`消费者`模型,生产者不断向消 ...
- Java锁--Lock实现原理(底层实现)
关于java lock的底层实现原理,讲的有点深,转载学习! 转载自 https://blog.csdn.net/Luxia_24/article/details/52403033 Lock完全用Ja ...
- 基于mysql的sakila数据库脚本分析
本例是基于mysql的sakila数据库脚本的复杂查询分析,大家可以去mysql官网上下载此脚本:也可以进入我的资源页进行下载: 关系图如下: 下面是查询的案例: 1.查询某部电影的所属类别,语言 S ...
- c++制表符
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 //制表符是8个字符,当在一个制表符开始的位置(明白什么位置是 ...
- Servlet的特点及运行过程