【WB32库开发】第5章 SysTick——系统定时器

“SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC中,它是一个24位向下递减的定时器每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,一般设置系统时钟为芯片的主频时钟,亦可设置为系统时钟的8分频(WB32的主频时钟为96MHz)。SysTick定时器通常应用在操作系统中,为其提供时钟周期。”

本章节主要目的就一个,学会使用SysTick实现us与ms的精准延时代替不精确的软件延时(对实现原理感兴趣的期待后续教程)。
为此设计一个实验帮助大家理解。

5.1 SysTick定时实验

5.1.1硬件设计
SysTick属于单片机内部的外设,不需要额外的硬件电路,仅需搭配WB32板载LED即可完成本次实验。
5.1.2软件设计
本次软件设计使用一个简洁的代码写法,已知SysTick的counter从reload值往下递减到0的时候,CTRL寄存器的位16:countflag会置1,且读取该位的值可清0,所以可以通过软件查询的方法来实现延时。

推荐使用第4章中点亮LED例程进行实验,可帮助初学者快速上手。
1)在USER文件中建立systick文件夹。
在这里插入图片描述

并新建bsp_systick.c与bsp_systick.h文件(亦可在KEIL中创建并保存,依据个人操作习惯)。
在这里插入图片描述

进入KEIL中,将bsp_systick.c文件添加到USER中,再点击进入魔术棒将bsp_systick.h所在目录包含进去。
在这里插入图片描述
在这里插入图片描述

2)点击进入bsp_systick.c,将以下程序拷贝进去。

#include "bsp_systick.h"

void SysTick_Delay_us(uint32_t us)  //微秒延时函数
{	
	uint32_t i;
	SysTick_Config(96);
	
	for(i=0;i<us;i++) 
	{
		//当计数值减到0时,CTRL寄存器中位16置1
		//当置1时,读取该位就会清0
		while( !((SysTick->CTRL  ) & (1<<16)) );
	}
	
	SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; 
}

void SysTick_Delay_ms(uint32_t ms)   //毫秒延时函数
{	
	uint32_t i;
	SysTick_Config(96000);
	
	for(i=0;i<ms;i++)
	{
		//当计数值减到0时,CTRL寄存器中位16置1
		//当置1时,读取该位就会清0
		while( !((SysTick->CTRL  ) & (1<<16)) );
	}
	
	SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; 
}

3)打开bsp_systick.h文件,将以下程序拷贝进去。

#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H

#include "wb32f10x.h"
#include "core_cm3.h"  //后续讲解此处为何包含"core_cm3.h"

void SysTick_Delay_us(uint32_t us);     //函数声明
void SysTick_Delay_ms(uint32_t ms);		//函数声明

#endif /* __BSP_SYSTICK_H */

4)led函数可以直接调用
5)main函数

#include "wb32f10x.h"
#include "bsp_led.h"
#include "bsp_systick.h"

int main(void)
{
	LED_GPIO_Config();      //led函数初始化
	
  while (1)
  {
	LED_Toggle;             //led状态翻转
    SysTick_Delay_ms(1000); //延时1000ms(1s)
  }
}

5.1.3 烧录调试
程序通过编译烧录到WB32后,可以观察到开发板板载LED灯有规律的闪烁。手边有示波器,亦可通过查看LED引脚输出的波形来查看延时是否精准。
如果想改变LED闪烁的时间可以修改main函数中传入SysTick_Delay_ms()的值,例,想改为2s的闪烁间隔即将1000修改为2000。

5.2小结
在上一章的例程中我们使用到通过空循环来延时的软件延时函数,但软件延时是不准确的,在涉及到需要精准延时的工程时,软件延时产生的误差可能会严重脱离工程预期,所以,在一些展示型工程中我们可以使用软件延时,但涉及到对时间精度有一定要求的工程还是使用SysTick系统定时器产生的延时较好。
本章仅展示了如何使用SysTick进行微秒和毫秒的延时,由于我们在编写代码时使用模块化封装,亦可将此精准延时函数用在其他工程中,使用时仅需将systick文件夹复制到新工程所在USE文件夹下,然后在程序内调用到SysTick_Delay_us()或SysTick_Delay_ms()延时函数的文件下包含"bsp_systick.h"即可。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值