STM32的定时有很多,主要包括通用定时器和高级定时器,它们的用法和功能也很多,有了高效的定时器,STM32才能实现很多功能。其中Systick定时器算是一种特殊的定时器,它应该不属于STM32,准确的说应该是属于Corte M3内核的一种定时器,详细可以参照Cortex-M3权威指南(中文版详尽版)来仔细研究一下,如果使用RTOS这个定时器应该会经常用到,是来做实时系统的心跳最适合不过了。所以又叫滴答定时器。这里简单的使用它来实现一下us级和ms级的延时函数,来小试一下它的强大功能。
首先看一下相关寄存器
之后看一下控制状态寄存器CTRL用到的几个位
最后在来看一下关于这个定时器的有关函数
下面是用滴答定时器来实现的两个延时函数,应该是软件延时吧!
#include "SysTick.h"
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数
void SysTick_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择定时器的时钟
fac_us=SystemCoreClock/8000000; //确定延时倍数 9M/s 如果需要1ns的延时就是9
fac_ms=(u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //将需要的定时时间装入预装载寄存器中
SysTick->VAL=0x00; //清零
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //使能定时器 开始倒数
do{
temp=SysTick->CTRL; //获取当前定时器状态
}while((temp&0x01)&&!(temp&(1<<16))); //判断使能为1 和CTRL最高位是否为1 如果为1 则计时结束
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //不使能定时器
SysTick->VAL =0X00;
}
void delay_ms(u32 nms)
{
u32 temp;
SysTick->LOAD=nms*fac_ms;
SysTick->VAL=0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
以上两个函数delay_ms和delay_us就可以直接调用了用来软件延时了,记得一定要先初始化才能使用