stm32定时器延时时间stm32定时器延时时间
STM32中,systick具体延时时间计算
分类: STM32/STM8 2013-04-12 11:14 154人阅读 评论(0) 收藏 举
报
/****************************************************************************
* STM32单片机SysTick系统滴答定时器实验程序
*
*
*
*********************************************************...
stm32定时器延时时间
STM32中,systick具体延时时间计算
分类: STM32/STM8 2013-04-12 11:14 154人阅读 评论(0) 收藏 举
报
/****************************************************************************
* 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个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
*/
//讲得简单易懂,当然精确定时还是要定时器的
本文档为【stm32定时器延时时间】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。