欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

STM32单片机SysTick实现精确延时

程序员文章站 2022-06-22 22:42:36
Systick定时器特点:递减:假设计数器的值为 1000,999,998....... 一直减1直到0的时候重装载计数器(值是固定的这里假设为1000)付给计数器再从1000开始计数源码下载链接:https://taileliekaishi.lanzous.com/iuQmYfiin5e工程项目结构如下图所示:其中画红色方框部分为重要函数来进行讲解Delay.c#include "DELAY/Delay.h"/** * 功能:初始化Systick定时器 * 参...

Systick定时器特点:

STM32单片机SysTick实现精确延时

递减:假设计数器的值为 1000,999,998....... 一直减1直到0的时候重装载计数器(值是固定的这里假设为1000)付给计数器再从1000开始计数

STM32单片机SysTick实现精确延时

源码下载链接:https://taileliekaishi.lanzous.com/iuQmYfiin5e

工程项目结构如下图所示:

其中画红色方框部分为重要函数来进行讲解

STM32单片机SysTick实现精确延时

Delay.c

#include "DELAY/Delay.h"

/**
 * 功能:初始化Systick定时器
 * 参数:None
 * 返回值:None
 */
 
/*此函数定义完成之后定时器的溢出周期(计数周期)就是1us
	72MHz / 8 = 9Hz(1/9 us) 
	1/9 us * 9 = 1us
*/
void initSysTick(void)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;            //使能定时器溢出中断
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;             //开定时器让定时器可以开始计数
    SysTick->LOAD = 9;                                    //设置重装载值
}


/**
 * 功能:us级别延时
 * 参数:xus:要延时的时间
 * 返回值:None
 */
void Delay_us(u32 xus)
{
    SysTick->LOAD = 9 * xus; //计9次为1us,xus则重装载值要*9
    SysTick->VAL = 0;        //计数器清零之后会立即将LOAD值装载到VAL寄存器中并且开始计数
		while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待90减到0才释放这个函数(判断计数完成位是否为1)
}

/**
 * 功能:ms级别延时
 * 参数:xms:要延时的时间
 * 返回值:None
 */
void Delay_ms(u32 xms)
{
    SysTick->LOAD = 9000; //计9次为1us,9000次为1ms
    SysTick->VAL = 0;     //计数器清零之后会立即将LOAD值装载到VAL寄存器中并且开始计数
	
		//从9000减到0重复执行xms次就得到可x ms
    while (xms--)
    {
				// 判断是否从9000减到0
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
    }
	  SysTick->LOAD = 9000 * xms; //计9次为1us,xus则重装载值要*9
}

stm32f10310x_it.c:定时器中断服务函数(每隔自己配置的时间来进行调用此函数执行其他的功能

void SysTick_Handler(void)
{
//	u32 temp = SysTick->CTRL; //进入中断后清除重装载标志位
}

main.c

#include "LED/LED.h"
#include "stm32f10x.h"
#include "DELAY/Delay.h"

int main(void)
{
	
	initSysTick();
	initLED(); //初始化LED	
	while (1)
	{
		toggleLED();//翻转LED
		Delay_ms(500);
	}
}

 

本文地址:https://blog.csdn.net/weixin_39903708/article/details/107936681