【stm32f407】SysTick实现延时
来源:互联网 发布:pk10助赢软件cpzyrj 编辑:程序博客网 时间:2024/06/10 20:48
一. 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实现延时
- stm32f4使用Systick实现延时
- stm32 SysTick定时器常见问题和实现延时
- STM32使用systick实现精确延时
- 【stm32f103】SysTick实现延时(寄存器版)
- STM32F407 Systick 笔记整理
- K60--滴答定时器(SysTick)实现精准延时
- LPC1768实现精准延时——Systick的使用
- LPC1768实现精准延时——Systick的使用
- STM32 SysTick定时器常见问题及延时函数的实现
- Systick 延时函数详解
- STM32F407学习笔记——Systick中断
- stm32使用systick精确延时
- Systick滴答定时器-延时函数
- 用SysTick值抓取法,实现DelayUS()的微妙延时函数
- STM32F407学习记录2:SysTick嘀嗒定时器学习
- STM32 v3.5固件库systick ms延时
- STM32中,systick具体延时时间计算
- 自学Java之Java编程(输入和输出)(015day)
- Fenwick Tree
- 92 C语言指针变量的运算
- Android
- 通孔焊盘制作教程
- 【stm32f407】SysTick实现延时
- 几个hive用到的命令
- java for循环和while
- TreeMap 嵌套
- D
- 51Nod--1008 N的阶乘 mod P
- linux系统java环境配置命令和MySql数据库之简化版(转自王大锤大神)
- K-means 和 K-medoids算法聚类分析
- ECMAScript6(4):字符串类型扩展