为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

stm32定时器延时时间

2017-12-10 5页 doc 18KB 27阅读

用户头像

is_977556

暂无简介

举报
stm32定时器延时时间stm32定时器延时时间 STM32中,systick具体延时时间计算 分类: STM32/STM8 2013-04-12 11:14 154人阅读 评论(0) 收藏 举 报 /**************************************************************************** * STM32单片机SysTick系统滴答定时器实验程序 * * * *********************************************************...
stm32定时器延时时间
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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索