ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

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

[复制链接]
617|11
 楼主 | 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

| 2018-5-13 15:55 | 显示全部楼层
没开总中断,需在while(1)前添加 :_asm("rim");//开总中断(此处为开启总中断的方法)
 楼主 | 2018-5-13 16:20 | 显示全部楼层
elife 发表于 2018-5-13 15:55
没开总中断,需在while(1)前添加 :_asm("rim");//开总中断(此处为开启总中断的方法) ...

谢谢指导,

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 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


















//新改了,编译没有错误了,可是还是没有闪灯哎
 楼主 | 2018-5-13 21:00 | 显示全部楼层
为什么我在中断上面这样写:

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

却编译失败呢
| 2018-5-13 21:25 | 显示全部楼层
我的中断函数是在stm8s_it.c中直接添加的,初始化一样,也是IAR的环境。
 楼主 | 2018-5-13 21:34 | 显示全部楼层
xyz549040622 发表于 2018-5-13 21:25
我的中断函数是在stm8s_it.c中直接添加的,初始化一样,也是IAR的环境。

怎么添加???
| 2018-5-13 21:40 | 显示全部楼层
hzocce 发表于 2018-5-13 21:34
怎么添加???

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 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文件中的,
我按上面复制,编译报错,这个报错如何处理啊?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 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的初值是怎么计算出来的呢?

| 2018-5-16 10:31 | 显示全部楼层
enableInterrupts();
 楼主 | 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 呢?
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表