[STM8] stm8s003f定时器完全无法起作用,弄了2天都没能解决,求救啊

[复制链接]
 楼主| lemenshen 发表于 2015-5-8 11:01 | 显示全部楼层 |阅读模式
#include "STM8S103f3p.h"
#include "stm8s_tim2.h"
unsigned char i=0;

void Init_Tim2(void)  
{  
    TIM2_EGR=0x01; //手动产生更新事件,重新初始化计数器,并允许产生一个更新事件   
    //设置定时器初值  
    TIM2_CNTRH=0; //不能使用TIM2_CNTR直接设值,TIM2_CNTRL=0;   
    //设定自动重装寄存器值      
    //这里得注意不能使用TIM2_ARR的方式进行设值,TIM2是十六位的。  
    //如TIM2_ARR=0xFA,实际上是赋给高字节了,TIM2_ARRH=0xFA,而不是想象中的赋给低字节。  
    TIM2_ARRH=0x7A; //31250 4MHz / 128 = 31250Hz  (1S)  
    TIM2_ARRL=0x12; //0x7A12 31250   意味着每产生一次中断时间为1S  
    TIM2_PSCR=0x07; //分频128  

    TIM2_IER=0x41; //中断允许位使能  
    TIM2_CR1=0x01; //使能计时器  
}  

void Init_GPIO(void)
{
                PD_DDR|=0x04;
          PD_CR1|=0x04;
          PD_CR2|=0x00;
                PD_ODR=0x00;
}

main()
{
        Init_GPIO();
       CLK_PCKENR1=0xFF;
          _asm("sim" );
          Init_Tim2();
        _asm("rim");

        while (1);
}

@far @interrupt void TIM2_UPD_OVF_IRQHandler (void)
{
      i++;
      TIM2_SR1=0x00;
      if(i==61)
      {        PA_ODR=0x04;        i=0;
      }
      return;
}


