-
额,我试试XP
-
其实个人也做了规避措施,做法是这样的。
红外POWER键长按5秒关机之后,我会关闭定时器不再捕获红外信号,然后延时300ms,
然后再来配置红红外接收头的GPIO,EXTI,NVIC,这样就没有出现那个现象了。
但是这只是一个规避措施,还是不知道为什么会发生那样的现象。真是如鲠在喉啊
看大家有无想法。
-
其实,代码单独抠出来,测试应该是没有问题的。
可能跟我的工程有关。
业务上是这样的,
在程序正常运行的时候,红外接收头的GPIO被定义为定时器捕获的输入,红外POWER键长按5秒之后关机,
在关机之前,将红外接收头的GPIO配置为外部中断(因为停止模式只能由外部中断唤醒或者RTC、USB等唤醒)
然后休眠后,就可以由红外信号唤醒MCU,唤醒后再把红外接收头的GPIO被定义为定时器捕获的输入。
为什么有时候唤不醒,个人推测原因:
在红外POWER键长按的时候,定时器捕获中断一直在触发,当确定收到POWER键长按5秒信号之后关机。
但是手不一定会立刻放开POWER键,所以定时器捕获中断一直在触发,但是在这个时候,我们又在重新配置
红外接收头的GPIO,EXTI,NVIC。所以我推测这里出现了问题。说简单一点就是,在中断函数不断触发的同时
我们在配置它的中断模式,NVIC,这样导致了矛盾。
这只是我的推测,不知大家有何看法。
另外加一条,在我实验的时候发现,虽然在休眠,但是可以响应外部中断(会执行中断服务函数),但就是唤不醒
-
weizhongc 发表于 2015-8-25 10:19
帅锅,我用的是停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
-
huo_hu 发表于 2015-8-25 23:47
晕,你怎么不说jtag
后续的省略了,:lol
反正内容的位置都告诉你了,你可以去看看。。JTAG是有特别说明的。
-
stop_mode:
#if DEBUG
printf("MCU Enter Stop Mode!\n");
#endif
//本人测试发现,在这里加上
RTC_Configuration();
//则可以避免该现象
//set the all GPIO as general GPIO 、remap IRDA in EXIT0 and disable TIM4 interrupt
lowLevelGPIOCfg(); //将一些GPIO打到低电平,避免休眠耗电
ADC_Cmd(ADC1, DISABLE);//关闭ADC
其中函数定义:
void RTC_Configuration(void)
{
// Allow access to BKP Domain
PWR_BackupAccessCmd(ENABLE);
// Reset Backup Domain
//BKP_DeInit();
// Enable LSE
RCC_LSEConfig(RCC_LSE_ON);
// Wait till LSE is ready
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
// Select LSE as RTC Clock Source
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
// Enable RTC Clock
RCC_RTCCLKCmd(ENABLE);
// Wait for RTC registers synchronization
RTC_WaitForSynchro();
// Wait until last write operation on RTC registers has finished
RTC_WaitForLastTask();
// Enable the RTC Alarm
//RTC_ITConfig(RTC_IT_ALR, ENABLE);
// Wait until last write operation on RTC registers has finished
//RTC_WaitForLastTask();
// Set RTC prescaler: set RTC period to 1 sec
// RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
RTC_SetPrescaler(32767);
// Wait until last write operation on RTC registers has finished
RTC_WaitForLastTask();
//GPS复用PC13
BKP_TamperPinCmd(DISABLE); //关闭入侵检测功能,也就是 PC13,也可以当普通IO使用
BKP_ITConfig(DISABLE);
}
但是函数里面存在备份寄存器的复位,会丢掉所有备份寄存器的值,唉,其实不知道根本原因在哪里
-
第一次进入休眠后,有概率无法被外部中断唤醒(我配置的所有的外部中断)
-
不能上传本地图片。
在STM32中文参考手册V10 第70页底部 有这么一段话
复位期间和刚复位后,复用功能未开启, I/O端口被配置成浮空输入模式(CNFx[1:0]=01b,
MODEx[1:0]=00b)。
复位后, JTAG引脚被置于输入上拉或下拉模式:
─ PA15: JTDI 置于上拉模式
─ PA14: JTCK 置于下拉模式
─ PA13: JTMS 置于上拉模式
─ PB4: JNTRST 置于上拉模式
-
各位,我查到了。。给你们看看
-
huaiqiao 发表于 2015-8-24 10:00
看要写什么程序了。它的处理方式有两种方法:1. 寄存器方式;2. 库函数方式。但是最常用的就是库函数方式了 ...
。。。
晕,我问不用的GPIO要设置成什么状态,,是浮空输入,还是推挽输出。。。或者其他六种方式。。
-
huo_hu 发表于 2015-8-24 11:29
既然不用管它干嘛
因为这个考虑到硬件的安全性,硬件工程师,跟我说,一定要给一个确定的状态。不能不管。
-
因为这个考虑到硬件的安全性,硬件工程师,跟我说,一定要给一个确定的状态。不能不管。。