一、SysTick使用详解
1. SysTick简介
SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。
2. SysTick相关寄存器
状态寄存器-CTRL
STCLK外部时钟源:AHB总线时钟的 1/8
FCLK 内部时钟:AHB总线时钟——STM32F103是72MHz
重装载数值寄存器-LOAD
当前值寄存器-VAL
校准寄存器-CALIB
二、编写精准延时——delay
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void delay_s(u16 s);
void delay_ms(u16 ms);
void delay_us(u32 us);
#endif
delay.c
#include "delay.h"
#define AHB_INPUT 72 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)
void delay_us(u32 uS) //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)
{
u32 temp;
SysTick->LOAD=AHB_INPUT*uS; //重装计数初值(当主频是72MHz,72次为1微秒)
SysTick->VAL=0x00; //清空定时器的计数器
SysTick->CTRL=0x00000005; //内部时钟FCLK,打开定时器
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00000004; //关闭定时器
SysTick->VAL=0x00; //清空定时器的计数器
}
void delay_ms(u16 ms) //mS毫秒级延时程序(参考值即是延时数,最大值65535)
{
while( ms-- != 0)
{
delay_us(1000); //调用1000微秒的延时
}
}
void delay_s(u16 s) //S秒级延时程序(参考值即是延时数,最大值65535)
{
while( s-- != 0)
{
delay_ms(1000); //调用1000毫秒的延时
}
}