嵌入式开发学习之--系统定时器
本章主要学习系统定时器,并用系统定时器来做一个延时函数。
文章目录
前言
一、SysTick 简介
二、使用步骤
2.1寄存器相关配置
2.2代码解读
总结
前言
之前我们做延时函数,就是一个for循环,然后不停的计数,然后根据频率去计算具体时间,定时器的原理和这个大致类似,不过他是一个独立的外设,不需要占用总资源。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SysTick 简介
SysTick—系统定时器是属于 CM4 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于180M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为 SysTick 是属于 CM4 内核的外设,所以所有基于 CM4 内核的单片机都具有这个系统定时器,使得软件在 CM4 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
二、使用步骤
2.1寄存器相关配置
感兴趣的可以查一下芯片手册,这里不赘述了。
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为止,从而实现延时。
总结
了解一下什么是系统定时器以及用法就好,关于底层的东西了解一下机制然后知道如何配置就行,如想十分透彻的了解再去查就好了。