一个程序需要延时,我往往做2个延时就够用了,一个用节拍定时器做的延时,毫秒级别的,一个US级别的,偶尔用下。本人觉得一个工程有这2个延时基本够用了。
/****************************************************
函数功能:滴滴定时器初始化
输入参数:SYSCLK : 系统时钟
输出参数:无
备 注:无
*****************************************************/
void Ticker_Init(u8 SYSCLK,u16 tickerTime)
{
u32 x;
// SysTick->CTRL &=~BIT(2);//选择外部时钟
// SysTick->CTRL &=~BIT(1);//关闭定时器减到0后的中断请求
// fac_us = SYSCLK/8;//计算好SysTick加载值
// fac_ms = (u16)fac_us*1000;
SysTick->CTRL &=~BIT(2);//选择外部时钟
SysTick->CTRL |=BIT(1);//关闭定时器减到0后的中断请求
x = SYSCLK/8;//计算好SysTick加载值
x = 1000*tickerTime-1;
SysTick->LOAD=x;
SysTick->VAL = 1;//随便写个值,清除加载寄存器的值
SysTick->CTRL |= BIT(0);//SysTick使能
}
/*
滴答定时器中断,上面滴答定时器初始化节拍时间,假设5MS
*/
void SysTick_Handler(void)
{
SYS_Ticker=1; //节拍标志,MS级别,程序基本延时由此完成 ,或者下面的累加变量完成等
bus_count++;
}
/*
us级别延时,不影响滴滴定时器的运行,虽然可以定时很长,建议多用在延时小于一个节拍时间的场合,用在不经常运行的地方。
滴答定时器运行就行了,不会造成死循环。
*/
void delay_us(u32 x)//可以延时大于节拍时间的us时间
{
u32 new_load,old_load,cmp_load=0,tickers;
tickers=x;//根据滴滴定时器修改,比如滴滴定时器跑8M,则 tickers=x*8;
old_load=SysTick->VAL;
while(1)
{
new_load=SysTick->VAL;
if(new_load!=old_load)
{
if(new_load<old_load)
cmp_load+=old_load-new_load;
else
cmp_load+=SysTick->LOAD+old_load-new_load;
old_load=new_load;
if(cmp_load>=tickers)break;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你测试一下就知道了,都是准的。
一周热门 更多>