本帖最后由 sy_lixiang 于 2012-7-30 15:54 编辑
最在因工作的原因,在测试STM8LF3P6这款单片机的低功耗的情况,但使用中发现如下问题:
目的:上电后时入halt模式,外部中断第1次唤醒,使PC3口置高电平,再进入halt;第2次唤醒,使PC3为低电平。
1、时钟为默认时钟8分频,2Mhz。
2、配置使用PB7用作外部中断唤醒引腿,其它IO口固定输出低电平。
3、PB7下降沿中断唤醒
经测试,进入halt模式后,电流约为0.4uA,与手册描述相符。但给PB7一个下降沿后,程序停留在halt后的下一条语句处,只能唤醒halt一次,halt以后的语句不再执行。不知为什么?
程序如下:
主程序main.c#include "stm8l10x.h"
#include "stm8l10x_clk.h"
#include "stm8l10x_gpio.h"
#include "stm8l10x_conf.h"
#include "stm8l10x_it.h"
#define RXD_IN (GPIO_Pin_7)//模拟RXD,暂未使用
#define TXD_OUT (GPIO_Pin_4)//模拟TXD,暂未使用
void CLK_Init(void)
{
CLK_DeInit();
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);
}
void IOInit(void)
{
GPIO_Init(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow );
GPIO_Init(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 , GPIO_Mode_Out_PP_Low_Slow );
GPIO_Init(GPIOB, TXD_OUT, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, RXD_IN, GPIO_Mode_In_PU_IT);
GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 , GPIO_Mode_Out_PP_Low_Slow );
GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Slow );
}
void main(void)
{
CLK_Init();
IOInit();
EXTI_SetPinSensitivity(EXTI_Pin_7, EXTI_Trigger_Falling);//PB7下降沿触发
enableInterrupts();//使能中断
halt();//进入halt低功耗模式
GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow );//外部中断唤醒后,停留在此,不再向下执行,
halt();
GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow );
}
中断服务程序:
stm8l10x_it.c
#ifdef _COSMIC_
@far @interrupt void EXTIB_IRQHandler(void)
#else /* _RAISONANCE_ */
void EXTIB_IRQHandler(void) interrupt 6
#endif /* _COSMIC_ */
{
EXTI_ClearITPendingBit(EXTI_IT_PortB);
}
#ifdef _COSMIC_
@far @interrupt void EXTI7_IRQHandler(void)
#else /* _RAISONANCE_ */
void EXTI7_IRQHandler(void) interrupt 15
#endif /* _COSMIC_ */
{
GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); // RXD
EXTI_ClearITPendingBit(EXTI_IT_Pin7);
} |