搜索
bottom↓
回复: 3

STM8S903k 定时器1中断?

[复制链接]

出0入0汤圆

发表于 2012-8-30 18:17:26 | 显示全部楼层 |阅读模式
本帖最后由 gzyavr 于 2012-8-31 09:42 编辑

程序实现:环境STVD+cosmic   内部晶振16M。STM8S903
定时一秒的时间,使LED闪烁的时间间隔为一秒。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void GPIO_INIT(void)
{
        GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);//推挽输出低电平
        GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Tim1_Init(void)
{
        /*
  TIM1_DeInit();
  _asm("SIM") ; //开全局中断
  CLK->PCKENR1|=0X80;//0x8 使能TIM1时钟。
TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP,1000,0);//10ms
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
TIM1_Cmd(ENABLE);
                */~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以上屏蔽的使用的是库函数,但是进不了中断

        CLK->PCKENR1|=0X80;//0x8 使能TIM1时钟。
        TIM1->PSCRH=0X3e;
        TIM1->PSCRL=0X80;   //16000分频,16M晶振, 的到得计数频 1毫秒,
        TIM1->ARRH =0x03;
        TIM1->ARRL =0xe8;  //1000次
        TIM1->SMCR=0X00;
        TIM1->ETR=0X00;
        TIM1->EGR=0X01;      // 软件产生一次中断 更新寄存器中值
       TIM1->IER|=0x01;        //允许溢出中断。
        _asm("RIM") ; //开全局中断
        TIM1->CR1|=0X81;    //使能计数器,使能预装载,向上计数方式。

}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#pragma vector=0xb
@far @interrupt void TIM1_Server_Interrupt(void)
{
         _asm("SIM") ; //关全局中断
         //GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
         //delay_ms(1000);
        //GPIO_WriteLow(GPIOD, GPIO_PIN_6);
        //delay_ms(1000);   ~~~~~~~~~~~~~~~~~~~~~~加入延时后,,LED可以闪烁
        GPIO_WriteReverse(GPIOD, GPIO_PIN_6);~~~~~~~~~不加延时的时候,LED仅仅有一点点亮度,几乎看不到LED亮。
        TIM1->SR1&=0xfe;//清除中断标志
        _asm("RIM");   //开全局中断
}

在stm8_interrupt_vector.c文件里面是:
extern @far @interrupt void TIM1_Server_Interrupt(void);~~~~~~~~~~在该文件的开头相当于一个声明吧。
   然后在 struct interrupt_vector const _vectab[] ={ }中写
   {0x82, TIM1_Server_Interrupt}, /* irq11 - TIM1 Update/Overflow/Trigger/Break interrupt */
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main(void)
{
        CLK_HSICmd(ENABLE);
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部时钟分频2分频。内部晶振8M
        GPIO_INIT();
        Tim1_Init();
  /* Infinite loop */
        while (1)
   {
    }
}

编译后没有问题.

现在的情况是:中断可以进入,但是时间不对。
问题:
     1.   需要达到1S闪烁的LED基本上不亮的。
          我为了验证是否进入中断,我在中断函数里面加了个延时,这样LED可以闪烁。

    2.
          我的stm8_interrupt_vector.c文件和我看到的资料上说怎么改中断入口参数说的不一样,是不是这个文件的问题呢?
           http://hi.baidu.com/gzyavr/item/efbdd9f0ab5904bd30c1997f
          我是按照上面链接中的方法修改中断入口的。如下图所示的两个文件是不是等效的呢?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-8-31 10:55:39 | 显示全部楼层
本帖最后由 gzyavr 于 2012-8-31 10:58 编辑

问题算是解决了吧。
必须是在中断函数里面减去定时的时间数,然后在延时的函数中去判断这个延时的时间数是否减为0.这样的方法来延时的。
u16 s;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~全局变量也是延时的时间值。
void Q_delay_s(void)
{
  if(s!=0){s--;}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void delay_s(u16 n) //延时1ms
{
s=n;
while(s!=0);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@far @interrupt void TIM5_Server_Interrupt(void)
{
         _asm("SIM") ; //关全局中断
        //GPIO_WriteReverse(GPIOD, GPIO_PIN_0);//????
         Q_delay_s();~~~~~~~~~~~~~~~~~~~~~~~所调用的延时数据       
                TIM5->SR1&=0xfe;//清除中断标志
        _asm("RIM");   //开全局中断
}

如果我这种方法看的不清楚的话,请参考风驰大大的帖子吧,里面就是这样的实现延时的。
但是不明白为什么需要这样才可以实现延时呢???

出0入0汤圆

发表于 2012-8-31 22:47:40 | 显示全部楼层
gzyavr 发表于 2012-8-31 10:55
问题算是解决了吧。
必须是在中断函数里面减去定时的时间数,然后在延时的函数中去判断这个延时的时间数是 ...

风驰的例程是用定时器实现精准的延时

出0入0汤圆

 楼主| 发表于 2012-9-1 09:12:01 | 显示全部楼层
本帖最后由 gzyavr 于 2012-9-1 09:18 编辑
fengchi 发表于 2012-8-31 22:47
风驰的例程是用定时器实现精准的延时


嗯,是的。
但是我的帖子上的前一种方法(不可以准确延时)与我第二次问题解决(实现准确延时)时候的方法相比在理论上我看不出有何不同。但是后者可以实现延时。这是为什么呢?而且后者与前者相比还麻烦了些。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 04:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表