原创 STM32精确延时的实现方法

2008-8-3 20:31 5968 6 8 分类: MCU/ 嵌入式

前面用STM32GPIO模拟液晶驱动时序时遇到一个问题,就是怎样产生一段较为精确的延时。通常产生一小段延时的方法就是利用一个递增或者递减循环进行软件延时。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />



void delay(void)


{


       int i="0x0ff";


       while (i--)


              ;


}


我在使用MPLAB IDE进行PIC单片机的开发时,MPLAB提供了一个Watch(跑表)功能,可以很方便的查看一个函数或一段代码的运行时间,利用这个功能就可以很容易的编写能产生精确延时的代码。而据我目前了解的情况,不管是IAR还是RealView MDK都没有提供类似的功能,这样就不能像上例那样来获得较为精确的延时了。


有人说了,可以用定时器中断的方法来产生精确延时,一点没错,不过在STM32中还可以采用更简单的方法来产生精确延时,那就是利用Cortex系统定时器—SysTick


在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。SysTick的最大使命,就是定期地产生异常请求,作为系统的时基。


点击看大图


SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。SysTick是一个24 位的倒数定时器,当计数值减到0 时,将从RELOAD 寄存器中自动重装载定时初值,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。


SysTick产生精确延时的方法如下:


1、首先对SysTick进行设置


void SysTick_Configuration(void)


{


       /* Configure HCLK clock as SysTick clock source */


       SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系统时钟8分频


       /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */


       SysTick_SetReload(9000); //周期1ms


       /* Enable the SysTick Interrupt */


       SysTick_ITConfig(ENABLE); //打开中断


}


2、延时函数


void SysTick_Delay(u32 nTime)


{


  /* Enable the SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Enable); //允许计数


  TimingDelay = nTime;


while(TimingDelay != 0);


/* Disable SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Disable); //禁止计数


  /* Clear SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Clear); //计数器清0


}


3. 中断函数


void SysTickHandler(void)


{


  TimingDelay_Decrement();


}


4. 中断调用函数


void TimingDelay_Decrement(void)


{


  if (TimingDelay != 0x00)


  {


    TimingDelay--;


  }


}

 


利用以上几个函数就能产生精确延时了,使用时通过调用SysTick_Delay(u32 nTime)函数来设置延时时间,这里提供一个产生秒延时的程序供大家参考。


rar



202e09b8-d50d-4d96-b66d-422b8845565a.jpg


       附上效果图,大家看完不要忘了“顶一下”啊!

文章评论2条评论)

登录后参与讨论

用户1336804 2009-6-12 18:49

你好,我用电电脑调试的时候可以看到PB口的状态,但是用ST LINK 时就不能看到其状态了,为什么呢

用户162074 2008-8-6 14:35

学习了!
相关推荐阅读
用户1560991 2008-12-10 19:55
最简单的C#入门教程
从网上找到的C#学习的好资料! 关于作者:Aisha Ikram        我现在在英国一家软件公司任技术带头人。我是计算机科学的硕士。我主要使用 .NET 1.1/2.0, C#, VB.NET...
用户1560991 2008-12-08 22:40
在C#中加载自己编写的动态链接库(转贴)
        本文主要讲述如何在C#中逐步实现加载自己用C++语言编写的动态链接库,以及在导入时如何进行C#和C++语言的数据类型匹配。 一、发生的背景         在开发新项目中使用了新的语言...
用户1560991 2008-12-08 10:25
新的学习方向
        最近的生活总算恢复正常了,可以静下心来学点东西了!新的学习方向是VC#,以前俺用的是VC++ 6.0,最近看到同学在用VC# 2005,很好很强大,支持快速开发。于是俺就想学学,以后用...
用户1560991 2008-08-08 11:04
基于STM32和nRF905的无线数传系统_软件篇
              STM32与nRF905模块间的电路连好后,剩下的工作就是编写程序了。都说STM32的固件库难用,但俺觉得从中可以学到不少东西,尤其是模块化编程的思想。STM32的固件库将...
用户1560991 2008-08-05 12:58
基于STM32和nRF905的无线数传系统_硬件篇
最近搞到一对nRF905无线模块,迫不及待的拿出来给大伙瞧瞧。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:...
EE直播间
更多
我要评论
2
6
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /5 下一条