STM32中,systick具体延时时间计算

/****************************************************************************
*  STM32单片机SysTick系统滴答定时器实验程序
*
*
*
*****************************************************************************/
#ifndef                _SYSTICK_H
#define                 _SYSTICK_H
#include "SysTick.h"
#define    SYSTICK_CSR   (*((volatile unsigned long *) 0xE000E010))//控制寄存器
#define    SYSTICK_LOAD  (*((volatile unsigned long *) 0xE000E014))//重载寄存器
#define    SYSTICK_VAL   (*((volatile unsigned long *) 0xE000E018))//当前值寄存器
#define    SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校准值寄存器
unsigned long SysTick_Delay;//全局变量
//配置寄存器
void SysTick_InitStructReadCmd(void)
{
SYSTICK_VAL = 0;  //当前值寄存器清零
SYSTICK_LOAD = SystemCoreClock / 1000000; //重要部分就在这里  系统72000000 / 100000
SYSTICK_CSR |= 0x06;   //先关闭SysTick使能用的时候在打开
}
//中断服务程序
void SysTick_Hangler(void)
{
SYSTICK_VAL = 0;     //当前值寄存器清零
if(SysTick_Delay != 0x00)//判断延时SysTick_Delay 是否等于0
{
SysTick_Delay--;//减到0结束
}
}
//延时函数
void Delay_10us(unsigned long Countlinef)
{
SYSTICK_CSR |= 0x07;  //启动SysTick使能
SysTick_Delay = Countlinef;  //把延时变量赋值SysTick_Delay全局变量
while(SysTick_Delay != 0);  //判断延时时间是否到
SYSTICK_CSR |= 0x06;  //时间到关闭 SysTick使能用的时候在打开
}
int main(void)
{
SystemInit(); //注意这么是把系统时钟设初始化为 72M主频,这里是必须的
SysTick_InitStructReadCmd();
while(1)
{
GPIOD->BSRR = 0x00000100;
Delay_10us(1000000)  ; //实现1ms延时
GPIOD->BRR  = 0x00000100;
}
}
//====================================END=============================================//
/*   好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ
     SYSTICK_LOAD = SystemCoreClock / 1000000; SysTick重载初值重要的地方就在这里
1:SystemCoreClock 这个是什么意思,跟踪库函数找到如下:
    #ifdef SYSCLK_FREQ_HSE
        uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;      
        #elif defined SYSCLK_FREQ_24MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;    
        #elif defined SYSCLK_FREQ_36MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;      
        #elif defined SYSCLK_FREQ_48MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;      
        #elif defined SYSCLK_FREQ_56MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;       
        #elif defined SYSCLK_FREQ_72MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;       
        #else /*!< HSI Selected as System Clock source */
//     uint32_t SystemCoreClock         = HSI_VALUE;    
/*这里不难看出,我们初始化SystemInit(); 是系统已经把SystemCoreClock配置成72M下面就不难理解了,
               先看一下计算公式:T = TICKS * (1/f); 
               T : 为要计时的总时间。
               TICKS :为SYSTICK_LOAD 的输入参数。
   (1/f)为使用时钟源的时钟周期,f为时钟源的时钟频率
   使用时钟源为AHB时钟, 频率被配置72M;
   把SYSTICK_LOAD重载寄存器赋值为 SystemCoreClock / 1000000;呵呵呵大家
   发现了什么,就是72000000 / 1000000 = 72;大家都应该知道了72个时钟周期
   中断一次,大家接着看(1/f)是时钟周期的时间。1/72M = 0.13888888888888888888888888888889;
   1us诞生了,0.13888888888888888888888888888889*72 = 1;1us哈哈哈大家明白了吧。
  //野火资料出问题的地方 ticks=SystemFrequency / 10 000 =720,相当于:72000000 / 10000 ;这里少了一个0  结果等于 = 7200 不等于720看资料看的纠结哈哈哈。
这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
   
*/

//讲得简单易懂,当然精确定时还是要定时器的

以上转自:http://zhidao.baidu.com/question/399939306.html

你可能感兴趣的:(STM32/STM8)