打印
[STM8]

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

[复制链接]
5424|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 是什么意思?

使用特权

评论回复
5
lemenshen|  楼主 | 2015-5-8 15:58 | 只看该作者
Xflyan 发表于 2015-5-8 15:44
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?

你是不是指这个啊?  TIM2_IER=0x41;我开始以为是我没开,我才这样写的,我开了和没开都试过了。。。

使用特权

评论回复
6
lemenshen|  楼主 | 2015-5-8 16:00 | 只看该作者
Xflyan 发表于 2015-5-8 15:44
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?

DEBUG 模式是不是在@far那段里面设置一个断点,然后摁debug按钮,看能不能进去?我试过了,能进去,然后我再单步运行(F11),就一直在while那里了。显示在运行中···
要不你能不帮忙下载到你的板上看能不能实现这个功能啊?拜托拜托~~

使用特权

评论回复
7
Xflyan| | 2015-5-8 16:08 | 只看该作者
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在变
我不用STVD,太恶心了....

使用特权

评论回复
8
ok666666z| | 2015-5-8 16:21 | 只看该作者
你调试下能不能进入中断就知了

使用特权

评论回复
9
lemenshen|  楼主 | 2015-5-8 16:28 | 只看该作者
ok666666z 发表于 2015-5-8 16:21
你调试下能不能进入中断就知了

进去了,但会只进去一下,然后停留在while(1)那里,显示程序在运行。。。。

使用特权

评论回复
10
lemenshen|  楼主 | 2015-5-8 16:32 | 只看该作者
Xflyan 发表于 2015-5-8 16:08
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在 ...

不可以啊,请问被优化掉是什么意思啊?你们是用什么    开发软件的哦?

使用特权

评论回复
11
ok666666z| | 2015-5-8 16:32 | 只看该作者
lemenshen 发表于 2015-5-8 16:28
进去了,但会只进去一下,然后停留在while(1)那里,显示程序在运行。。。。 ...

额,不会用STVD,我用的IAR

使用特权

评论回复
12
lemenshen|  楼主 | 2015-5-8 16:43 | 只看该作者
Xflyan 发表于 2015-5-8 16:08
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在 ...

因为我是新手,刚接触STM8芯片,我不知道是不是我打开的方式不对,我写好后就compile,然后build,然后打开STVP,打开.s19后缀的文件,再烧录的,是不是这样的一个步骤呢?

使用特权

评论回复
13
Xflyan| | 2015-5-8 16:58 | 只看该作者
本帖最后由 Xflyan 于 2015-5-8 17:03 编辑

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

换这段代码试试
int main(void)
{
        /* IO */
        PD_DDR |= 0x04;
        PD_CR1 |= 0x04;
        PD_CR2 |= 0x04;
        PD_ODR  = 0x00;
        
        /* TIM2 */
        TIM2_PSCR = 0x06;        /* 16MHZ / 8 / 64 = 31250HZ */
        TIM2_ARRH = (unsigned char)(15625 >> 8);
        TIM2_ARRH = (unsigned char)(15625);
        TIM2_IER  = 0x01;
        TIM2_CR1  = 0x01;
        
        _asm ("rim\n");
        
        while (1) {
               
        }
}

far interrupt void TIM2_UPD_OVF_IRQHandler (void)
{
    PD_ODR ^= 0x04;
    TIM2_SR1 = 0x00;
}
  

使用特权

评论回复
14
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 ,请问是什么原因呢?

使用特权

评论回复
15
lemenshen|  楼主 | 2015-5-8 17:09 | 只看该作者
Xflyan 发表于 2015-5-8 16:58
STM8默认CLK 是 2MHZ,你的中断周期相当于 1S,i == 61 才亮灯,相当于过1分钟才会亮..............

换这 ...

而且为什么你的程序不用设置CNTR那个寄存器呢?我看规格书上说,CNTR是0的话会不启动的,其实我也不明白cntr寄存器与ARR自动重装载寄存器的逻辑关系····求解答

使用特权

评论回复
16
Xflyan| | 2015-5-8 17:10 | 只看该作者
不使用 STVD ,所以不知道是什么错误,建议使用 IAR

使用特权

评论回复
17
Xflyan| | 2015-5-8 17:26 | 只看该作者
lemenshen 发表于 2015-5-8 17:09
而且为什么你的程序不用设置CNTR那个寄存器呢?我看规格书上说,CNTR是0的话会不启动的,其实我也不明白c ...

非严格要求时,CNTR初始为不为0无所谓,不为0只是第一次进中断快一点,以后都是按重载值计时

使用特权

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

在请问一下啊,那个PWM输出的,设计IO口复用,是不是要把IO口设置成推完输出啊?再在option byte修改?

使用特权

评论回复
19
Xflyan| | 2015-5-8 20:41 | 只看该作者
lemenshen 发表于 2015-5-8 18:20
在请问一下啊,那个PWM输出的,设计IO口复用,是不是要把IO口设置成推完输出啊?再在option byte修改? ...

先要改OPBYTE设置成对应的外设模式,再PWM口设置成推挽输出

使用特权

评论回复
20
mmuuss586| | 2015-5-8 22:55 | 只看该作者
仿真下看看;

使用特权

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

本版积分规则

2

主题

12

帖子

0

粉丝