8. STM32——系统定时器SysTick

SysTick 配置库函数

固件库函数 在 core_cm3.h 中

在这里插入图片描述

// 这个 固件库函数 在 core_cm3.h 中
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
	// reload 寄存器为 24bit,最大值为 2^24
	if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
	
	// 配置 reload 寄存器的初始值
	SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
	
	// 配置中断优先级为 1<<4 -1 = 15,优先级为最低
	NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
	
	// 配置 counter 计数器的值
	SysTick->VAL = 0;

	// 配置 systick 的时钟为 72M
	// 使能中断
	// 使能 systick
	SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
	SysTick_CTRL_TICKINT_Msk |
	SysTick_CTRL_ENABLE_Msk;
	return (0);
}

SysTick 中断时间的计算

SysTick 定时器的计数器是向下递减计数的,计数一次的时间 TDEC=1/CLKAHB,当重装
载 寄 存 器 中 的 值 VALUELOAD 减 到 0 的 时 候 , 产 生 中 断 , 可 知 中 断 一 次 的 时 间
TINT=VALUELOAD * TDEC= VALUELOAD/CLKAHB ,其中 CLKAHB =72MHZ 。 如果设置
VALUELOAD为 72,那中断一次的时间 TINT=72/72M=1us。不过 1us 的中断没啥意义,整个
程序的重心都花在进出中断上了,根本没有时间处理其他的任务。

SysTick_Config(SystemCoreClock / 100000))

SysTick_Config()的形我们配置为 SystemCoreClock / 100000=72M/100000=720,从
刚刚分析我们知道这个形参的值最终是写到重装载寄存器 LOAD 中的,从而可知我们现在
把 SysTick 定时器中断一次的时间 TINT=720/72M=10us。

定时编程

我们知道,systick 的 counter 从 reload
值往下递减到 0 的时候,CTRL 寄存器的位 16: countflag 会置 1,且读取该位的值可清 0,
所以我们可以使用软件查询的方法来实现延时。

在这里插入图片描述

在这里插入图片描述

通俗来讲

计数器的值从72000 开始减 减到0就是代表计数1s 完成,然后我们需要去判断一下这个计数器有没有减到0,我们需要去判断 ctrl 寄存器,如果减到0 那就跳出while这个循环

没有就卡在里面 ,等到计数器减到0

因为减到0,16位置一 while 循环结束

systick 毫秒级(ms)延时

void delay_ms(uint32_t ms)
{
	uint32_t i;
	
	SysTick_Config(72000);
	
	for(i=0;i<ms;i++)
	{
		// 当计数器的值减小到 0 的时候,CRTL 寄存器的位 16 会置 1
		// 当置 1 时,读取该位会清 0
		while( !(SysTick->CTRL & (1<<16)) ) //不断判断SysTick->CTRL寄存器第16位是否置1,是则卡死,while 循环结束
	}
	SysTick->CTRL &=~ ysTick_CTRL_ENABLE_Msk; //关闭 SysTick 定时器
}

systick 微秒级延时

void delay_ms(uint32_t us)
{
	uint32_t i;
	
	SysTick_Config(72);
	
	for(i=0;i<us;i++)
	{
		// 当计数器的值减小到 0 的时候,CRTL 寄存器的位 16 会置 1
		// 当置 1 时,读取该位会清 0
		while( !(SysTick->CTRL & (1<<16)) )
	}
	SysTick->CTRL &=~ ysTick_CTRL_ENABLE_Msk;
}

代码整合

SysTick.c

#include "SysTick.h"
#include "stm32f10x.h"

void delay_ms(uint32_t ms)
{
		uint32_t i;
		
		SysTick_Config(72000);
		
		for(i=0;i<ms;i++)
		{
				while( !(SysTick->CTRL & (1<<16)) );
		}
		
		SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

void delay_us(uint32_t us)
{
		uint32_t i;
		
		SysTick_Config(72);
		
		for(i=0;i<us;i++)
		{
				while( !(SysTick->CTRL & (1<<16)) );
		}
		
		SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

SysTick.h

#include "stm32f10x.h"

void delay_ms(uint32_t ms);
void delay_us(uint32_t us);

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值