【stm32f407】SysTick实现延时

发布者:LIGANG888最新更新时间:2019-02-12 来源: eefocus关键字:stm32f407  SysTic  延时 手机看文章 扫描二维码
随时随地手机看文章

一.  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  SysTic  延时 引用地址:【stm32f407】SysTick实现延时

上一篇:【stm32f407】IO引脚复用和映射
下一篇:【stm32f407】时钟树以及SystemInit剖析

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

STM32F407 串口编程USART1,USART2,USART3,UART4
串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO时钟使能。 2) 设置引脚复用器映射:调用GPIO_PinAFConfig函数。 3) GPIO初始化设置:要设置模式为复用功能。 4) 串口参数初始化:设置波特率,字长,奇偶校验等参数。 5) 开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。 6) 使能串口。 7) 编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。 我们通过USART3简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文
[单片机]
<font color='red'>STM32F407</font> 串口编程USART1,USART2,USART3,UART4
单片机延时程序图解分析
我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。 DELAY: MOV R7,#250   ;(6) D1: MOV R6,#250   ;(7) D2: DJNZ R6,D2    ;(8) DJNZ R7,D1   ;(9)    RET        ;(10) 〈单片机延时程序〉 MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这
[单片机]
单片机<font color='red'>延时</font>程序图解分析
关于PWM和精确延时输出的方波
绝大部分AVR单片机都会带有PWM硬件部分,今天小编来探测下PWM和精确延时产生的方波哪个更精准,欢迎讨论 小编就以输出4KHz的方波为例 1、下图是小编用PWM输出的4K方波 从图中,我们可以看到PWM输出的频率是4.03KHz; 2、下面小编带来精确延时的输出图形(小编精确延时用的是IAR编译器中intrinsic.h中的cycles函数) 从图中我们看到的精确延时产生的频率是4.01KHz,而且处于一个向4KHz跳变的状态
[单片机]
关于PWM和精确<font color='red'>延时</font>输出的方波
STM32F407ZGT6用滴答定时器实现精确延时(寄存器版)
1.滴答定时器介绍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 滴答定时器是ARM公司设计架构是已经集成到内核中,也就是说只要采用ARM公司设计芯片滴答定时器是通用的,写好的滴答定时器在其他的采用ARM公司设计
[单片机]
LPC21xx C程序的精确延时方法
引言 随着微处理器技术的发展,微处理器不断升级,内核的处理速度越来越快,同时也出现了精确延时的问题。由于ARM7微控制器LPC21xx使用了三级流水线技术,精确延时对开发者特别是初学者带来了一定的难度。下面介绍几种LPC21xx在C程序下实现精确延时的实用方法。 实现延时通常有两种方法:一种是硬件延时,采用定时器/计数器实现精确延时,可以提高CPU的工作效率;另一种是软件延时,这种方法主要采用循环体进行。 1 硬件延时 Philips公司的LPC21xx系列微控制器具有2个32位可编程定时器/计数器,均具有4路捕获、4路比较并输出电路。定时器对外设时钟周期进行计数,在到达指定的定时值时可选择产生中断来执行其他动作。可用
[单片机]
LPC21xx C程序的精确<font color='red'>延时</font>方法
一文详解电动机延时启动电路
正常情况下,电动机启动都是直接启动的,有的时候也需要延时启动,延时启动的电路是什么样的呢?接下来我们来看一下。 延时启动第一种 这个就是延时启动电路,按下启动按钮需要延时一段时间 电机 才能启动。 按下启动按钮 按下启动按钮,小型中间继电器自锁,形成自锁电路,同时时间继电器得电开始计时,这里我设置的是10秒钟,因为接触器通过了时间继电器的常开,所以接触器不会吸合,电机不会运行。 时间继电器到时间 当时间继电器时间到了的时候,常开触点会闭合,接触器得电吸合,电机运行,因为此时时间继电器一直保持得电状态,所以常开触点会保持闭合。 按下停止按钮 当需要停止的时候,按下停止按钮,继电器断电,所有 控制电路 失电,电
[嵌入式]
一文详解电动机<font color='red'>延时</font>启动电路
stm32f407之高级定时器 死区互补PWM(操作寄存器)
高级定时器的功能有很多,这里只介绍死区互补PWM输出功能。其实死区互补PWM跟通用定时器的PWM配置差异不大,只是需要设置多CCER寄存器中的几个位以及刹车与死区寄存器BDTR。对寄存器的具体描述请参考数据手册。 配置步骤: 1. 使能相关时钟。 2. 配置相关的引脚模式、速度、以及复用功能。 3. 使能TIM时钟 4. 设置分频。 5. 设置周期。(ARR的值)周期=(PSC+1)* ARR / TIMx时钟 6. 产生一次更新事件,更新影子寄存器的值。 7. 在CCMR中设置PWM模式。 8. 设置各通道占空比。占空比= CCRx / ARR。 9. 使能比较输出。 10. 启动预装载。
[单片机]
关于51精确延时及keil仿真延时时间
有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一、用NOP函数 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。(若为11.0592MHz,延时为12*(1/11.0592)=1.085uS)。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 二、用for和while实现 在选择C
[单片机]
关于51精确<font color='red'>延时</font>及keil仿真<font color='red'>延时</font>时间
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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