STM32低功耗,停机模式,IAP
以下总结了最近在调试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略有不同)
上一篇: STM32外部中断、串口唤醒低功耗
下一篇: STM32 低功耗