STM8S105 时钟安全管理

2019-07-19 21:02发布


  现在遇到这么个问题,用外部晶振8M的,启动安全系统,外部晶振损坏 切换到内部晶振8M,但是由于AUX会置位(只能硬件清零(复位)),始终强制将HSI/8作为主时钟,我想修改HSIDIV都不改不了,只能复位修改,

  不知道大家有没有遇到过,给个建议,不用复位就可以修改起来的?  谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
Electronic
2019-07-19 23:02
u8 Clock_Init(void)
{
        u8 HSEStatus = 0;
        u16 StartUpCounter = 0;
        while((CLK_ICKR & 0x02) == RESET);//等待内部时钟稳定
        CLK_ICKR = 0x01;//内部时钟寄存器
        CLK_ECKR = 0x00;//外部时钟寄存器
        CLK_SWR  = 0xE1;//主时钟切换寄存器
        CLK_PCKENR1 = 0x00;
        CLK_PCKENR2 = 0x00;//外设时钟寄存器
        CLK_CSSR = 0x00;//时钟安全系统
        CLK_CCOR = 0x00;//时钟输出寄存器

        do
        {
                CLK_ECKR |= 1<<0;//打开HSE时钟
                HSEStatus = CLK_ECKR & 0x02;//读取就绪标准
                StartUpCounter++;
        }while((HSEStatus == RESET) &&(StartUpCounter < 0xFFFF));//等待HSE时钟准备就绪
        if(HSEStatus != RESET)//成功开启HSE
        {
                CLK_SWCR |= 1<<1;//使能时钟切换机制
                CLK_SWR = 0xB4;    //HSE最为主时钟
                while((CLK_SWCR & 0x01) != RESET);//等待时钟切换完成
                CLK_SWCR &= ~(1<<0);//清除芒标志
                CLK_SWCR &= ~(1<<1);//清除切换标志
                CLK_SWCR &= ~(1<<3);//清除就绪标志
                CLK_CSSR |= 1<<0;//开启时钟安全系统
                CLK_CSSR |= 1<<2;//开启监测中断       
        }
        else
        {
        }
        CLK_CKDIVR &= ~(7<<0);
        CLK_CKDIVR |= 0x00;//设置CPU分频
        return 0;
}

/**********************************************************
函数:    void CLK_Handler(void);
作用:    时钟安全系统中断函数,一但时钟失效,立马复位
入口参数:无      
返回参数:无
***********************************************************/
#pragma vector = CLK_CSS_vector
__interrupt void CLK_Handler(void)
{
        if((CLK_CSSR & 0x08) != 0)//检测到失效
        {
                CLK_CSSR &= ~(1<<3);//清除失效标志
                CLK_CKDIVR = 0x00;//修改预分频值  /*可以屏蔽掉这两行行试试,就部分修改预分频了*/
        }
}
/***************************End***************************/


一周热门 更多>