OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3104|回复: 9

STM8S105 时钟安全管理

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-15
在线时间
4 小时
发表于 2016-10-15 12:13:49 | 显示全部楼层 |阅读模式
1金钱

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

  不知道大家有没有遇到过,给个建议,不用复位就可以修改起来的?  谢谢了

最佳答案

查看完整内容[请看2#楼]

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
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-10-15 12:13:50 | 显示全部楼层
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***************************/


回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-10-17 11:00:34 | 显示全部楼层
你看看行不行
QQ截图20161017110026.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-18 21:35:06 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-15
在线时间
4 小时
 楼主| 发表于 2016-10-19 17:09:27 | 显示全部楼层

试了没效果呢,始终是HSI/8的频率在工作,  有人搞过吗,是不是我哪里步骤不对,
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-10-19 17:28:48 | 显示全部楼层
等下我试试
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-15
在线时间
4 小时
 楼主| 发表于 2016-10-20 11:09:49 | 显示全部楼层
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;   就是不行,晕了,
直接清标志位的写法不行吗?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-15
在线时间
4 小时
 楼主| 发表于 2016-10-20 11:21:05 | 显示全部楼层
shanhuohui 发表于 2016-10-20 11:09
#pragma vector = CLK_CSS_vector
__interrupt void CLK_Handler(void)
{

发现原因了,必须把CLK_CSSR_CSSDIE也要清0 ,
清CLK_CSSR=0; 就好了,
手册上好像没提到要清IE位啊,郁闷,

谢谢兄弟了,
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-10-20 17:10:42 | 显示全部楼层
shanhuohui 发表于 2016-10-20 11:21
发现原因了,必须把CLK_CSSR_CSSDIE也要清0 ,
清CLK_CSSR=0; 就好了,
手册上好像没提到要清IE位啊, ...

进入中断后,你不清楚中断标志,使得每次进入中断,即使你又是HSI不分频,但是每次进入到中断拖慢的系统的速度了,你直接把中断使能都关了,这样我没试过。
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-10-20 17:14:04 | 显示全部楼层
我是一但时钟失效,立马复位的,我这个对安全性不怎么重要,直接复位就行,类外可以开启看门狗等功能,时钟变慢了,喂狗自然也就慢了,这样系统更加可靠
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表