我仅仅希望能够定时然后LED灯熄灭,为什么烧录后,LED就是不灭呢?都有在vector向量表里面更改了相应的了,就是不亮:'(:'(,求搭救啊,QQ891168340
ok666666z 发表于 2015-5-8 14:25 | 显示全部楼层
首先LED 是什么电平为熄灭,你这代码也只实现了一种电平,因为你一上电定时到了就改变了
 楼主| lemenshen 发表于 2015-5-8 15:20 | 显示全部楼层
ok666666z 发表于 2015-5-8 14:25
首先LED 是什么电平为熄灭,你这代码也只实现了一种电平,因为你一上电定时到了就改变了 ...

是的呀,我初始化的时候是低电平,LED灯是不亮的,按道理定时到了的时候就变成高电平啊,但灯一直不亮啊
Xflyan 发表于 2015-5-8 15:44 | 显示全部楼层
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?
 楼主| lemenshen 发表于 2015-5-8 15:58 | 显示全部楼层
Xflyan 发表于 2015-5-8 15:44
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?

你是不是指这个啊?  TIM2_IER=0x41;我开始以为是我没开,我才这样写的,我开了和没开都试过了。。。
 楼主| lemenshen 发表于 2015-5-8 16:00 | 显示全部楼层
Xflyan 发表于 2015-5-8 15:44
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?

DEBUG 模式是不是在@far那段里面设置一个断点,然后摁debug按钮,看能不能进去?我试过了,能进去,然后我再单步运行(F11),就一直在while那里了。显示在运行中···
要不你能不帮忙下载到你的板上看能不能实现这个功能啊?拜托拜托~~
Xflyan 发表于 2015-5-8 16:08 | 显示全部楼层
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在变
我不用STVD,太恶心了....
ok666666z 发表于 2015-5-8 16:21 | 显示全部楼层
你调试下能不能进入中断就知了
 楼主| lemenshen 发表于 2015-5-8 16:28 | 显示全部楼层
ok666666z 发表于 2015-5-8 16:21
你调试下能不能进入中断就知了

进去了,但会只进去一下,然后停留在while(1)那里,显示程序在运行。。。。
 楼主| lemenshen 发表于 2015-5-8 16:32 | 显示全部楼层
Xflyan 发表于 2015-5-8 16:08
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在 ...

不可以啊,请问被优化掉是什么意思啊?你们是用什么    开发软件的哦?
ok666666z 发表于 2015-5-8 16:32 | 显示全部楼层
lemenshen 发表于 2015-5-8 16:28
进去了,但会只进去一下,然后停留在while(1)那里,显示程序在运行。。。。 ...

额,不会用STVD,我用的IAR
 楼主| lemenshen 发表于 2015-5-8 16:43 | 显示全部楼层
Xflyan 发表于 2015-5-8 16:08
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在 ...

因为我是新手,刚接触STM8芯片,我不知道是不是我打开的方式不对,我写好后就compile,然后build,然后打开STVP,打开.s19后缀的文件,再烧录的,是不是这样的一个步骤呢?
Xflyan 发表于 2015-5-8 16:58 | 显示全部楼层
本帖最后由 Xflyan 于 2015-5-8 17:03 编辑

STM8默认CLK 是 2MHZ,你的中断周期相当于 1S,i == 61 才亮灯,相当于过1分钟才会亮..............

换这段代码试试
  1. int main(void)
  2. {
  3.         /* IO */
  4.         PD_DDR |= 0x04;
  5.         PD_CR1 |= 0x04;
  6.         PD_CR2 |= 0x04;
  7.         PD_ODR  = 0x00;
  8.         
  9.         /* TIM2 */
  10.         TIM2_PSCR = 0x06;        /* 16MHZ / 8 / 64 = 31250HZ */
  11.         TIM2_ARRH = (unsigned char)(15625 >> 8);
  12.         TIM2_ARRH = (unsigned char)(15625);
  13.         TIM2_IER  = 0x01;
  14.         TIM2_CR1  = 0x01;
  15.         
  16.         _asm ("rim\n");
  17.         
  18.         while (1) {
  19.                
  20.         }
  21. }

  22. far interrupt void TIM2_UPD_OVF_IRQHandler (void)
  23. {
  24.     PD_ODR ^= 0x04;
  25.     TIM2_SR1 = 0x00;
  26. }
  
 楼主| lemenshen 发表于 2015-5-8 17:06 | 显示全部楼层
Xflyan 发表于 2015-5-8 16:58
STM8默认CLK 是 2MHZ,你的中断周期相当于 1S,i == 61 才亮灯,相当于过1分钟才会亮..............

换这 ...

啊啊啊啊啊啊啊啊!!太感谢你啦!!!2天来终于有变动啦!!!!我之前改过时间了也不行,现在根据你的程序终于可以啦!!!!!!你太好人啦!!!!谢谢谢谢谢谢你啊!!!!我之前也等了很久都不灭的,我开始也以为是时间的问题呢,

另外我想问问你啊,我之前这个程序compile没有问题,但在build的时候出现错误#error cpstm8 stm8_interrupt_vector.c:38(29+23) invalid pointer initializer ,请问是什么原因呢?
 楼主| lemenshen 发表于 2015-5-8 17:09 | 显示全部楼层
Xflyan 发表于 2015-5-8 16:58
STM8默认CLK 是 2MHZ,你的中断周期相当于 1S,i == 61 才亮灯,相当于过1分钟才会亮..............

换这 ...

而且为什么你的程序不用设置CNTR那个寄存器呢?我看规格书上说,CNTR是0的话会不启动的,其实我也不明白cntr寄存器与ARR自动重装载寄存器的逻辑关系····求解答
Xflyan 发表于 2015-5-8 17:10 | 显示全部楼层
不使用 STVD ,所以不知道是什么错误,建议使用 IAR
Xflyan 发表于 2015-5-8 17:26 | 显示全部楼层
lemenshen 发表于 2015-5-8 17:09
而且为什么你的程序不用设置CNTR那个寄存器呢?我看规格书上说,CNTR是0的话会不启动的,其实我也不明白c ...

非严格要求时,CNTR初始为不为0无所谓,不为0只是第一次进中断快一点,以后都是按重载值计时
 楼主| lemenshen 发表于 2015-5-8 18:20 | 显示全部楼层
Xflyan 发表于 2015-5-8 17:26
非严格要求时,CNTR初始为不为0无所谓,不为0只是第一次进中断快一点,以后都是按重载值计时 ...

在请问一下啊,那个PWM输出的,设计IO口复用,是不是要把IO口设置成推完输出啊?再在option byte修改?
Xflyan 发表于 2015-5-8 20:41 | 显示全部楼层
lemenshen 发表于 2015-5-8 18:20
在请问一下啊,那个PWM输出的,设计IO口复用,是不是要把IO口设置成推完输出啊?再在option byte修改? ...

先要改OPBYTE设置成对应的外设模式,再PWM口设置成推挽输出
mmuuss586 发表于 2015-5-8 22:55 | 显示全部楼层
仿真下看看;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部