Systick定时器特点:

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

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

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

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

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