你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8外中断唤醒有问题

[复制链接]
hificwc-319059 提问时间:2014-7-16 18:02 /
阅读主题, 点击返回1楼
收藏 1 评论22 发布时间:2014-7-16 18:02
22个回答
zhuoyemp4 回答时间:2015-5-12 08:35:15
apple1 发表于 2015-5-11 20:28
大侠,你能唤醒几次啊

一直可以唤醒啊
zhuoyemp4 回答时间:2015-5-12 08:40:53
apple1 发表于 2015-5-11 20:29
开定时器试试,还能唤醒不

什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用AWU或RTC和外部中断唤醒
apple1 回答时间:2015-5-12 10:39:06
zhuoyemp4 发表于 2015-5-12 08:40
什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用A ...

我意思是,在定时器,串口,等外设还开着的状态下,进入halt.能不能出种断唤醒
apple1 回答时间:2015-5-12 15:06:14
zhuoyemp4 发表于 2015-5-12 08:40
什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用A ...

MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/

#include "stm8l15x.h"
#include "stm8l15x_tim2.h"
#include "stm8l15x_usart.h"

#define TIM2_PERIOD    999
#define TIM2_PRESCALER   2

int Nms=0,base100us=0;
int Ns=0,base1ms=0;
_Bool  LEDFLAG;



void SYSCLK_Config(void)
{
   CLK->SWR=0x01;
   CLK->CKDIVR=0x02;         //16MHz /64       
}
void UART_CONFIG(void)
{
   
       
        CLK->PCKENR1|=0x20;

        USART_Init(USART1,9600,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART1->CR1 &= (uint8_t)(~USART_CR1_USARTD);


}
void TIM2_Config(void)
{
     u16 TIM2_Period;  
         TIM2_Period=TIM2_PERIOD;
         CLK->PCKENR1|=0x01;
         TIM2->ARRH = (uint8_t)(TIM2_Period >> 8) ;
         TIM2->ARRL = (uint8_t)(TIM2_Period);
         /* Set the Prescaler value */
         TIM2->PSCR = (uint8_t)TIM2_PRESCALER;
         /* Select the Counter Mode*/
         TIM2->CR1 &= (uint8_t)((uint8_t)(~TIM_CR1_CMS)) & ((uint8_t)(~TIM_CR1_DIR));
         TIM2->CR1 |= (uint8_t)(TIM2_CounterMode_Up);
         /* Generate an update event to reload the Prescaler value immediately */
         TIM2->EGR = TIM2_EventSource_Update;
         TIM2->IER |= (uint8_t)TIM2_IT_Update;//ENABLE IT
        TIM2->CR1 |= 0x01;

}

main()
{
        SYSCLK_Config();
        TIM2_Config();
        UART_CONFIG();
        CFG->GCR=0x00;
        GPIOB->DDR=0X02;
        GPIOB->CR1=0X06;
GPIOB->CR2=0X06;// allow pb2  trige  interrupter
        _asm("rim");
GPIOB->ODR|=0X02;
Ns=0;
while (1)
        {
               
               
if(LEDFLAG)GPIOB->ODR|=0X02;
else GPIOB->ODR&=~0X02;
if(Nms>1000)
{
        Nms=0;
printf("\r \n main fun running");
}

if(Ns>5)
{
        Ns=0;
        printf("\r\n halt");
        GPIOB->CR2|=0X04;
        GPIOB->ODR&=~0X02;
        _asm("halt");
}


}
}
@far @interrupt void TIM2_1ms_interrupter (void)
{
       TIM2->SR1=0X00;

//LEDFLAG=~LEDFLAG;
                   Nms++;
                base1ms++;
           if(base1ms==1000)
                   {
LEDFLAG=~LEDFLAG;
                   base1ms=0;
                Ns++;
                   }
         
}

@far @interrupt void PB2_interrupter(void)
{
          EXTI->SR1&=~0X04;
GPIOB->CR2&=~0X04;



}
char putchar(char c)
{
                  USART_SendData8(USART1, (unsigned char) c);
        while (!(USART1->SR & USART_FLAG_TXE));
       
        return (c);
}
apple1 回答时间:2015-5-12 15:32:44
zhuoyemp4 发表于 2015-5-12 08:40
什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用A ...

能否QQ上说,printf("qq=1020912189");
zhuoyemp4 回答时间:2015-5-13 09:57:20
开定时器照样可以唤醒,实现功能:T2每进中断让PD口输出翻转,10次后进入halt,PB1外部中断唤醒,唤醒时让PC口翻转。看到的现象就是LED以1s间隔闪烁,闪10次后停机,用PB1按键唤醒后PC口输出取反,PD口LED接着闪烁。
void initcpu();
void Init_GPIO(void);
void delay(unsigned char ms);
void  Tim2INIT(void);
unsigned int i;
u8 TIM1S;

int main()
{
      Init_GPIO();  
      initcpu();
        Tim2INIT();
        enableInterrupts();
        while(1)
        {  
          if(TIM1S>10)
             {
               TIM1S=0;
               GPIOD->ODR=0x08;//进入Halt前关掉LED
               GPIOB->CR2=0x02; //PB1使能外部中断
               halt();  //进入halt模式
             }
        }
}

void Init_GPIO(void)
{
  GPIOB->DDR=0x00;
  GPIOB->CR1=0x02;  //PB1上拉输入
  GPIOB->CR2=0x00;  //PB禁止外部中断
  EXTI->CR1 = 0x08;  //PB1下降沿触发
  
  GPIOC->DDR=0x08;
  GPIOC->CR1=0x08;
  GPIOC->CR2=0x00;
  GPIOC->ODR=0x00;
  
  GPIOD->DDR=0x08;
  GPIOD->CR1=0x08;
  GPIOD->CR2=0x00;
  GPIOD->ODR=0x00;  //LED低亮
}
void initcpu()
{
       
        //CLK->CKDIVR&= (uint8_t)(~0x18);/*时钟复位*/
        CLK->CKDIVR= (uint8_t)0x01;   /*设置时钟为内部16M高速时钟*/
        disableInterrupts();  //close all interrupt
}


void delay(unsigned char i)
{
  unsigned int j;
  j=65535;
  while(i--)
  {
    while(j--);
  }
}
void  Tim2INIT(void)
{
        CLK->PCKENR1|=0x20;
        TIM2->ARRH=0xf4;
        TIM2->ARRL=0x24;
        TIM2->CNTRH=0x00;
        TIM2->CNTRL=0x00;
        TIM2->PSCR=0x08;//256分频
        TIM2->CR1=0x80;
        TIM2->EGR=0x00;
        TIM2->IER|=0x01;
        TIM2->CR1|=0x01;   
}

INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler,13)
{
      TIM2->SR1 &= 0xfe;
          TIM1S++;
       GPIOD->ODR=~GPIOD->ODR;
      return;
       
}

INTERRUPT_HANDLER(EXTI1_IRQHandler,4)  //PB1外部中断
{
       GPIOB->CR2=0x00; //PB禁止外部中断
       GPIOC->ODR=~GPIOC->ODR;
      return;
        
}
Hiberdating 回答时间:2017-3-6 11:42:58
zhuoyemp4 发表于 2015-5-13 09:57
开定时器照样可以唤醒,实现功能:T2每进中断让PD口输出翻转,10次后进入halt,PB1外部中断唤醒,唤醒时让P ...

顶你
zbber 回答时间:2017-3-6 16:13:07
一般不会自动中断或关闭吧
12
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版