Systick 延时函数详解

发布者:朱雀最新更新时间:2018-07-20 来源: eefocus关键字:Systick  延时函数 手机看文章 扫描二维码
随时随地手机看文章

void delay_init(u8 SYSCLK)

{

SysTick->CTRL&=0xfffffffb;


fac_us=SYSCLK/8;

fac_ms=(u16)fac_us*1000;

}


Systick主要的作用就是拿来计时,其原理和应用简述一下就是这样的:通过配置寄存器SysTick->CTRL来设定Systick的计时频率并Enable使Systick开始计数,这里的SysTick->CTRL&=0xfffffffb应该很好理解,把第2位设定为0,查找应用手册可以知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。


假定我们板子默认的晶振频率是8Mhz,默认CPU工作频率(SYSCLK)是9倍频,即72M,那Systick的频率就是72/8=9Mhz。


知道了Systick的频率,下一步就是确定倒时计数器的数值,即SysTick->LOAD这个寄存器的配置。上面已经知道了,Systick的工作频率F=9Mhz=SYSCLK/8,即每秒钟计数器自减900万次,也就是说,SYSCLK/8次的自减耗时1秒,那么(8/SYSCLK)/1000,000次自减就耗时1微秒了,这也就是fac_us的值了。那么上面函数中的fac_us为什么是SYSCLK/8呢?这里先搞清楚一点,函数中SYSCLK的单位是Mhz,所以SYSCLK的值是72(这个以Mhz为单位应该是STM32基础库里面做过宏定义的),否则也不可能用一个8位整形去表示一个7200万的数值;而我们这里计算的SYSCLK是以Hz为单位的,即72Mhz/1000,000=72,所以这个SYSCLK/8是对的。


你可能还没搞清楚fac_us到底是干嘛的。很简单,fac_us就是要写入SysTick->LOAD寄存器的值,Systick的工作原理是这个寄存器的值在Systick被Enable之后就开始以设定的工作频率自减,减到0的时候就发出中断,实现定时。所以,写入fac_us到SysTick->LOAD寄存器,就是要Systick在自减了fac_us次以后发出中断,自减fac_us所耗的时间已经说了,1微秒。


下面的fac_ms应该很好理解了,就是1毫秒的计数次数,刚好是1微妙的1000倍,注意9×1000超出了8位整形的表示范围,所以要用(u16)先把fac_us转成16位变量,以保证计算的正确。


具体的应用函数是用来做延时,如下:


void delay_us(u32 nus)

{

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载

SysTick->VAL=0x00; //清空计数器

SysTick->CTRL=0x01 ; //Enable Systick,开始倒数

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL=0x00; //Disable Systick


SysTick->VAL =0X00; //清空计数器

}


具体的寄存器配置只要看手册就知道了,这里只需要理解一句:


do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达


核心就是while(temp&0x01&&!(temp&(1<<16)));//等待时间到达


temp已经是Systick控制寄存器的值了,temp&0x01就是把该寄存器的值读出并且把除第一位之外位都清零(当然要通过temp变量来传递值而不是直接修改寄存器),第一位就是Systick的Enable配置信息,写入1就是Enable,写入0就是Disable,读这一位是判断Systick是否仍然处于Enable状态(可能被其他中断禁用掉),temp&(1<<16)就是读取第16位的值,这一位如果为0就表示计数器的值不是0(即还在计数),如果是1就表示计数器已经自减到0了。


那么这段就很好理解了,即判断,如果Systick还在Enable的状态,并且计数器还没数到0,就不停的循环把当前的SysTick->CTRL寄存器值写入变量temp,继续下一次判断。当Systick被Disable或者计数器数到0了,就停止循环。因为只是做延时,也不需要跳到任何中断服务那边去处理什么,只要这个循环的耗时过程完成就可以了。


关键字:Systick  延时函数 引用地址:Systick 延时函数详解

上一篇:SysTick的优先级是高还是低
下一篇:Stm32f01x_SysTick定时器_延时功能

推荐阅读最新更新时间:2024-03-16 16:09

51单片机STC89C52控制LED闪烁(将延时程序写成子函数有形参)
/*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------函数声明区域---------------------------*/ void delay(unsigned int xms);//延时函数声明 /*-----------------------主函数区域-----
[单片机]
STM32F4学习笔记5——SysTick定时器
SysTick 定时器被捆绑在 NVIC 中,用于产生 SYSTICK 异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 Cortex—M4处理器内部包含了一个简单的定时器,该定时器时钟源可以是内部时钟,或者外部时钟的,不过STCLK的具体来源由芯片设计者决定。SysTick定时器能产生
[单片机]
STM32学习之路-不得不说的SysTick时钟
SysTick时钟,俗称“嘀嗒定时器”,这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 是它,是它,就是它,红色框里的东东,可以看到,它是由HCLK/8得到的,也就是:72MHz/8=9MHz 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄存器的配置了 当然,这个图截得真他妈丑..不过来是可以看到SysTick共有4个寄存器.下面的图盗自别人的博客的, = = 但是
[单片机]
STM32学习之路-不得不说的<font color='red'>SysTick</font>时钟
STM32F0_SYSTICK在STM32CUBEMX中的设置
用过STM32CUBEMX的童鞋们都知道,代码生成的时候默认HAL_Delay延时单位为ms,当程序中要用到us延时的时候该怎么办呢! 最终评估下来,感觉原子的思路比较靠谱,不带OS的设计理念是搞清楚SYSTICK的RELOAD寄存器的数值代表什么,代码生成时默认为47999,也就是说 定时器从47999减1减到0的时候,时间过了1000us,换算后得出数值从47减到1的时候时间过了1us. void HAL_Delay_us(__IO uint32_t delay_us) { uint32_t first_value = 0; uint32_t current_value = 0;
[单片机]
STM8L101F3P6关于微秒级延时函数不同写法的波形
总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。 一、死循环空指令的写法,延时函数程序如下: /******************************************************************************/ /* Function name: Delay_us */ /* Descriptions: 微秒级延时函数函数,16MHz时钟 */ /* input parameters: nCount延时时间
[单片机]
STM8L101F3P6关于微秒级<font color='red'>延时</font><font color='red'>函数</font>不同写法的波形
STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
本文主要解决两个问题 1 STM32的IO口要反转,怎么实现? 2 嘀嗒定时器systick的配置 解答1: 单片机的口,反转很容易。sbit led = P1 ^6; led = ~led;而STM32的口要让它反转,怎样实现呢? 很容易,对想要反转的IO口取异或: GPIOx- ODR ^= GPIO_Pin; 解答2: SysTick是1个24bit递减计数器 SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装定时器的值。 systck计数频率为每秒48000000次,所以4800000次就是1/10秒,也就是100ms。 SysTick的重装
[单片机]
Systick定时器几个简单的函数简介
Systick定时器 Systick定时器是什么? Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作; SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常中断请求(异常号:15); Systick中断的优先级也可以设置。 SysTick的四个寄存器 寄存器对应的位 Systick时钟源选择函数SysTick_CLKSourceConfig() 函数体定义 void SysTick_CLKSourceConfig(uint32
[单片机]
<font color='red'>Systick</font>定时器几个简单的<font color='red'>函数</font>简介
51单片机延时函数
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。 一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved