stm32F40x系统滴答定时器计算方法及应用

发布者:iota19最新更新时间:2019-07-29 来源: eefocus关键字:stm32F40x  系统滴答定时器  计算方法 手机看文章 扫描二维码
随时随地手机看文章

系统滴答定时器计算方法,在这记录一下,防止时间久了遗忘


下图是:时钟树的一小部分:在STM32F4xx中文参考手册.pdf文档第107页可以找到。

框架图:


控制状态寄存器:  SysTick->CTRL


自动重装载寄存器:SysTick->LOAD


当前值寄存器:    SysTick->VAL

校准值寄存器:    SysTick->CALIB


上面框架图是来自于:Cortex M3权威指南(中文).pdf 文档第282-315页


1、换算与时钟源选择     


外部时钟源: HCLK = 168MHz / 8

内核时钟:  HCLK = 168MHz

这里选择了  168MHz / 8 = 21MHz

  21MHz = 21000KHz = 21000 000Hz

  1us = (21 000 000Hz/s) / 1000 000 = 21次

也就是1us它里面的val会减21次,因为在21MHz频率,1us中有21个脉冲波。但减到0时,会产生一个中断事件。

2、系统滴答定时器是什么?


答:系统滴答定时器(Systick)是一个24bit的定时器,因此它一次最多可以计数2的24次方个时钟脉冲。用于系统中的时钟节拍,可以不断地产生1uS的中断。

①:SysTick->VAL(最大值24位)

存放24位:二进制(1111 1111 1111 1111 1111 1111) <=> 16进制 0xFFFFFF

       计数最多为:16777215次

       16777215 / 168 = 0.099864375s = 99.864375ms 约等于 100ms 

       16777215 四舍五入 16800000

       168MHz = 168000000

       16800000/168000000 = 0.1s = 100ms   这个计时太短(过快)无法满足所需

       如果是使用了21MHz来计算的话刚好是168的8倍,所以得出计算结果为:800ms

②:800ms计算过程

       同样计算公式: oxffffff / 21000    

       16777215 / 21 = 798.9ms            这个时间基本满足所有计时时间

       也就是最多可以记这么多毫秒: oxffffff / 21000 = 798.9ms    


3、系统滴答定时器延时1S的原理


       思路:利用systick定时器为递减计数器,设定初值并使能它后,它会对每1个系统时钟周期计数器减1,计数到 0时,SysTick计数器自动重装初值并继续计数,同时触发中断。那么每次计数器减到0,时间经过了:系统时钟周期*计数器初值。我们使用168M作为系统时钟,那么每次计数器减1所用的时间是1/168M,计数器的初值如果是168000,那么每次计数器减到0,时间经过(1/168M)*168000=0.001,即1ms。

答:(简单理解:用168M的时钟频率,即1s计数168M=168000000次,那1ms计数168000次,所以计数值为168000,那1us计数168次,所以计数值为168)。


4、配置流程:

①:系统滴答ms级延时设置

    选择时钟源、清空当前计数器的值、设置重载值、使能计数器、等待定时时间到、关闭倒数计数器、计数器清零


②:系统滴答us级延时设置

    选择时钟源、清空当前计数器的值、设置重载值、使能计数器、等待定时时间到、关闭倒数计数器、计数器清零



systick.h文件


#ifndef  __SYSTICK_H__

#define  __SYSTICK_H__

 

#include

 

void systick_delay_us(u32 nus);

void systick_delay_ms(u16 nms);

void systick_delay_xms(u32 xms);

 

 

#endif

 


systick.c文件


#include "sysTick.h"

 

 

/*

函数功能:系统滴答微秒延时

函数形参:nus

返回值:无

*/

void systick_delay_us(u32 nus)

{

//21MHz = 21000000Hz/s  = 21000Hz/ms = 21us

if(nus>(0xffffff / 21)) //微秒,只要是大于这个值就不允许延时

{

return;

}

SysTick->CTRL &= ~(0x1<<2);//选择21MHz的时钟源

SysTick->VAL = 0x00;    //清空当前计数器的值

SysTick->LOAD = nus * 21;  //要记的数

SysTick->CTRL |= 1<<0;    //使能倒计数寄存器

/** SysTick->CTRL中的Set bit 16 - count flag **/

while(!(SysTick->CTRL & (0x1<<16)))//等待定时时间达到产生(位16)的标志

{

;

}

SysTick->CTRL &= ~(1<<0); //关闭倒数计数器 清零  可以不写

SysTick->VAL &= ~(1<<0); //计数器清零   可以不写,寄存器有自动清零功能

}

 

 

