STM8S003 定时器无法进入中断问题

2019-07-19 20:42发布

使用了资料里面的工程,修改芯片为STM8S003,发现里面无法进入定时器。代码如下:
tim2配置文件
/******************** (C) COPYRIGHT  风驰iCreate嵌入式开发工作室 ********************/
#include "tim2.h"
static  u32 TimingDelay;

void Tim2_Init(void)
{
   TIM2_TimeBaseInit( TIM2_PRESCALER_16 ,999);
   TIM2_PrescalerConfig(TIM2_PRESCALER_16,TIM2_PSCRELOADMODE_IMMEDIATE);
   TIM2_ARRPreloadConfig(ENABLE);
   TIM2_ITConfig(TIM2_IT_UPDATE , ENABLE);
   TIM2_Cmd(ENABLE);
}

/*void Tim2_Init(void)
{
  TIM2_DeInit();
  TIM2_TimeBaseInit(TIM2_PRESCALER_8, 0xff);//1ms中断一次
  TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
  TIM2_Cmd(ENABLE);
}*/

/*INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
    TIM2_ClearITPendingBit(TIM2_IT_UPDATE);//清除标志位
}*/

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
     {
        TimingDelay--;
      }
}

void delay_ms( u16 nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);
}


main.c
int main(void)
{
  /* Infinite loop */

  /*设置内部高速时钟16M为主时钟*/
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   /*!<Set High speed internal clock */
  #if TIM2_Mode==BaseTime
   Tim2_Init();
   __enable_interrupt();

  #elif TIM2_Mode==PWM  
   PWM_Init();
     #if TIM2_Channel==TIM2_Channel1
     Set_Beep_OptionByte();
     #endif

  #endif

  while (1)
  {
    /*  添加你的代码  */
    TIM2_Mode==BaseTime;
    delay_ms(100);
    i++;
  }
}


中断函数
#pragma vector=0xF
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
{
  TimingDelay_Decrement();
  TIM2_ClearITPendingBit(TIM2_IT_UPDATE);

}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
弦子的弦
1楼-- · 2019-07-20 01:00
本帖最后由 弦子的弦 于 2016-5-12 04:23 编辑

改成寄存可以运行。

#include"iostm8s003f3.h"//系统时钟配置
void clkInit(void)
{
    CLK_ECKR = 0x00;    //关闭外部时钟
    CLK_ICKR = 0x01;    //开启内部高速时钟 16M
    CLK_CKDIVR = 0x00;  //cpu不分频 16M
}

//定时器初始化
void TIM2Init(void)
{
    TIM2_PSCR = 0x04;    //16分频 1us一个数
    TIM2_ARRH = 0x03;   
    TIM2_ARRL = 0xE7;    //999  计算1000次
    TIM2_IER  = 0x01;    //允许更新中断
    TIM2_CR1  = 0x01;    //使能计数器
}

//中断函数 1ms(1000us)进入一次
#pragma vector = 0x0F
__interrupt void TIM2_UPD_OVF_TRG_IRQHandler(void)
{
    TimingDelay_Decrement();
    TIM2_SR1 = 0x00;  //清空标志位
}

void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
        TimingDelay--;
}

void delay_ms(unsigned long nTime)
{
    TimingDelay = nTime;
    while(TimingDelay != 0);
}
弦子的弦
2楼-- · 2019-07-20 06:08
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 07:59
帮顶
wyh5360
4楼-- · 2019-07-20 11:58
 精彩回答 2  元偷偷看……
乱世爱羁绊
5楼-- · 2019-07-20 14:29
 精彩回答 2  元偷偷看……
lp_robert
6楼-- · 2019-07-20 17:16
STM8大部分系列在配置中断的时候都要先屏蔽总中断,再配置中断,再开总中断的。否则一配置就立马中断了

一周热门 更多>