打印
[STM8]

用定时器精确延时

[复制链接]
1135|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
从此消失|  楼主 | 2014-10-12 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我看过很多例程,精确延时貌似只是把定时器开了,并没有关断定时器,可能表达不清楚,我上代码
#include "stm8s.h"
#include "sysclock.h"

uint32_t  X;
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint32_t Y)
{
X=Y;
TIM1_Cmd(ENABLE);
while(X!=0);

}


int main(void)
{

  /* 设置外部24M晶振为系统时钟 */
  //SystemClock_Init(HSE_Clock);
   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   GPIO_Init(GPIOD, GPIO_PIN_4 ,GPIO_MODE_OUT_PP_LOW_FAST);
     TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 0x00);
      TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
     TIM1_ARRPreloadConfig(ENABLE);


   __enable_interrupt();
  while (1)
  {
    /*放置你的代码*/


GPIO_WriteReverse(GPIOD, GPIO_PIN_4);

  Delay(100);
  }

}
下面是中断程序,我是这么写的,我的意思是其实每次程序都进来中断的,只不过我们利用了他计数而已
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  if(X!=0)
  {
    X--;
   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
  }

}
大多数例程是这样的,这样是不是很浪费?
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  if(X!=0)
  {
    X--;

  }
     TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}

由此想到了stm32的滴答计时器,貌似很多例程也是只见看不见关,但是我上面贴的stm8的代码(我自己写的那个)个人感觉不会重复进入,发帖的目的就是想知道,stm32滴答他没关断会不会重复进入中断?我感觉是会的。。。如果会,那些例程是不是不够严谨。--------菜鸟求教
沙发
mmuuss586| | 2014-10-12 14:32 | 只看该作者
不关,你延时后,程序不处理也没什么关系;
下次需要延时的时候,重新配置下,滴答定时器,相关变量;
程序加些容错处理,应该没啥问题;

网上的程序一般只是初步功能的实现,你产品上用的话,就必须加些容错处理;
包括关定时器;

使用特权

评论回复
板凳
jxmzzr| | 2014-10-12 17:06 | 只看该作者
代码太长也是程序不稳定的原因之一哦,
滥用 用错 使程序不稳定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

148

帖子

0

粉丝