STM8S105 时钟安全管理

2019-07-19 21:02发布


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

  不知道大家有没有遇到过,给个建议,不用复位就可以修改起来的?  谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Electronic
1楼-- · 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***************************/


Electronic
2楼-- · 2019-07-20 00:15
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 03:25
帮顶
shanhuohui
4楼-- · 2019-07-20 04:54
Electronic 发表于 2016-10-17 11:00
你看看行不行

试了没效果呢,始终是HSI/8的频率在工作,  有人搞过吗,是不是我哪里步骤不对,
Electronic
5楼-- · 2019-07-20 08:02
 精彩回答 2  元偷偷看……
shanhuohui
6楼-- · 2019-07-20 11:37
Electronic 发表于 2016-10-19 17:43
u8 Clock_Init(void)
{
        u8 HSEStatus = 0;

#pragma vector = CLK_CSS_vector
__interrupt void CLK_Handler(void)
{
        if((CLK_CSSR & 0x08) != 0)//检测到失效
        {
                CLK_CSSR &= ~(1<<3);//清除失效标志
                CLK_CKDIVR = 0x00;//修改预分频值  /*可以屏蔽掉这两行行试试,就部分修改预分频了*/
        }
}
/***************************End***************************/

这部分用你这个程序就可以了,
用我自己的
CLK_CSSR_CSSD = 0;
CLK_CKDIVR = 0X00;   就是不行,晕了,
直接清标志位的写法不行吗?

一周热门 更多>