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

楼主: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版