stm32用SysTick延时

SysTick是内核的一个外设,内嵌在NVIC中,它是一个24位向下递减的定时器,每计数一次的事件位1/SYSCLK(一般为72M),当重装载寄存器的值递减到0时,系统定时器就产生一次中断,循环往复,这个定时器一般用于操作系统来产生时基以维持心跳。

CTRL:控制及状态寄存器

LOAD:重装载数值寄存器

VAL:当前数值寄存器

CALIB:校准数值寄存器:暂不讨论

bsp_systick.h:

#ifndef __SYSTICK_H
#define __SYSTICK_H
#include"stm32f10x.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
void SysTick_Delay_Us( __IO uint32_t us);
void SysTick_Delay_Ms( __IO uint32_t ms);
#endif

bsp_systick.c:

#include "bsp_systick.h"
#include "core_cm3.h"
#include "misc.h"

static __IO u32 TimeDelay;
//这个函数主要是产生一次中断的时间,因为是72M的频率的话,计数一次的时间位1/72M
//重装载寄存器里的值就是计数次数,(计数次数)/(系统频率72M)=一次中断的时间
void SysTick_Init(void)
{
    /* SystemFrequency / 1000    1ms
     * SystemFrequency / 100000     10us
     * SystemFrequency / 1000000 1us
     */
//下面这个参数就是计数次数:720/72M=1/100000秒
//简化得之:分母为X,中断一次的时间为1/X秒
    if (SysTick_Config(SystemCoreClock / 100000))
    {
        while (1);
    }
}
 //nTime: Delay_us( 1 )产生的延时为1*(1/100000)S
void Delay_us(__IO u32 nTime)
{
    TimeDelay = nTime;
    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;

    while(TimeDelay != 0);
}

 // 这个函数用于被中断处理函数调用,产生一次中断,这个函数就会被调用一次,获得时基
 //以此来达到延时(nTime*时基)的目的
void TimeDelay_Decrement(void)
{
    if (TimeDelay != 0x00)
    {
        TimeDelay--;
    }
}
//寄存器版本的微秒延时 不需要用到中断处理函数
//在SysTick_Config函数里就会一直计数,重装载,计数
//来产生连续的时基,以维持心跳
void SysTick_Delay_Us( __IO uint32_t us)
{
    uint32_t i;
    SysTick_Config(SystemCoreClock/1000000);

    for(i=0;i<us;i++)
    {
        while( !((SysTick->CTRL)&(1<<16)) );
    }
    SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
//寄存器版本的毫秒延时
void SysTick_Delay_Ms( __IO uint32_t ms)
{
    uint32_t i;
    SysTick_Config(SystemCoreClock/1000);

    for(i=0;i<ms;i++)
    {
        while( !((SysTick->CTRL)&(1<<16)) );
    }
    SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

main.c:

#include"stm32f10x.h"
#include"bsp_led.h"
#include"bsp_systick.h"
int main(void)
{
    LED_GPIO_Config();
    SysTick_Init();
    while(1)
    {
        red(ON);
        Delay_us(100000);
        red(OFF);
        green(ON);
        SysTick_Delay_Us(1000000);
        green(OFF);
        blue(ON);
        SysTick_Delay_Ms(1000);
        blue(OFF);
    }
}

中断处理函数:

void SysTick_Handler(void)
{
    TimeDelay_Decrement();
}

原文地址:https://www.cnblogs.com/lzd626/p/9212254.html

时间: 2024-10-08 00:34:33

stm32用SysTick延时的相关文章

stm32之Systick(系统时钟)

Systick的两大作用: 1.可以产生精确延时: 2.可以提供给操作系统一个单独的心跳(时钟)节拍: 通常实现Delay(N)函数的方法为: for(i=0;i<x;i++) ; 对于STM32系统微处理器来说,执行一条指令只有几十ns(纳秒),进入for循环,要实现N毫秒的x值非常大:而由于系统频率的宽广,很难计算出延时N毫秒的精确值:针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N): cortex的内核中包含一个SysTick时钟,SysTi

STM32之SysTick(系统定时器)

SysTick定时器是被捆绑在NVIC中的,用于产生SysTick异常(异常号是15).(同样,玩过51单片机的都知道定时器的作用了) 在STM32在内核部分是包含了一个简单的定时器–SysTick timer.因为在所有的Cortex-M3芯片上都有这个定时器,所以软件在不同芯片生产厂商的Cortex-M3器件间的一只工作就得以化简. 该定时器的时钟源可以是内部时钟( FCLK, CM3 上的自由运行时钟),或者是外部时钟(CM3 处理器上的 STCLK 信号).不过, STCLK 的具体来源

关于STM32的systick定时器的详细说明

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统:或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关.因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律. Cortex‐M3处理器内部包含了一个

stm32的systick原理与应用

/* SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟.无论用作延时还是用作系统心跳时钟,不需要太复杂的功能,SysTick即可胜任. 二.实现原理 SysTick定时器是一个24位的倒计数,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,同时可以选择在这个时候产生中断(异常号:15). 例如从RELOAD的值为999,那么当倒计数为0时,就会从复位为

stm32中的延时函数

//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10;  //自己定义 while(i--) ; } } //毫秒级的延时 void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000;  //自己定义 while(i--) ; } } 运用SysTick来实现准确定时: SysTick_Config(SystemCoreClock / 10)   函数的形

STM32的精确延时

/*---------------------------------------------------------- 文件名称:systick.c 文件描述:sysTick 系统滴答时钟1us中断函数库,中断时间可自由配置 备注:程序默认使用72M时钟,无分频 -----------------------------------------------------------------*/ #include "delay.h" static __IO u32 TimingDel

SysTick 延时函数

用SYSTICK(系统滴答定时器)做延时函数 1.   4个寄存器 SysTick->CTRL,        --控制和状态寄存器 SysTick->LOAD,        --重装载寄存器 SysTick->VAL,          --当前值寄存器 SysTick->CALIB,        --校准值寄存器 下图有他们的分别描述:     下图引用地址:http://blog.csdn.net/marike1314/article/details/5673684 2.

STM32 的Systick操作

首先需要知道的是: 1)STM32的内核是Cortex-M3, 而Systick则是属于Cortex-M3的内核的. 2)Systick为内核提供系统时钟用,比如可以用来作为操作系统的滴答时钟.更多作用可以参考<ARM v7-M Architecture ReferenceManual> 3)Systick是个递减计数器,当计数值递减为0时可以产生Exception中断,中断号为15. 4)Systick相关的寄存器有4个. 5)Systick的控制与状态寄存器SYST_CSR的CLOCKSO

STM32的SYSTICK

1.一般操作系统都需要一个定时器来产生周期性的中断,而且最好让用户程序不能随意访问它的寄存器,以维持系统心跳的节律. 2.