STM8->RCC

来源:互联网 发布:域名本机解析 编辑:程序博客网 时间:2024/05/20 17:39

        尝试通过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在同一个系统盘下导致的,但这也是突发性的,应该不涉及到安装目录的问题,工程完善后这个问题也就奇怪消失了。


原创粉丝点击