天天看点

嵌入式开发学习之--系统定时器前言一、SysTick 简介二、使用步骤总结

本章主要学习系统定时器,并用系统定时器来做一个延时函数。

文章目录

  • 前言
  • 一、SysTick 简介
  • 二、使用步骤
    • 2.1寄存器相关配置
    • 2.2代码解读
  • 总结

前言

  之前我们做延时函数,就是一个for循环,然后不停的计数,然后根据频率去计算具体时间,定时器的原理和这个大致类似,不过他是一个独立的外设,不需要占用总资源。

提示:以下是本篇文章正文内容,下面案例可供参考

一、SysTick 简介

  SysTick—系统定时器是属于 CM4 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于180M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。

  因为 SysTick 是属于 CM4 内核的外设,所以所有基于 CM4 内核的单片机都具有这个系统定时器,使得软件在 CM4 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

二、使用步骤

2.1寄存器相关配置

嵌入式开发学习之--系统定时器前言一、SysTick 简介二、使用步骤总结

  感兴趣的可以查一下芯片手册,这里不赘述了。

2.2代码解读

#include "./systick/bsp_SysTick.h"

static __IO u32 TimingDelay;
 
/**
  * @brief  Æô¶¯ÏµÍ³µÎ´ð¶¨Ê±Æ÷ SysTick
  * @param  ÎÞ
  * @retval ÎÞ
  */
void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1msÖжÏÒ»´Î
	 * SystemFrequency / 100000	 10usÖжÏÒ»´Î
	 * SystemFrequency / 1000000 1usÖжÏÒ»´Î
	 */
	if (SysTick_Config(SystemCoreClock / 100000))
	{ 
		/* Capture error */ 
		while (1);
	}
}

/**
  * @brief   usÑÓʱ³ÌÐò,10usΪһ¸öµ¥Î»
  * @param  
  *		@arg nTime: Delay_us( 1 ) ÔòʵÏÖµÄÑÓʱΪ 1 * 10us = 10us
  * @retval  ÎÞ
  */
void Delay_us(__IO u32 nTime)
{ 
	TimingDelay = nTime;	

	while(TimingDelay != 0);
}

/**
  * @brief  »ñÈ¡½ÚÅijÌÐò
  * @param  ÎÞ
  * @retval ÎÞ
  * @attention  ÔÚ SysTick ÖжϺ¯Êý SysTick_Handler()µ÷ÓÃ
  */
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}
           

  这是野火的定时器代码,简单解读一下:SysTick_Init()通过SysTick_Config()这个函数确定中断频率,然后在此基础上定义一个参数TimingDelay,通过delay_us()是对外获取的值给到TimingDelay,然后在定时器中断中触发一次减一次直到减到0为止,从而实现延时。

总结

  了解一下什么是系统定时器以及用法就好,关于底层的东西了解一下机制然后知道如何配置就行,如想十分透彻的了解再去查就好了。