打印
[STM8]

STM8定时器时间,是怎么算出来的?

[复制链接]
3944|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzocce|  楼主 | 2018-5-13 15:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hzocce 于 2018-5-24 15:12 编辑

#include "stm8s.h"


#include <string.h>
#include <stdio.h>

void Time1(void)
{


TIM1_DeInit();
TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1,0);//300us
TIM1_ARRPreloadConfig(ENABLE);//使能自动重装
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//数据更新中断
TIM1_Cmd(ENABLE);//开定时器
}



void main(void)
{

  Time1();
  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);

  enableInterrupts();


  while (1)
  {


  }

}


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{


        static u16 j=0;
      if(j<1)
      {
        j++;
      }
      else
      {
        j=0;
        GPIO_WriteReverse(GPIOD,GPIO_PIN_0);

      }
      TIM1_ClearITPendingBit(TIM1_IT_UPDATE);


}







#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)
{

  while (1)
  {
  }
}
#endif

沙发
elife| | 2018-5-13 15:55 | 只看该作者
没开总中断,需在while(1)前添加 :_asm("rim");//开总中断(此处为开启总中断的方法)

使用特权

评论回复
板凳
hzocce|  楼主 | 2018-5-13 16:20 | 只看该作者
elife 发表于 2018-5-13 15:55
没开总中断,需在while(1)前添加 :_asm("rim");//开总中断(此处为开启总中断的方法) ...

谢谢指导,

可是我加了后,出现这样的提示,怎么办啊?

T.png (319.06 KB )

T.png

使用特权

评论回复
地板
hzocce|  楼主 | 2018-5-13 16:24 | 只看该作者

#include "stm8s.h"


#include <string.h>
#include <stdio.h>

void Time1(void)
{


TIM1_DeInit();
TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,0);
TIM1_ARRPreloadConfig(ENABLE);//使能自动重装
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//数据更新中断
TIM1_Cmd(ENABLE);//开定时器
}





void main(void)
{

  Time1();
  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
  

  GPIO_WriteHigh(GPIOA,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOD,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOE,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOD,GPIO_PIN_0);
  enableInterrupts();
  

  while (1)
  {
   
   
  }
  
}


__interrupt void TIM1_OVR_UIF(void)

{
      static u16 j=0; //定义变量j类型为u16,static定义了 变量j的生存周期
      if(j<60000)//判断 j当前的数值是否小于60000
      {
        j++;//计数器 j 加1  也可以写成  j=j+1;
      }
      else//如果大于等于100 执行下面这个分支
      {
        j=0;//计数器 j 清零
        GPIO_WriteReverse(GPIOD,GPIO_PIN_0);
         GPIO_WriteReverse(GPIOA,GPIO_PIN_3);
          GPIO_WriteReverse(GPIOC,GPIO_PIN_3);
           GPIO_WriteReverse(GPIOE,GPIO_PIN_3);
      }
      TIM1_ClearITPendingBit(TIM1_IT_UPDATE);//清除更新标

}


#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)
{

  while (1)
  {
  }
}
#endif


















//新改了,编译没有错误了,可是还是没有闪灯哎

使用特权

评论回复
5
hzocce|  楼主 | 2018-5-13 21:00 | 只看该作者
为什么我在中断上面这样写:

#pragma vector=0x0d
__interrupt void TIM1_IRQHandler(void)
{
}

却编译失败呢

使用特权

评论回复
6
xyz549040622| | 2018-5-13 21:25 | 只看该作者
我的中断函数是在stm8s_it.c中直接添加的,初始化一样,也是IAR的环境。

使用特权

评论回复
7
hzocce|  楼主 | 2018-5-13 21:34 | 只看该作者
xyz549040622 发表于 2018-5-13 21:25
我的中断函数是在stm8s_it.c中直接添加的,初始化一样,也是IAR的环境。

怎么添加???

使用特权

评论回复
8
xyz549040622| | 2018-5-13 21:40 | 只看该作者
hzocce 发表于 2018-5-13 21:34
怎么添加???

在官方库的例程中直接复制的。你也直接复制就好。


使用特权

评论回复
9
hzocce|  楼主 | 2018-5-14 08:15 | 只看该作者
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.
  */
}

/**
  * @brief Timer1 Capture/Compare Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
}





上面是stm8s_it.c文件中的,
我按上面复制,编译报错,这个报错如何处理啊?

编译报错.png (419.82 KB )

编译报错.png

使用特权

评论回复
10
hzocce|  楼主 | 2018-5-16 09:52 | 只看该作者
本帖最后由 hzocce 于 2018-5-16 10:41 编辑

#include "stm8s.h"


#include <string.h>
#include <stdio.h>

void Time1(void)
{


TIM1_DeInit();
TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,0);
TIM1_ARRPreloadConfig(ENABLE);//使能自动重装
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//数据更新中断
TIM1_Cmd(ENABLE);//开定时器
}



void main(void)
{

  Time1();
  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
  

  GPIO_WriteHigh(GPIOA,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOD,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOE,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOD,GPIO_PIN_0);
  enableInterrupts();
  

  while (1)
  {
   
   
  }
  
}


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{

  
        static u16 j=0; //定义变量j类型为u16,static定义了 变量j的生存周期
      if(j<1)//判断 j当前的数值是否小于60000
      {
        j++;//计数器 j 加1  也可以写成  j=j+1;
      }
      else//如果大于等于100 执行下面这个分支
      {
        j=0;//计数器 j 清零
        GPIO_WriteReverse(GPIOD,GPIO_PIN_0);

      }
      TIM1_ClearITPendingBit(TIM1_IT_UPDATE);//清除更新标


}







#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)
{

  while (1)
  {
  }
}
#endif




现在有闪烁了,得出来的频率是32ms ,
程序如上。

这个STM8的初值是怎么计算出来的呢?
这个STM8的初值是怎么计算出来的呢?
这个STM8的初值是怎么计算出来的呢?

使用特权

评论回复
11
sky.sun.zz| | 2018-5-16 10:31 | 只看该作者
enableInterrupts();

使用特权

评论回复
12
hzocce|  楼主 | 2018-5-24 15:14 | 只看该作者
#include "stm8s.h"


#include <string.h>
#include <stdio.h>

void Time1(void)
{


TIM1_DeInit();
TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1,0);//300us
TIM1_ARRPreloadConfig(ENABLE);//使能自动重装
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//数据更新中断
TIM1_Cmd(ENABLE);//开定时器
}



void main(void)
{

  Time1();
  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOE, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);

  enableInterrupts();
  

  while (1)
  {
   
   
  }
  
}


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{

  
        static u16 j=0;
      if(j<1)
      {
        j++;
      }
      else
      {
        j=0;
        GPIO_WriteReverse(GPIOD,GPIO_PIN_0);

      }
      TIM1_ClearITPendingBit(TIM1_IT_UPDATE);


}







#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)
{

  while (1)
  {
  }
}
#endif




//16M的晶振,为什么用示波器测量出来的时间是300US 呢?

使用特权

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

本版积分规则

127

主题

561

帖子

4

粉丝