[STM8] STM8L101F3P6,halt唤醒后停留在halt下一条的语句

[复制链接]
7380|8
 楼主| sy_lixiang 发表于 2012-7-30 15:52 | 显示全部楼层 |阅读模式
本帖最后由 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
  1. #include "stm8l10x.h"
  2. #include "stm8l10x_clk.h"
  3. #include "stm8l10x_gpio.h"
  4. #include "stm8l10x_conf.h"
  5. #include "stm8l10x_it.h"

  6. #define RXD_IN (GPIO_Pin_7)//模拟RXD,暂未使用
  7. #define TXD_OUT (GPIO_Pin_4)//模拟TXD,暂未使用

  8. void CLK_Init(void)
  9. {
  10. CLK_DeInit();
  11. CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);
  12. }

  13. void IOInit(void)
  14. {
  15. GPIO_Init(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow );

  16. 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 );

  17. GPIO_Init(GPIOB, TXD_OUT, GPIO_Mode_Out_PP_High_Slow);

  18. GPIO_Init(GPIOB, RXD_IN, GPIO_Mode_In_PU_IT);

  19. GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 , GPIO_Mode_Out_PP_Low_Slow );

  20. GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Slow );
  21. }

  22. void main(void)
  23. {
  24. CLK_Init();
  25. IOInit();

  26. EXTI_SetPinSensitivity(EXTI_Pin_7, EXTI_Trigger_Falling);//PB7下降沿触发
  27. enableInterrupts();//使能中断

  28. halt();//进入halt低功耗模式

  29. GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow );//外部中断唤醒后,停留在此,不再向下执行,

  30. halt();

  31. GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow );
  32. }
中断服务程序:
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);   
}
 楼主| sy_lixiang 发表于 2012-8-2 08:44 | 显示全部楼层
看样子是不会有人回复了。。。

结贴了。。。
枫叶gbwz 发表于 2013-1-20 23:13 | 显示全部楼层
halt文件唤醒之后是去中断吧,至于中断运行完之后是否回来原来的主程序好像是要设定的。我只是依稀记得看有人的帖子这么说过。在Global configuration register (CFG_GCR)里头
zykzyk 发表于 2013-4-4 10:17 | 显示全部楼层
本帖最后由 zykzyk 于 2013-4-6 21:03 编辑

搞定
cjhk 发表于 2013-4-4 18:38 | 显示全部楼层
不是很了解  楼主   我帮你顶一个   呵呵   问题没有涉及过   呵呵
zykzyk 发表于 2013-4-6 21:04 | 显示全部楼层
问题在GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); // RXD 上面。应该为GPIO_Mode_In_PU_IT。
giant0113 发表于 2013-11-26 13:16 | 显示全部楼层
xiaox314 发表于 2014-3-4 10:06 | 显示全部楼层
好东西
aichixiaobaicai 发表于 2014-8-22 16:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

48

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部