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");