STM32的系统滴答定时器(Systick)

来源:互联网 编辑:王志 手机版

你后面的关闭定时器、清除标志位的语句又不在while循环里面,你这个while语句是空循环来的。。。

作者:王健 Style欢迎关注本人腾讯微博 @kexuexyzSTM32 的系统滴答定时器(Systick) 彻底研究解读SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!!ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一个 24 位的倒计数定时器,注意,是倒计数!当计到 0 时它就会从 LOAD 寄存器中 自动重装载定时初值。只要不把 CTRL 寄存器中的 ENABLE 为清 0,它就永不 停息!遗憾的是,SysTick 定时器在《STM32 参考手册》里一个屁都没放,只有 在《ARM Cortex-M3 技术参考手册》和《ARM Cortex-M3 权威指南》才找到相 关寄存器的介绍。一、SysTick 的时钟来源我们先来看看 STM32 的时钟树The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock(HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock(HCLK), configurable in the SysTick Control and Status Register. 上面这段话的意思是,SysTick的时钟来源可以是HCLK的8分频或就是HCLK, 具体是哪种可通过配置“控制和状态寄存器(CTRL)”来选择。二、SysTick的寄存器简介SysTick的寄存器一共有4个。控制和状态寄存器CTRL(复位值0x00000000)位段名称类型描述16 COUNTFLAG 只读计数到0时置1;读取该位将清02 CLKSOURCE 可读可写 时钟来源 0=HCLK/8;1=HCLK1 TICKINT可读可写 1=计数到0时产生SysTick异常请求0 ENABLE可读可写 使能位,即定时器的开关,1有效作者:王健 Style欢迎关注本人腾讯微博 @kexuexyz重装值寄存器LOAD(复位值不可预测)位段 名称类型描述23:0 RELOAD 可读可写 当计数到0时将被重装载的值当前值寄存器VAL(复位值不可预测)位段 名称类型描述读取时返回当前倒计数的值;向该寄存器23:0CURRENT可读可写写入任意值都可以将其清除变为0。清0 该寄存器还会导致CTRL寄存器的COUNTFLAG 位清零。另外还有一个校准值寄存器CALIB,暂时用不到,先不刁它!三、SysTick的库函数1、寄存器定义在哪里?答:在core_cm3.h中!typedef struct{__IO uint32_t CTRL;__IO uint32_t LOAD;__IO uint32_t VAL;__I uint32_t CALIB; } SysTick_Type; …#define SysTick ((SysTick_Type *) SysTick_BASE) 2、函数在哪里? 在V3.3的函数库中关于SysTick的函数只有两个。一个是在misc.C文件中的 SysTick_CLKSourceConfig函数,它是一个时钟源配置函数;另一个是在 core_cm3.h文件中的SysTick_Config函数,它的输入参数只有一个,传给了重装 值寄存器LOAD,另外还将VAL寄存器清0了,此外还将CTRL寄存器中的[2:0] 三位都设为了1,分别是使用HCLK时钟,允许异常请求,开启计数器。在 misc.C 文件最后有下面一个函数/** * @功能: 配置 SysTick 时钟源 * @输入

扩展阅读,根据您访问的内容系统为您准备了以下扩展内容,希望对您有帮助。

stm32关于系统滴答定时器(systick)

你在中断处理函数中调用延时函数。是可以的。关键这个延时函数不可以使用到别的中断。stm32在中断处理中只能同时处理一个中断。如果该中断不处理完。即使有别的高级别中断产生也不会执行处理函数。你说你在你的延时函数中使用了systemtick,在你EXTI0_1_IRQHandler执行的时候,systemtick的中断处理不能执行。你的系统计时也不会增加,就导致你的延时函数永远等不到结束。如果你一定要延时的话,可以使用空循环。追问我的主函数只是个简单的led灯定时闪烁程序,没有用到按键中断。关键是时钟源选择外部时钟的时候可以精确定时,选择内核时钟的时候时间不对。

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个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。

*/

STM32的滴答定时器

1,Systick的时钟源你选择的是外部时钟的8分之一,所以需要除以8,得到Systick的时钟频率,例如外部时钟是8M,经过倍频后变为72M,那么Systick的频率就是9M,对应的计数器计9个数就是1us,所以fac_us=72/8=9.

2,如果不是8的倍数,8分频取得的频率是近似值,所以不准确,故推荐使用外部晶振大小为8MHz的晶振。

3,不占用,如果你用作延时函数,你得确定是否时间到了,所以是while的循环,你说的while(1)是什么意思?

[STM32的系统滴答定时器(Systick)]相关文章:

  • STM32中SysTick延时中断的优先级调整
  • STM32中SysTick延时中断的优先级调整
  • 浅析STM32中SysTick在3.5固件库中的应
  • 浅析STM32中SysTick在3.5固件库中的应
  • 6浅析STM32中SYSTICK在3.5固件库中的
  • 6浅析STM32中SYSTICK在3.5固件库中的
  • 基于STM32的智能家居管理系统
  • 基于STM32的智能家居管理系统
  • 基于STM32的实时语音处理系统设计
  • 基于STM32的实时语音处理系统设计
  • 关于stm32的定时器主从模式概念
  • 关于stm32的定时器主从模式概念
  • 基于STM32的光照控制系统设计
  • 基于STM32的光照控制系统设计
  • 基于霍尔传感器和-STM32-的直流电机调速系统的
  • 基于霍尔传感器和-STM32-的直流电机调速系统的
  • Stm32的TFTLCD显示器控制学习笔记
  • Stm32的TFTLCD显示器控制学习笔记
  • 基于STM32的嵌入式智能家居系统
  • 基于STM32的嵌入式智能家居系统
  • stm32关于系统滴答定时器(systick)
  • STM32中,systick具体延时时间怎么计算的?
  • STM32的滴答定时器
  • stm32 systick 定时器有什么作用
  • stm32滴答定时器怎么做时基
  • STM32 滴答定时器
  • stm32系统滴答定时器可以测时间吗
  • STM32f051R8滴答定时器systick不能定在1us么?
  • stm32滴答定时器和普通定时器的区别
  • STM32中 嘀嗒定时器中: 1ul << SysTick_CTRL_ENABLE_Po...
  • STM32的系统滴答定时器(Systick)相关搜索
    最新推荐
    热门推荐