完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
stop_mode:
#if DEBUG printf("MCU Enter Stop Mode!n"); #endif //set the all GPIO as general GPIO 、remap IRDA in EXIT0 and disable tiM4 interrupt lowLevelGPIOCfg(); //将一些GPIO打到低电平,避免休眠耗电 ADC_Cmd(ADC1, DISABLE);//关闭ADC DMA_Cmd(DMA1_Channel1, DISABLE);//关闭DMA WireControl_EXTI_Enable(); //配置一个外部中断 GPIO_ResetBits(Led_Power, Led_Power_Pin);//关闭电源灯 //GPIO_SetBits(Led_Power, Led_Power_Pin); BKP_WriteBackupRegister(BKP_DR3, 0xFFFF); //设置一个备份寄存器,作为复位之后的判断标志 //Enter a stop mode //Request to enter STOP mode with regulator in low power mode, wake by any exit interrupt IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//看门狗计数器访问使能 IWDG_SetReload(0xfff);//设置看门狗重载值,由原来的3秒,改为26秒 IWDG_ReloadCounter();//装载看门狗计数器 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式 //以下是唤醒之后的配置操作 reconfigSysClkConfig(); //重新配置系统时钟 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init( NVIC_InitStructure);// //Configure EXTI0 line EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = ACC_EXTI_Trigger ; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ; EXTI_InitStructure.EXTI_LineCmd = DISABLE; EXTI_Init( EXTI_InitStructure); WireControl_EXTI_Disable(); //restore the GPIO configurate GPIO_Configuration(0); GPIO_SetBits(Led_Power, Led_Power_Pin); USART_Configuration(); NVIC_Configuration(); TIM_Configuration(); TIM_ITConfig(TIM2, TIM_IT_Update , DISABLE);//开启计数中断 DMA_Configuration(); ADC_Configuration(); BKP_WriteBackupRegister(BKP_DR3, 0x0000);//修改备份寄存器的值 IWDG_Config(); SysTick_Config(SystemCoreClock / 5); } 本人解释一下大体代码思路,进入休眠之后,会拉低相关的GPIO,确保省电;配置一些外部中断,用来唤醒停止模式;休眠前写入一个值到备份寄存器。 然后休眠,休眠26秒后,看门狗复位,程序重启,判断是否由看门够引起的复位(第一次肯定是由看门够引起的复位,因为备份寄存器里面有休眠之前写入的值),若是由看门狗引起的复位,则不会开启看门狗功能,直接再次进入到这段代码,再次进入休眠,这次休眠,因为没有看门狗,所以可以一直休眠下去(只要没有外部中断触发),当外部中断触发以后,程序就唤醒,之后修改备份寄存器里面的值。 以下是问题: 个人倒是觉得代码和思路都没问题。但是测试的时候发现一个问题。而且是概率性的。 偶尔进入停止模式的时候,我的所有外部中断都无法将其唤醒。非要等复位过后,再次进入停止模式,才能由 外部中断唤醒。这真的是让我蛋碎了一地。。 看各位有啥高见。 |
|
相关推荐
1个回答
|
|
STM32在休眠模式下不能唤醒的原因可能有以下几点:
1. 唤醒源配置错误:确保你已经正确配置了唤醒源,例如定时器、外部中断等。检查唤醒源的初始化代码,确保它们已经正确设置。 2. 唤醒源未触发:检查唤醒源是否已经触发。例如,如果使用定时器作为唤醒源,确保定时器已经启动并且时间设置正确。 3. 电源管理配置错误:检查电源管理配置,确保STM32已经正确进入休眠模式。例如,检查PWR和RCC的配置,确保时钟和电源设置正确。 4. 中断优先级配置错误:确保唤醒源的中断优先级设置正确。如果中断优先级设置不正确,可能会导致STM32无法从休眠模式唤醒。 5. 硬件问题:检查STM32的硬件连接,确保没有短路或断路等问题。此外,检查电源供应是否稳定。 6. 软件问题:检查STM32的固件代码,确保没有死锁或其他软件问题导致STM32无法从休眠模式唤醒。 7. 调试器干扰:如果你在调试过程中遇到这个问题,尝试断开调试器连接,看看STM32是否能够正常唤醒。 8. 低功耗模式配置错误:确保你已经正确配置了低功耗模式,例如STOP、STANDBY或STANDBY with RTC。检查PWR和RCC的配置,确保时钟和电源设置正确。 9. 唤醒源的时钟未启用:确保唤醒源的时钟已经启用。例如,如果使用定时器作为唤醒源,确保定时器的时钟已经启用。 10. 唤醒源的中断未使能:确保唤醒源的中断已经使能。检查唤醒源的中断使能位,确保它们已经正确设置。 解决这些问题后,STM32应该能够从休眠模式正常唤醒。如果问题仍然存在,请仔细检查硬件和软件,确保没有其他潜在问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
582浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 21:02 , Processed in 0.684614 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号