apple1 发表于 2015-5-8 17:35:47

楼主解决了吗

zhuoyemp4 发表于 2015-5-9 10:27:26

怎么你的代码这么奇葩呢?
#include"iostm8s003f3.h"
if (temp>20)
这都是什么东东?

zhuoyemp4 发表于 2015-5-9 13:54:46

本帖最后由 zhuoyemp4 于 2015-5-9 14:26 编辑

你的程序延时时间太短,或许你根本看不到现象。下面是我根据你的大致意思写的一段代码,亲测可用。
实现功能如下:
LED闪烁10次,
使能PB1外部中断,
LED灭,
进入Halt模式,(LED是灭的状态,不会闪,直到有外部中断唤醒后又闪烁)

这时候可通过PB1口的按键唤醒MCU,
按一次按键进入外部中断服务程序,禁止外部中断,
LED亮,
延时,
LED灭,
延时,中断服务程序返回;
LED亮,
长延时
LED灭
长延时;

一次唤醒结束;

#include "stm8s_conf.h"
#define K1(GPIOB->IDR&0x02)//按键PB1

void initcpu();
void Init_GPIO(void);
void delay(unsigned char i);
unsigned int temp;
int main( )
{
      initcpu();
      Init_GPIO();
      while(1)
      {


            GPIOD->ODR=~GPIOD->ODR;
            delay(10);
            GPIOD->ODR=~GPIOD->ODR;
            delay(10);


          if(K1)
          {
            delay(10);
            temp++;
            if(temp>=10)
            {
                temp=0;
               GPIOD->ODR=0x08;//进入Halt前关掉LED
               GPIOB->CR2=0x02; //PB1使能外部中断
               halt();//进入halt模式
               GPIOD->ODR=~GPIOD->ODR;
               delay(200);
               GPIOD->ODR=~GPIOD->ODR;
               delay(200);
            }
          }

      }
}

void Init_GPIO(void)
{
GPIOB->DDR=0x00;
GPIOB->CR1=0x02;//PB1上拉输入
GPIOB->CR2=0x00;//PB禁止外部中断
EXTI->CR1 = 0x08;//PB1下降沿触发

GPIOD->DDR=0x08;
GPIOD->CR1=0x08;
GPIOD->CR2=0x00;
GPIOD->ODR=0x00;//LED低亮
}
void initcpu()
{
      
      CLK->CKDIVR&= (uint8_t)(~0x18);/*时钟复位*/
      CLK->CKDIVR|= (uint8_t)0x00;   /*设置时钟为内部16M高速时钟*/
      enableInterrupts();
}


void delay(unsigned char i)
{
unsigned int j;
j=65535;
while(i--)
{
while(j--);
}
}

INTERRUPT_HANDLER(EXTI1_IRQHandler,4)//PB1外部中断
{
            GPIOB->CR2=0x00; //PB禁止外部中断
            GPIOD->ODR=~GPIOD->ODR;
            delay(50);
            GPIOD->ODR=~GPIOD->ODR;
            delay(50);

      return;
      
}

apple1 发表于 2015-5-11 20:28:25

zhuoyemp4 发表于 2015-5-9 13:54
你的程序延时时间太短,或许你根本看不到现象。下面是我根据你的大致意思写的一段代码,亲测可用。
实现功 ...

大侠,你能唤醒几次啊

apple1 发表于 2015-5-11 20:29:55

zhuoyemp4 发表于 2015-5-9 13:54
你的程序延时时间太短,或许你根本看不到现象。下面是我根据你的大致意思写的一段代码,亲测可用。
实现功 ...

开定时器试试,还能唤醒不

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;
_BoolLEDFLAG;



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 pb2trigeinterrupter
        _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");
页: 1 [2] 3
查看完整版本: STM8外中断唤醒有问题