打印
[STM32F1]

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

[复制链接]
1079|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2021-11-20 22:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#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

使用特权

评论回复
沙发
yinxiangh| | 2021-11-20 22:47 | 只看该作者
没开总中断,需在while(1)前添加 :_asm("rim");//开总中断(此处为开启总中断的方法)

使用特权

评论回复
板凳
morrisk|  楼主 | 2021-11-20 22:49 | 只看该作者
谢谢指导,

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

使用特权

评论回复
地板
morrisk|  楼主 | 2021-11-20 22:51 | 只看该作者

使用特权

评论回复
5
morrisk|  楼主 | 2021-11-20 22:53 | 只看该作者
#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


















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

使用特权

评论回复
6
morrisk|  楼主 | 2021-11-20 22:58 | 只看该作者
为什么我在中断上面这样写:

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

却编译失败呢

使用特权

评论回复
7
jiaxw| | 2021-11-20 23:00 | 只看该作者

ECanaLAMRegs.LAM11.all = 0x8C000000;      //屏蔽26 27两位
        ECanaLAMRegs.LAM12.all = 0x8C000000;      //屏蔽26 27两位
        ECanaLAMRegs.LAM13.all = 0x8C000000;              //屏蔽26 27两位

        ECanaMboxes.MBOX11.MSGID.all = 0x05680000; //  std identifier 15a ,25a        
        ECanaMboxes.MBOX12.MSGID.all = 0x056C0000; //  std identifier 15b ,25b               
        ECanaMboxes.MBOX13.MSGID.all = 0x05700000; //  std identifier 15c ,25c

使用特权

评论回复
8
yszong| | 2021-11-20 23:02 | 只看该作者
我的中断函数是在stm8s_it.c中直接添加的,初始化一样,也是IAR的环境。

使用特权

评论回复
9
morrisk|  楼主 | 2021-11-20 23:04 | 只看该作者
怎么添加???

使用特权

评论回复
10
supernan| | 2021-11-20 23:06 | 只看该作者
在官方库的例程中直接复制的。你也直接复制就好。

使用特权

评论回复
11
supernan| | 2021-11-20 23:07 | 只看该作者

使用特权

评论回复
12
morrisk|  楼主 | 2021-11-20 23:10 | 只看该作者
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文件中的,
我按上面复制,编译报错,这个报错如何处理啊?

使用特权

评论回复
13
morrisk|  楼主 | 2021-11-20 23:12 | 只看该作者

使用特权

评论回复
14
xxrs| | 2021-11-20 23:14 | 只看该作者
还有什么现象?能再详细描述下吗?

使用特权

评论回复
15
morrisk|  楼主 | 2021-11-20 23:15 | 只看该作者
#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的初值是怎么计算出来的呢?

使用特权

评论回复
16
yszong| | 2021-11-20 23:17 | 只看该作者
enableInterrupts();

使用特权

评论回复
17
morrisk|  楼主 | 2021-11-20 23:19 | 只看该作者
#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 呢?

使用特权

评论回复
18
zwll| | 2021-11-20 23:24 | 只看该作者
我自己没有算过

使用特权

评论回复
19
chenho| | 2021-11-20 23:27 | 只看该作者
不太清楚这个问题

使用特权

评论回复
20
morrisk|  楼主 | 2021-11-20 23:29 | 只看该作者

明白了,多谢大家讨论这么多哈

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