/*

函数功能:系统滴答豪秒延时

函数形参:nms

返回值:无

*/

void systick_delay_ms(u16 nms)

{

//21MHz = 21000000Hz/s  = 21000Hz/ms

if(nms>(0xffffff / 21000)) //毫秒,只要是大于这个值就不允许延时

{

return;

}

SysTick->CTRL &= ~(0x1<<2);  //选择21MHz的时钟源

SysTick->VAL = 0x00;      //清空当前计数器的值

SysTick->LOAD = nms * 21000; //要记的数

SysTick->CTRL |= 1<<0;      //使能倒计数寄存器

/** SysTick->CTRL中的Set bit 16 - count flag **/

while(!(SysTick->CTRL & (0x1<<16)))//等待定时时间达到产生(位16)的标志

{

;

}

SysTick->CTRL &= ~(1<<0); //关闭倒数计数器 清零  可以不写

SysTick->VAL &= ~(1<<0); //计数器清零   可以不写,寄存器有自动清零功能

}

 

 

/*

函数功能:系统滴答 实现任意ms级别的延时

函数形参:nms

返回值:  无   

备注:    以500ms的延时为基准延时

*/

void systick_delay_xms(u32 xms)

{

u16 i =0;//延时的倍数循环变量

//计算整数个基准延时

for(i=0; i {

delay_ms(500);

}

//如果不是整数倍 有剩余的延时

if(xms%500!=0)  //有余数

{

delay_ms(xms%500);

}

}

 

main.c


#include "led.c"

#include "systick.h"

 

int main(void)

{

    led_init();

    while(1)

    {

        LED1_ON;

        systick_delay_ms(500); //延时0.5s

        LED1_OFF;

        systick_delay_ms(500); //延时0.5s

    }

}


关键字:stm32F40x  系统滴答定时器  计算方法 引用地址:stm32F40x系统滴答定时器计算方法及应用

上一篇:STM32F407 定时器TIM3 出现
下一篇:STM32移植Marlin固件

推荐阅读最新更新时间:2024-11-23 10:27

STM32F40x 内部温度获取
#include ADC.h //user guide // in board init, call function: adc_init(); // get_internal_temperture(); get tempertare, uinit℃ static void AdcPinComInit(void) { ADC_CommonInitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); ADC_InitStructure.ADC_Mode = ADC_DualMode_RegSimult; A
[单片机]
万用表的测量计算方法
在使用测量交流电压或电流时,您是否对测量结果有过怀疑?当您对自己的电路十分确信时,你可能对万用表测量的准确性产生了怀疑,那么究竟是哪里出了问题呢?还是让我们来回顾一下万用表测量交流信号的数学计算公式吧。 1. 平均值与真有效值测量的异同: 首先,了解一下平均值,数学上求电压平均值用下边的公式来表示: 其 中u(t)是信号的函数表达式,t为信号的周期。 如果我们要测量的是标准的正弦信号,那么用这种计算方法既准确又快捷。但是用来测量其他交流信号(如下式方波): 再利用式4对上式求平均值,设上述信号周期为 2 ,则 显然结果是不正确的。因此,得出结论用求平均值的方法来计算如方波、锯齿波等交流信号时可能会出现很大的误差。
[测试测量]
万用表的测量<font color='red'>计算方法</font>
STM32的系统滴答定时器(Systick)
1.systick时钟来源 2.SysTick库函数 3.源码 /** *@} */ /** @defgroup SysTick_clock_source *@{ */ #define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) #define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) #define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
[单片机]
STM32的<font color='red'>系统</font><font color='red'>滴答</font><font color='red'>定时器</font>(Systick)
STM32---系统滴答定时器(systick)应用
利用stm32的系统滴答滴来获取系统的时间基准,以此应用到接收串口数据的超时退出。具体如下: current_sys_time = SysTick- VAL;(获取当前时间基准)。 while (com_available(&rx_buffer1) 1) { //超时退出接收串口数据 if((SysTick- VAL - current_sys_time) Delay) { return TRUE; // } } 以下转自:http://blog.csdn.net/yx_l128125/article/details/7884423 1.systick介绍
[单片机]
STM32---<font color='red'>系统</font><font color='red'>滴答</font><font color='red'>定时器</font>(systick)应用
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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