44 lines
1.5 KiB
C
44 lines
1.5 KiB
C
#include "delay.h"
|
|
|
|
static uint32_t fac_us = 0; // us延时倍乘数
|
|
static uint32_t fac_ms = 0; // ms延时倍乘数
|
|
|
|
// 初始化延迟函数
|
|
void delay_init(void)
|
|
{
|
|
// 配置SysTick为外部时钟源(HCLK/8)
|
|
SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 选择外部时钟源 HCLK/8
|
|
fac_us = SystemCoreClock / 8000000; // 为系统时钟的1/8
|
|
fac_ms = (uint32_t)fac_us * 1000; // 代表每个ms需要的systick时钟数
|
|
}
|
|
|
|
// 延时nus微秒
|
|
void delay_us(uint32_t nus)
|
|
{
|
|
uint32_t 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))); // 等待时间到达
|
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
|
|
SysTick->VAL = 0X00; // 清空计数器
|
|
}
|
|
|
|
// 延时nms毫秒
|
|
void delay_ms(uint16_t nms)
|
|
{
|
|
uint32_t temp;
|
|
SysTick->LOAD = (uint32_t)nms * fac_ms; // 时间加载(SysTick->LOAD为24bit)
|
|
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; // 清空计数器
|
|
}
|