延时函数是单片机的重中之重,本章主要讲三种方法实现延时,分别是滴答计数器,定时器和循环。
循环:
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000; //自己定义
while(i--) ;
}
}
滴答计数器:
void delay_init(uint32_t sysclk)
{
// SysTick时钟 = HCLK / 8
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 先关闭定时器
SysTick->LOAD = 0xFFFFFF; // 设置最大重装载值
SysTick->VAL = 0; // 让定时器从开始计数
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 选择HCLK作为时钟源
fac_us = sysclk / 1000000; // 计算每微秒的tick数
}
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD = nus * fac_us;
SysTick->VAL = 0; // 让定时器从开始计数
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
do {
temp = SysTick->CTRL;
} while ((temp & SysTick_CTRL_COUNTFLAG_Msk) == 0);
SysTick->CTRL = 0; // 关闭定时器
}
void delay_ms(uint32_t nms)
{
while (nms--)
{
delay_us(1000); // 逐个毫秒延时
}
}