【OneNET麒麟座开发板试用体验】11、点灯——延时的4种写法

  • xukejing
  • LV5工程师
  • |      2017-06-25 20:58:30
  • 浏览量 971
  • 回复:1
大家还记得那个从教科书里消失的鲁迅吗? 他跟那修电脑的没什么关系。。。 当然,今天的故事跟猹也没半毛钱关系。。 还记得孔乙己吗? 小伙伴们都知道“茴”有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和云汉提供的这次评测机会,我会在接下来的文章里多发一点干货,与大伙儿一起学习和分享该开发板的相关知识。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:3
JESSE7 2017-08-16
我没把鲁迅和鲁大师联系在一起啊,你咋不把鲁班和鲁大师放一起呢:),这样你就扯不到茴的四种写法了
0   回复
举报
发布
公子1号 2017-08-15
对于文章开篇,大写一个“服”给你~:lol
0   回复
举报
发布
514872737@qq.co 2017-08-15
图片亮了,哪里下载的?
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子