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定时器特点:
递减:假设计数器的值为 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