69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
#include "systick.h"
|
|
|
|
// 用于记住每一微妙的时钟计数
|
|
volatile static u8 fac_us = 0;
|
|
// 用于记住每一毫秒妙的时钟计数
|
|
volatile static u16 fac_ms = 0;
|
|
|
|
// 初始化 systick
|
|
void systick_init(void)
|
|
{
|
|
// 初始化 SysTick 的时钟为外部时钟
|
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
|
|
fac_us = SYSCLK / 8;
|
|
fac_ms = SYSCLK / 8 * 1000;
|
|
}
|
|
|
|
// 延时 us 微秒
|
|
void delay_us(u32 us)
|
|
{
|
|
// 用于保存寄存器状态
|
|
u32 temp;
|
|
// 设置重加载值
|
|
SysTick->LOAD = us * fac_us;
|
|
// 清空当前值
|
|
SysTick->VAL = 0;
|
|
// 使能 SysTick
|
|
SysTick->CTRL |= 0x1;
|
|
// 循环等待定时器到时
|
|
do
|
|
{
|
|
temp = SysTick->CTRL;
|
|
} while (!(temp & (1 << 16)) && (temp & 0x1));
|
|
// 关闭 SysTick 定时器
|
|
SysTick->CTRL &= ~0x01;
|
|
// 当前计数清零
|
|
SysTick->VAL = 0;
|
|
}
|
|
|
|
// 延时 ms 毫秒
|
|
void delay_ms(u32 ms)
|
|
{
|
|
// 用于保存寄存器状态
|
|
u32 temp;
|
|
// 设置重加载值
|
|
SysTick->LOAD = ms * fac_ms;
|
|
// 清空当前值
|
|
SysTick->VAL = 0;
|
|
// 使能 SysTick
|
|
SysTick->CTRL |= 0x1;
|
|
// 循环等待定时器到时
|
|
do
|
|
{
|
|
temp = SysTick->CTRL;
|
|
} while (!(temp & (1 << 16)) && (temp & 0x1));
|
|
// 关闭 SysTick 定时器
|
|
SysTick->CTRL &= ~0x01;
|
|
// 当前计数清零
|
|
SysTick->VAL = 0;
|
|
}
|
|
|
|
// 延时 second 秒
|
|
void delay_s(u32 second)
|
|
{
|
|
while (second--)
|
|
{
|
|
delay_ms(1000);
|
|
}
|
|
}
|