打印
[STM8]

stm8s003f定时器完全无法起作用

[复制链接]
3166|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlyuan|  楼主 | 2021-7-7 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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就是不灭呢?

使用特权

评论回复
沙发
zhenykun| | 2021-7-7 20:25 | 只看该作者
还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
jlyuan|  楼主 | 2021-7-7 20:27 | 只看该作者
都有在vector向量表里面更改了相应的了,就是不亮

使用特权

评论回复
地板
小叶三千| | 2021-7-7 20:28 | 只看该作者
仿真断点试一下,多久进一次if(i==61),PA_ODR=0x04是灯灭吗

使用特权

评论回复
5
yszong| | 2021-7-7 20:29 | 只看该作者
首先LED 是什么电平为熄灭,你这代码也只实现了一种电平,因为你一上电定时到了就改变了

使用特权

评论回复
6
jlyuan|  楼主 | 2021-7-7 20:31 | 只看该作者
是的呀,我初始化的时候是低电平,LED灯是不亮的,按道理定时到了的时候就变成高电平啊,但灯一直不亮啊

使用特权

评论回复
7
wuhany| | 2021-7-7 20:34 | 只看该作者
DEBUG模式看看能不能进中断,另外开 TIE 是什么意思?

使用特权

评论回复
8
jlyuan|  楼主 | 2021-7-7 20:35 | 只看该作者

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

使用特权

评论回复
9
jlyuan|  楼主 | 2021-7-7 20:37 | 只看该作者
DEBUG 模式是不是在@far那段里面设置一个断点,然后摁debug按钮,看能不能进去?我试过了,能进去,然后我再单步运行(F11),就一直在while那里了。显示在运行中···

使用特权

评论回复
10
jlyuan|  楼主 | 2021-7-7 20:39 | 只看该作者
要不你能不帮忙下载到你的板上看能不能实现这个功能啊?拜托拜托~~

使用特权

评论回复
11
liliang9554| | 2021-7-7 20:41 | 只看该作者
把变量改成 volatile unsigned char i;  看看你的变量是不是被优化掉了,调试模式下去看看 i 的值有没有在变

使用特权

评论回复
12
huangchui| | 2021-7-7 20:46 | 只看该作者
你调试下能不能进入中断就知了

使用特权

评论回复
13
jlyuan|  楼主 | 2021-7-7 20:53 | 只看该作者
进去了,但会只进去一下,然后停留在while(1)那里,显示程序在运行。。。。

使用特权

评论回复
14
jlyuan|  楼主 | 2021-7-7 20:55 | 只看该作者
不可以啊,请问被优化掉是什么意思啊?你们是用什么    开发软件的哦?

使用特权

评论回复
15
jiajs| | 2021-7-7 20:57 | 只看该作者
额,不会用STVD,我用的IAR

使用特权

评论回复
16
jlyuan|  楼主 | 2021-7-7 20:59 | 只看该作者
因为我是新手,刚接触STM8芯片,我不知道是不是我打开的方式不对,我写好后就compile,然后build,然后打开STVP,打开.s19后缀的文件,再烧录的,是不是这样的一个步骤呢?

使用特权

评论回复
17
zhenykun| | 2021-7-7 21:02 | 只看该作者
STM8默认CLK 是 2MHZ,你的中断周期相当于 1S,i == 61 才亮灯,相当于过1分钟才会亮..............

使用特权

评论回复
18
wyjie| | 2021-7-7 21:04 | 只看该作者
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;
}

使用特权

评论回复
19
jlyuan|  楼主 | 2021-7-7 21:06 | 只看该作者
之前这个程序compile没有问题,但在build的时候出现错误#error cpstm8 stm8_interrupt_vector.c:38(29+23) invalid pointer initializer ,请问是什么原因呢?

使用特权

评论回复
20
jlyuan|  楼主 | 2021-7-7 21:08 | 只看该作者
而且为什么你的程序不用设置CNTR那个寄存器呢?我看规格书上说,CNTR是0的话会不启动的,其实我也不明白cntr寄存器与ARR自动重装载寄存器的逻辑关系····求解答

使用特权

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

本版积分规则

880

主题

12030

帖子

4

粉丝