打印
[STM8]

STM8定时器4的使用问题

[复制链接]
1771|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦幻泡影|  楼主 | 2017-6-6 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,小弟最近在搞STM8单片机的低功耗模式,其中用到了定时器4,但是有两个地方一直搞不懂,先上代码:

以下是初始化函数:
void Init_Timer4(void)
{
    TIM4_DeInit();
    TIM4_TimeBaseInit(TIM4_PRESCALER_128, 0xfe);
    TIM4_UpdateRequestConfig(TIM4_UPDATESOURCE_REGULAR);
    TIM4_SelectOnePulseMode(TIM4_OPMODE_REPETITIVE);
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
}

以下是中断函数:
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void)  //
{
    timecount++;
   
    if(timecount == 5000)    //
    {
        timecount = 0;
        Second++;
        if(Second == 380)//30s   
        {
            Second = 0;
        }
    }
}

按照事先设想,我在按键中断那里,加入了定时器启动功能,

就是检测到按键按下,就执行:TIM4_Cmd(ENABLE);

此时定时器确实启动了,也按30秒的时间产生中断,

但是开启以后就停不下来啊,即使是加了:TIM4_Cmd(DISABLE); 一点用都没有,

此时,我在30秒定时到以后,加了以下三句:

TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
halt();

好,现在时钟是被关闭了,系统也进入了低功耗状态,然而当我再次按按键使能定时器时,

它就一直在计时,其它啥事都干不了,比如接收射频数据,

就是说在进入定时器中断时,其它中断都无效了,这又是什么原因呢?按理说定时器不应该是和按键中断不互斥吗?

求大神赐招,我只想干两件事:

1、按下按键,使能定时器,计时30s,时间到以后彻底关闭,然后进入低功耗;

2、在计时期间要随时接收射频数据(中断触发接收)。





沙发
flove00| | 2017-6-6 11:22 | 只看该作者
外部中断排在定时器中断前面——你的射频接受用的外部中断,假如一直有射频信号过来,也没法进入低功耗啊

使用特权

评论回复
板凳
梦幻泡影|  楼主 | 2017-6-6 11:26 | 只看该作者
flove00 发表于 2017-6-6 11:22
外部中断排在定时器中断前面——你的射频接受用的外部中断,假如一直有射频信号过来,也没法进入低功耗啊 ...

有信号进来的时候,射频芯片会产生一个下降沿唤醒单片机的。等单片机处理完数据后会再次进入低功耗模式,此时整个系统的耗电都是微安级的。现在就是开了定时器以后停不下来,还有就是在定时器工作的时候,所有外部中断好像被屏蔽了似的,都没效果了

使用特权

评论回复
地板
flove00| | 2017-6-6 11:48 | 只看该作者
你的看门狗开了吗?我看到你的定时器中断里面没有做请中断的操作,而且进入低功耗不需要关闭定时器中断的,我用的寄存器没用过库

使用特权

评论回复
5
梦幻泡影|  楼主 | 2017-6-6 12:04 | 只看该作者
flove00 发表于 2017-6-6 11:48
你的看门狗开了吗?我看到你的定时器中断里面没有做请中断的操作,而且进入低功耗不需要关闭定时器中断的, ...

那你的单片机系统进入低功耗时待机电流是多少?有没有相关源码?

使用特权

评论回复
6
flove00| | 2017-6-6 12:26 | 只看该作者
我用的003f3 低功耗5-8us,也没什么源码就贴个定时器的 吧    ,当时遥控器的项目,按键唤醒然后发送数据,3s后进入低功耗

void CLKInit(void)
    {

                //CLK_ICKR = 0X09;//enable LSI(128K) and HSI(16M);       
  //---follow use inter RC clk with 16M/4
        //        CLK_CKDIVR = 0x10;               
               
  //---follow use inter RC clk with 16M/2
                CLK_CKDIVR = 0x08;                               
        //------------------------------------


        /*
                CLK_CKDIVR = 0x00;               
               
        //        CLK_ECKR   = 0x01;   //enable HSE
                CLK_SWCR   = 0x02;   //enalbe select osc.
                CLK_SWR    = 0xB4;   //select HSE to main osc.               

        */       
    }

void TIM4Init(void)
    {
    /* TIM4 Peripheral Configuration */
    /* Time Base configuration */
    //TIM4_PSCR = 0x07;          //F_ck/2^7 ;1/128
   // TIM4_ARR  = 250;          //4ms at 8M clock


    TIM4_PSCR = 0x05;          //F_ck/2^5 ;1/32
    TIM4_ARR  = 250;          //1ms at 8M clock
    /*TIM4 counter enable */
    TIM4_CR1 |= 0x01;              /* Enable TIM4. */
    TIM4_IER |= 0x01;              /* Enable TIM4 OVR interrupt. */
    }

@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)
{//----基本时钟基准4ms.--
//---室内通信发送---

  unsigned char i;
  static unsigned char bk;
        i=bk;
        bk++;
        trigger_byte|=(bk^i);               
  send_delay_cnt=dec_int(send_delay_cnt);
       
        /* Clear the update IT pending Bit */
  TIM4_SR &=~(0x01);
  return;
}


void Logic(void)
{
       
        if(OffDealyCnt>=D_OffDealyCnt)
        {
                OffDealyCnt=0;
                DispDataFull(0x00);
                LEDDriver();
                Driver_OFF();
                WDG_CLR();
                NOP();
                NOP();
                NOP();
                NOP();
                _asm("halt\n");
          WDG_CLR();                
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();
                NOP();               
        }
       

使用特权

评论回复
7
梦幻泡影|  楼主 | 2017-6-6 13:45 | 只看该作者
flove00 发表于 2017-6-6 12:26
我用的003f3 低功耗5-8us,也没什么源码就贴个定时器的 吧    ,当时遥控器的项目,按键唤醒然后发送数据, ...

好的,非常感谢,回去我试下

使用特权

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

本版积分规则

20

主题

294

帖子

6

粉丝