STM8外中断唤醒有问题
在停机状态,用外中断来唤醒时,只能唤醒一次,为什么这样??????????#include "iostm8s003f3.h"
#define nop() asm("nop")
#define K1 PD_IDR_IDR4 //按键
#define LED PD_ODR_ODR2 //LED指示,低亮
void delay(unsigned char i)
{
unsigned char j;
j=255;
while(i--)
{
while(j--);
}
}
void main()
{
unsigned char temp;
delay(10);
PD_CR1 |= 0x10; //PD4上拉输入
PD_CR1 |= 0x4; //
PD_DDR |= 0x4; //PD2设置为输出
LED=0;
asm("RIM"); //开总中断
while(1)
{
LED=0;//灯亮;
delay(255);
while (!K1)
{
temp=0;//延时清0
delay(255);
LED=!LED;
}
temp++;
if (temp>20)//按键没按下时,延时再停机
{
temp=0;
PD_CR2 |= 0x10; //开PD4中断
EXTI_CR1 = 0x80; //PD4下降沿中断;
LED=1;//关灯
asm("halt"); //停机
nop();nop();nop();nop();nop();
PD_CR2 = 0x0; //
}
}
}
#pragma vector=0x08//
__interrupt void EXTI_PD()//PD外中断
{
nop();
PD_CR2 = 0x0; //关中断
} 开定时器照样可以唤醒,实现功能:T2每进中断让PD口输出翻转,10次后进入halt,PB1外部中断唤醒,唤醒时让PC口翻转。看到的现象就是LED以1s间隔闪烁,闪10次后停机,用PB1按键唤醒后PC口输出取反,PD口LED接着闪烁。
void initcpu();
void Init_GPIO(void);
void delay(unsigned char ms);
voidTim2INIT(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--);
}
}
voidTim2INIT(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;
}
RE:STM8外中断唤醒有问题
你初始化的时候开的是总中断,一次外部中断触发之后你关闭了中断,那下次再触发按键的时候总中断开了吗?你把开总中断这一步放到第一个while大循环中试试RE:STM8外中断唤醒有问题
总中断开了又没关,不可能外中断后,总中断自动关了吧??RE:STM8外中断唤醒有问题
没有清除中断标志吧:DRE:STM8外中断唤醒有问题
调试下看看程序跑到哪儿去了,是后来一直卡死在中断里面么RE:STM8外中断唤醒有问题
一般不会自动中断或关闭吧回复:STM8外中断唤醒有问题
回复第 4 楼 于2014-07-20 10:54:43发表:没有清除中断标志吧:DSTM8S没有中断标志啊
回复:STM8外中断唤醒有问题
回复第 5 楼 于2014-07-20 18:36:27发表:调试下看看程序跑到哪儿去了,是后来一直卡死在中断里面么
都唤不醒了,哪知道程序跑到哪了
RE:STM8外中断唤醒有问题
你程序对中断不起作用了吗回复:STM8外中断唤醒有问题
回复第 9 楼 于2014-07-24 15:57:39发表:你程序对中断不起作用了吗
是啊,只能唤醒一次,我也搞不明白什么意思:funk: