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

楼主: hificwc-319059

STM8外中断唤醒有问题

[复制链接]

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-8 17:35:47 | 显示全部楼层
楼主解决了吗
回复 支持 反对

使用道具 举报

5

主题

208

回帖

9

蝴蝶豆

论坛元老

最后登录
2020-11-25
发表于 2015-5-9 10:27:26 | 显示全部楼层
怎么你的代码这么奇葩呢?
#include  "iostm8s003f3.h"
if (temp>20)
这都是什么东东?
回复 支持 反对

使用道具 举报

5

主题

208

回帖

9

蝴蝶豆

论坛元老

最后登录
2020-11-25
发表于 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;
        
}

回复 支持 反对

使用道具 举报

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-11 20:28:25 | 显示全部楼层
zhuoyemp4 发表于 2015-5-9 13:54
你的程序延时时间太短,或许你根本看不到现象。下面是我根据你的大致意思写的一段代码,亲测可用。
实现功 ...

大侠,你能唤醒几次啊
回复 支持 反对

使用道具 举报

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-11 20:29:55 | 显示全部楼层
zhuoyemp4 发表于 2015-5-9 13:54
你的程序延时时间太短,或许你根本看不到现象。下面是我根据你的大致意思写的一段代码,亲测可用。
实现功 ...

开定时器试试,还能唤醒不
回复 支持 反对

使用道具 举报

5

主题

208

回帖

9

蝴蝶豆

论坛元老

最后登录
2020-11-25
发表于 2015-5-12 08:35:15 | 显示全部楼层
apple1 发表于 2015-5-11 20:28
大侠,你能唤醒几次啊

一直可以唤醒啊
回复 支持 反对

使用道具 举报

5

主题

208

回帖

9

蝴蝶豆

论坛元老

最后登录
2020-11-25
发表于 2015-5-12 08:40:53 | 显示全部楼层
apple1 发表于 2015-5-11 20:29
开定时器试试,还能唤醒不

什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用AWU或RTC和外部中断唤醒
回复 支持 反对

使用道具 举报

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-12 10:39:06 | 显示全部楼层
zhuoyemp4 发表于 2015-5-12 08:40
什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用A ...

我意思是,在定时器,串口,等外设还开着的状态下,进入halt.能不能出种断唤醒
回复 支持 反对

使用道具 举报

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 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);
}
回复 支持 反对

使用道具 举报

0

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-12 15:32:44 | 显示全部楼层
zhuoyemp4 发表于 2015-5-12 08:40
什么意思,你的意思是用定时器唤醒?在Halt模式下,只能通过外部中断唤醒,在active-halt模式下,可以用A ...

能否QQ上说,printf("qq=1020912189");
回复 支持 反对

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版