设计起因
使用TIM时钟做延时,很浪费TIM,为了充分利用STM32时钟的使用,我们使用很精确的系统时钟来做延时。
代码
Delay.c
//延时函数初始化
#include "stm32f10x.h"
#include "Delay.h"
void Delay_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟
}
//微秒延时
void Delay_us(u16 n)
{
u32 temp;
SysTick->LOAD = n * 9; //时间加载
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; //清空计数器
}
//毫秒延时
void Delay_ms(u16 n)
{
u32 temp;
SysTick->LOAD = (u32)n * 9000; //时间加载
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; //清空计数器
}
//秒延时
void Delay_s(u16 n)
{
for (u16 x = 0; x < n; x++)
{
u32 temp;
SysTick->LOAD = 9000000; //时间加载
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.h
#ifndef __DELAY_H
#define __DELAY_H
extern void Delay_Init(void);
extern void Delay_ms(u16 n);
extern void Delay_us(u16 n);
extern void Delay_s(u16 n);
#endif
使用方法
1、在mian函数里调用Delay.h头文件,并调用Delay_Init()初始化延时函数;
2、使用Delay_us()来进行微秒级别延时,延时几微秒,括号内就填上几;
3、使用Delay_ms()来进行毫秒级别延时,延时几毫秒,括号内就填上几;
4、使用Delay_s()来进行秒级别延时,延时几秒,括号内就填上几;