【stm32f407】SysTick实现延时

发布者:Changsheng520最新更新时间:2018-07-20 来源: eefocus关键字:stm32f407  SysTick  实现延时 手机看文章 扫描二维码
随时随地手机看文章

一.  SysTick介绍:


CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。我们就是利用STM32的内部SysTick来实现延时的,这样既不占用中断,也不占用系统定时器


通常SysTick可以通过中断的方式来实现,后续会增加,但是目前只是通过轮询的方式去实现


二.  寄存器介绍


SysTick有4个寄存器


对应的代码在core_cm4.h中


typedefstruct

{

  __IO uint32_t CTRL;                    /*!< Offset: 0x000(R/W)  SysTick Control and StatusRegister */

  __IO uint32_t LOAD;                    /*!< Offset: 0x004(R/W)  SysTick Reload Value Register       */

  __IO uint32_t VAL;                     /*!< Offset: 0x008(R/W)  SysTick Current ValueRegister      */

  __I uint32_t CALIB;                  /*!< Offset: 0x00C (R/ ) SysTick Calibration Register       */

} SysTick_Type; 

1) CTR寄存器如图:

第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)

第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零.

2) LOAD寄存器如图:

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。

3) VAL寄存器如图:

也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

4) CALIB寄存器如图

一般不会用到

三.  源码

delay.h



#ifndef _DELAY_H_H_H

#define _DELAY_H_H_H

#include "stm32f4xx.h"

 

void delay_init(u8 SYSCLK);

void delay_ms(u16 nms);

void delay_us(u32 nus);

#endif


delay.c



#include "delay.h"

 

static u8  fac_us=0;   

static u16 fac_ms=0;

void delay_init(u8 SYSCLK)

{

  SysTick->CTRL&=~(1<<2);

  fac_us=SYSCLK/8;

  fac_ms=((u32)SYSCLK*1000)/8;

}

void delay_xms(u16 nms)

