STM32-延时函数(基于SysTick)
1.SysTick介绍
1.1 简介
SysTick 叫做系统滴答时钟、系统定时器,属于 Cortex-M3 内核中的一个外设(外围设备),被捆绑在NVIC中,用来产生SYSTICK异常(异常号:15)。以前,大多数操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。这个定时器专用于实时操作系统,是为操作系统而设计的。
SysTick是一个24bit、向下递减的计数器,当计到0时,从RELOAD寄存器中自动重装载定时初值。
注意:
1.2 工作原理

2.延时函数
2.1 微秒延时函数(uS)
#define AHB_INPUT 72 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz) 以1us来定的
void delay_us(u32 uS){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)
SysTick->CTRL = 0;
SysTick->LOAD=AHB_INPUT*uS - 1;//重装计数初值(当主频是72MHz,72次为1微秒)
SysTick->VAL=0x00; //清空定时器的计数器
SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
while(!(SysTick->CTRL&0x00010000)); //等待计数到0
SysTick->CTRL=0;//关闭定时器
}
2.2 毫秒级延时函数(mS)
void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)
while( ms-- != 0){
delay_us(1000); //调用1000微秒的延时
}
}
//或者
void delay_ms2(uint32_t ms)
{
while(ms --)
{
SysTick->CTRL = 0; // 关闭系统定时器后才能配置寄存器
SysTick->LOAD = 72000 - 1; // 设置计数值,用于设置定时的时间
SysTick->VAL = 0; // 清空当前值还有计数标志位
SysTick->CTRL = 5; // 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
while(!(SysTick->CTRL&0x00010000)); //等待计数到0
SysTick->CTRL = 0; // 关闭系统定时器
}
}
2.3 秒级延时函数(S)
void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)
while( s-- != 0){
delay_ms(1000); //调用1000毫秒的延时
}
}
2.4 delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
#define uint32_t u32
#define uint16_t u16
#define uint8_t u8
void delay_us(u32 us);
void delay_ms(u16 ms);
void delay_ms2(uint32_t ms);
void delay_s(u16 s);
#endif
2.5 delay.c
#include "delay.h"
#define AHB_INPUT 72 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz) 以1us来定的
/*
1S 72 000 000
1ms 72 000
1us 72
*/
//微秒(us)
void delay_us(u32 us){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)
SysTick->CTRL = 0;
SysTick->LOAD=AHB_INPUT*us - 1;//重装计数初值(当主频是72MHz,72次为1微秒)
SysTick->VAL=0x00; //清空定时器的计数器
SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
while(!(SysTick->CTRL&0x00010000)); //等待计数到0
SysTick->CTRL=0;//关闭定时器
}
//毫秒(ms)
void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)
while( ms-- != 0){
delay_us(1000); //调用1000微秒的延时
}
}
//或者
void delay_ms2(u32 ms)
{
while(ms --)
{
SysTick->CTRL = 0; // 关闭系统定时器后才能配置寄存器
SysTick->LOAD = 72000 - 1; // 设置计数值,用于设置定时的时间
SysTick->VAL = 0; // 清空当前值还有计数标志位
SysTick->CTRL = 5; // 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
while(!(SysTick->CTRL&0x00010000)); //等待计数到0
SysTick->CTRL = 0; // 关闭系统定时器
}
}
//秒(S)
void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)
while( s-- != 0){
delay_ms(1000); //调用1000毫秒的延时
}
}
结束语
以上就是对基于SysTick的延时函数的一个总结。
作者:加油1234