历史上的今天
今天是:2025年02月12日(星期三)
2019年02月12日 | 【stm32f407】SysTick实现延时
2019-02-12 来源:eefocus
一. 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;
}
史海拾趣
|
typedef union { u16 whole; struct { unsigned IMPLEMENTED : 1; /**< Indicates that the key is implemented (from Customer Code to TSL only) */ unsigned ENABLED&nb ...… 查看全部问答> |
|
一学期的课程 主要分为三个部分,半导体器件的工作原理 器件特性(MOSFET,BJT,VMOS,IGBT...GaAs) 半导体器件模型化 [ 本帖最后由 linda_xia 于 2010-4-18 08:31 编辑 ]… 查看全部问答> |
|
MC39I拨号GPRS成功分配IP后,无法进行UDP,TCP通信 我用的单片机控制MC39I,拨号CMNET成功分配IP地址和DNS1/DNS2后,发送UDP以及TCP数据包,为什么别人总收不到?当然上位机发的我也收不到.恳请那位大侠予以指点是不是在IPCP协商玩之后,发送UDP/TCP数据包之前还需要作些什么?我用Windows自带的PPP拨号发 ...… 查看全部问答> |
|
MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序 用MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序,谢谢邮箱com021@163.com,高手大侠们多多指教… 查看全部问答> |
|
我用CVAVR编译器,为什么编译后得不到COF和HEX文件? 我用CVAVR编译器,为什么编译后得不到COF和HEX文件?折腾了好几天了。请大伙帮帮忙看看是什么原因?先谢谢了! [ 本帖最后由 rjx 于 2012-10-10 08:23 编辑 ]… 查看全部问答> |
|
1、拿到这块板子你会用它去做什么? 做个彩屏GUI手持通讯的工具 2、你会把你做好的东西发心得体会到论坛吗? 会,在论坛里与大家交流 3、你对这块板子的性价比怎么看?心里价位是多少? 性价比看价格了!这个比较矛盾的话题,量大了性价比就高! ...… 查看全部问答> |




