欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32低功耗,停机模式,IAP

程序员文章站 2022-07-02 09:48:31
...

以下总结了最近在调试STM32低功耗时所遇到的问题,分享给小伙伴

主要问题有以下三点:

1.系统进入停机模式,然后通过RTC闹钟唤醒后,程序不能正常运行

       通过仔细阅读应用手册和查阅资料发现,系统退出停机模式后,需要重新配置时钟

这里我在RTC的闹钟中断里调用  SystemInit()  即解决该问题。

       另:在利用RTC闹钟唤醒停机模式时,要注意配置EXIT17

2.系统在加入IAP功能后,RTC唤醒后又不能正常运行

         实现IAP功能需要在主程序中加入地址偏移,加地址偏移的方法有两种:

         1)修改SystemInit()

                该函数在最后有设置主程序的地址偏移,如下:

                 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 
                                                                              /* Vector Table Relocation in Internal FLASH. */

                 修改宏定义VECT_TAB_OFFSET即可(默认为0x0)。

          2)调用如下函数

                 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3800);  //从 0x08003800 开始存放 APP程序

         一开始我只知道第二种方法,就只在main()函数的起始进行了地址偏移,然而退出停机模式后必须要调用SystemInit(),该函数又将地址偏移修改回默认的0x0了,所以程序不能正常执行。

        该问题的解决方法就是将修改SystemInit(),利用第一种方法进行地址偏移。

3.在把系统的其他功能加入后,RTC唤醒后又双叒叕不能正常运行

        其他功能包括串口、定时器、SPI等,通过打log发现,退出停机模式后,SystemInit()始终执行不过去,推断应该是其他功能影响了SystemInit()的执行,所以在SystemInit()执行之前关闭了其他功能的时钟,果然。。。。。。终于成了

上程序:

void RTCAlarm_IRQHandler()               //RTC中断服务函数
{	
	if(RTC_GetINTStatus(RTC_INT_ALA)!=RESET)
	{

        RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, DISABLE);    
	    RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_USART2, DISABLE);
	    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_SPI1,   DISABLE );    	
	    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_TMR1,   DISABLE);    
        
        SystemInit();                    //重要!!!退出停机模式必须调用该函数来重新配置时钟
		
        RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE);    
	    RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_USART2, ENABLE);
	    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_SPI1,   ENABLE );    	
	    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_TMR1,   ENABLE); 

		RTC_SetAlarmValue(5+RTC_GetCounter());  //闹钟设置为(5+1)S
		RTC_WaitForLastTask();
	}
	
	RTC_ClearINTPendingBit(RTC_INT_ALA);
	EXTI_ClearIntPendingBit(EXTI_Line17);    
	RTC_WaitForLastTask();
}

(程序基于国产MCU雅特利的AT413,与STM32略有不同)

相关标签: 嵌入式