{    

  u32 temp;   

  SysTick->LOAD=(u32)nms*fac_ms;

  SysTick->VAL =0x00;

  SysTick->CTRL=0x01 ;

  do

  {

    temp=SysTick->CTRL;

  }while((temp&0x01)&&!(temp&(1<<16)));

  SysTick->CTRL=0x00;

  SysTick->VAL =0X00;      

 

void delay_ms(u16 nms)

{

  u8 repeat=nms/540;

  u16 remain=nms%540;

  while(repeat)

  {

    delay_xms(540);

    repeat--;

  }

  if(remain)delay_xms(remain);

  

}

void delay_us(u32 nus)

{

  u32 temp;      

  SysTick->LOAD=nus*fac_us;    

  SysTick->VAL=0x00;

  SysTick->CTRL=0x01 ;  

  do

  {

    temp=SysTick->CTRL;

  }while((temp&0x01)&&!(temp&(1<<16)));

  SysTick->CTRL=0x00;

  SysTick->VAL =0X00;  

}


关键字:stm32f407  SysTick  实现延时 引用地址:【stm32f407】SysTick实现延时

上一篇:stm32之SysTick的理解
下一篇:systick使用出错总结

推荐阅读最新更新时间:2024-03-16 16:09

STM32入门学习之SysTick系统定时器(STM32F030F4P6基于CooCox IDE)
#include stm32_lib/inc/stm32f0xx_misc.h #include stm32_lib/inc/stm32f0xx_rcc.h int main(void){ //配置初值,系统定时器是倒数计时器,减1的 //注意:该函数的参数类型虽为uinit32_t,实际最大值为16777215,也就是2^24 SysTick_Config(SystemCoreClock/10); while(1); } //中断函数 void SysTick_Handler(void){ //这里做你想做的事情 } 系统定时器,就是这么简单!时钟为系统时钟,只要配置好倒计时数即可。 特别
[单片机]
STM32入门学习之<font color='red'>SysTick</font>系统定时器(STM32F030F4P6基于CooCox IDE)
stm32f407之CAN控制器(操作寄存器)
首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说。这里只是以我个人理解,简单说说CAN通信。CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符,不是单独的谁发给谁,而是,你总是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发。 然后我们可以了解一下stm32的CAN控制器。 如上图所示,stm32有两个can控制器,can1(主),和can2
[单片机]
<font color='red'>stm32f407</font>之CAN控制器(操作寄存器)
STM32的SYSTICK_Init()配置
void SYSTICK_Init(void) { /* SysTick end of count event each 1ms with input clock equal to 4.5MHz (HCLK/8, default) SysTick_SetReload(4500); /* Enable SysTick interrupt SysTick_ITConfig(ENABLE); /* Enable the SysTick Counter SysTick_CounterCmd(SysTick_Counter_Enable); } 系统时钟定时器的周期与驱动的时钟频率和Reload值相关。
[单片机]
毕业设计| STM32F407智能汽车
STM32小车功能介绍 小车的硬件部分使用了以STM32F407VET6最小开发板为核心板,内部结合:温湿度模块、烟雾浓度模块、RFID模块、GSM模块、GPS定位模块、语音识别模块、超声波模块、蓝牙模块、OLED模块、舵机模块、电机驱动模块、电机模块、蜂鸣器模块、电压数码管显示模块和电源模块,外结合四个麦克纳姆轮,构成一个完整可靠的硬件系统。 软件控制系统包括了智能显示系统、语音智能控制系统、无线控制系统、车灯智能控制系统、安全报警系统、智能避撞系统、智能温控系统和一键报警系统,在一定程度上提高汽车的安全性、控制性和防盗性。 Image 各个功能分解 语音智能控制系统: 通过语音识别模块识别驾驶员的语音来控
[单片机]
毕业设计| <font color='red'>STM32F407</font>智能汽车
STM32菜鸟成长记录---系统滴答定时器(systick)应用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 只要不把它
[单片机]
STM32菜鸟成长记录---系统滴答定时器(<font color='red'>systick</font>)应用
STM32下SysTick的一个容易发生的错误,时钟频率设置
今天同事测试我之前写的一个小程序,发生了奇怪的错误,先是Uart通讯接收操作,出现了接收数据不全的问题:2个字节的应答帧,在实际运行中只能收到1个字节,导致程序死循环。检查后发现,是接收部分代码留的延时太短,造成了芯片误以为通讯已结束,但实际应答帧尚未传输完毕。(此处接收代码的工作模式是:当Uart接收到1个字节后,即开始一个定长的延时,该延时长度与通讯波特率相关,当正常通讯还在继续时,则应在延时结束前收到下一个字节数据,如延时结束仍未收到下一个字节数据,说明当前一帧数据已完成,可开始对已接收数据进行处理) 发现了问题后,进行相应的针对性操作,对延时长度进行了增加,即解决了此问题。但仍然觉得疑惑,因此段程序是已经通过测试的,运
[单片机]
STM32系统学习——SysTick(系统定时器)
SysTick系统定时器是属于CM3内核中的一个外设,内嵌在NVIC(嵌套向量中断控制器,控制整个芯片中断相关的功能,它与内核紧密藕合,是内核中的一个外设)中。系统定时器是一个24位的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK为72MHZ,当重装载数值寄存器的值递减为0时,系统定时器就产生一次中断,以此循环往返。 因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,这使得软件在CM3单片机中可以很容易被移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。 一、SysTick寄存器介绍 SysTick系统定时器中有4个寄存器,
[单片机]
断电延时继电器原理与实现
断电延时继电器,是当时间继电器线圈通电时,各延时触头瞬时动作,而线圈断电以后触头呈延时置位工作状态,当所设延时到达后,延时触头又恢复为初始状态。断电延时型因其工作状态(在延时过程中不需外接工作电源)以及控制触点在断电延时过程中吸合触点(常开触点变为接通状态应保持接通状态;常闭触点变为断开状态,应呈保持断开状态)转换特殊性(与常规 通电延时型时间继电器 触点工作状态正好相反)来满足其控制要求。断电延时型时间继电器由最早分离器件构成(延时精度低、延时时间短);现用相应可编程定时集成电路或CMOS计数分频集成来完成延时,与之相比,具有延时精度高,延时时间长的特点。以此满足断电长延时的控制场合。   典型电路    断电延时继电器
[模拟电子]
断电<font color='red'>延时</font>继电器原理与<font color='red'>实现</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved