尝试通过RTC中断唤醒halt()低功耗模式,需要一个功耗低的时钟源作为RTC运行时钟,选择LSI的16分频作为时钟源:
void RCC_LSI(void)
{
CLK_LSICmd (ENABLE);
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
while(CLK_GetFlagStatus(CLK_FLAG_LSIRDY)==RESET);
CLK_SYSCLKSourceSwitchCmd (ENABLE);
if(CLK_GetSYSCLKSource()==CLK_SYSCLKSource_LSI)
{
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_16);
}
}
RTC中断设置:
RTC_DeInit();
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_64);
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
RTC_ITConfig(RTC_IT_WUT, ENABLE);
RTC_SetWakeUpCounter(time);
RTC_ClearITPendingBit(RTC_IT_WUT);
此处没有直接使能,因为在调试过程中,这部分的设置是在高速时钟下,如果把这部分设置都放置RCC_LSI()之后,则会卡死,所以只将RTC_WakeUpCmd(ENABLE)放在RCC_LSI()函数之后。
halt()或wfi()模式被RTC中断唤醒后,切换回高速内部时钟:
void RCC_HSI(void)
{
CLK_HSICmd(ENABLE);
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)==RESET);
CLK_SYSCLKSourceSwitchCmd (ENABLE);
if(CLK_GetSYSCLKSource()==CLK_SYSCLKSource_HSI)
{
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
}
}
在尝试直接从LSI切换到HSI失败时,STLINK连接MCU发生错误:
Failed to get execution status: SWIM error [30004]: Comm timeout 。因为调试过程中发生的,不存在硬件的突然异常,这种连接错误只能归因于MCU系统时钟没有工作,在该例中是由于时钟没有正常过渡,在调试中LSI到HSI切换时钟时发生,根据网上获得的一些线索可能是与寄存器操作的-“|”或-有关系。
在利用IAR for STM8 开发的过程中,如果工程较大结构层次较复杂,或者是经常改换文件名,会导致软件崩溃:
Fatal Error[Pe1696]: cannot open source file "stm8l15x_pwr.h",由于IAR软件的崩溃,原本正常的工程一下子报了很多此类的错误。只能重新添加引用文件夹了。
还有一类错误:
Fatal error: Unknown exception in driver (SD1) Session aborted!
网上可以查到的答案是因为IAR没与Texas Instruments在同一个系统盘下导致的,但这也是突发性的,应该不涉及到安装目录的问题,工程完善后这个问题也就奇怪消失了。
上一篇:单片机中使用printf打印浮点数问题
下一篇:STM8->GPIO
推荐阅读最新更新时间:2024-03-16 16:23