大家还记得那个从教科书里消失的鲁迅吗?
他跟那修电脑的没什么关系。。。
当然,今天的故事跟猹也没半毛钱关系。。
还记得孔乙己吗?
小伙伴们都知道“茴”有4种写法对吧。
其实呢,
延时应该也可以分
4种写法,
一种i循环法,一种时钟周期法,一种定时器中断法,一种定时器非中断法。
然后i循环法又可以再细分为for,wile, 还有do wile的写法,如果再跟swith语句组合一下,那就更复杂了。
假设有n种循环法,任选2种组合,那么可以组出n!/(n-2)!种组合。显然的,当n为4的时候,有12种写法。:lol
1、先介绍用i循环软跑的软延时吧。函数如下
void microDelay1(uint32_t i)
{
uint32_t j=0;
for(;i>0;i--)
{
for(j=0;j<12;j++);
}
}
i循环软延时的精度一般般,也就点灯水平,用来做单总线通信会挂的。
2、 时钟周期也可以实现延时,用到的是nop函数。函数如下
void microDelay2(uint32_t i)
{
for(; i > 0; i--)
{
__nop();
__nop();
__nop();
__nop();
}
}
这个延时依然精度不高,无法胜任单总线通信的时间精度要求。
3、 第三种是SysTick定时器中断法,在中断里把time delay依次递减到0完成延时,代码如下
uint32_t time_delay;
void microDelay3(uint32_t i)
{
if (SysTick_Config( 72000000 /1000000))
while (1)
{}
time_delay=i;
while(time_delay)
{}
SysTick->CTRL=0X00000000;
SysTick->VAL =0X00000000;
}
void SysTick_Handler(void)
{
if(time_delay)
time_delay--;
}
这个精度不错,可以用于实现单总线通讯,但是在别的中断里用单总线的读取函数就不方便了。
4、 最后一种是我要推荐的,使用方便,而且精度可以,用非中断的方式使用SysTick定时器。函数如下
void microDelay4(uint32_t i)
{
SysTick->LOAD=i*9;
SysTick->CTRL|=0x01;
while(!(SysTick->CTRL&(1<<16)));
SysTick->CTRL=0X00000000;
SysTick->VAL=0X00000000;
}
好了,4种延时函数介绍完毕。接下来就可以用这四种延时来花式点灯了。:lol
最后,感谢OneNET和云汉提供的这次评测机会,我会在接下来的文章里多发一点干货,与大伙儿一起学习和分享该开发板的相关知识。
大家还记得那个从教科书里消失的鲁迅吗?
他跟那修电脑的没什么关系。。。
当然,今天的故事跟猹也没半毛钱关系。。
还记得孔乙己吗?
小伙伴们都知道“茴”有4种写法对吧。
其实呢,
延时应该也可以分
4种写法,
一种i循环法,一种时钟周期法,一种定时器中断法,一种定时器非中断法。
然后i循环法又可以再细分为for,wile, 还有do wile的写法,如果再跟swith语句组合一下,那就更复杂了。
假设有n种循环法,任选2种组合,那么可以组出n!/(n-2)!种组合。显然的,当n为4的时候,有12种写法。:lol
1、先介绍用i循环软跑的软延时吧。函数如下
void microDelay1(uint32_t i)
{
uint32_t j=0;
for(;i>0;i--)
{
for(j=0;j<12;j++);
}
}
i循环软延时的精度一般般,也就点灯水平,用来做单总线通信会挂的。
2、 时钟周期也可以实现延时,用到的是nop函数。函数如下
void microDelay2(uint32_t i)
{
for(; i > 0; i--)
{
__nop();
__nop();
__nop();
__nop();
}
}
这个延时依然精度不高,无法胜任单总线通信的时间精度要求。
3、 第三种是SysTick定时器中断法,在中断里把time delay依次递减到0完成延时,代码如下
uint32_t time_delay;
void microDelay3(uint32_t i)
{
if (SysTick_Config( 72000000 /1000000))
while (1)
{}
time_delay=i;
while(time_delay)
{}
SysTick->CTRL=0X00000000;
SysTick->VAL =0X00000000;
}
void SysTick_Handler(void)
{
if(time_delay)
time_delay--;
}
这个精度不错,可以用于实现单总线通讯,但是在别的中断里用单总线的读取函数就不方便了。
4、 最后一种是我要推荐的,使用方便,而且精度可以,用非中断的方式使用SysTick定时器。函数如下
void microDelay4(uint32_t i)
{
SysTick->LOAD=i*9;
SysTick->CTRL|=0x01;
while(!(SysTick->CTRL&(1<<16)));
SysTick->CTRL=0X00000000;
SysTick->VAL=0X00000000;
}
好了,4种延时函数介绍完毕。接下来就可以用这四种延时来花式点灯了。:lol
最后,感谢OneNET和云汉提供的这次评测机会,我会在接下来的文章里多发一点干货,与大伙儿一起学习和分享该开发板的相关知识。