OpenEdv-开源电子网

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

STM8L 时钟切换失败

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-3-6
在线时间
0 小时
发表于 2014-7-29 10:25:44 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void System_Clk_DivSet(U8 div) { CLK_CKDIVR=0; //清除原来的设置 CLK_CKDIVR=div&0X07; //设置DIV } void stm8_clock_init(U8 clksrc,U8 div) { System_Clk_DivSet(div); //设置分频 while(System_Clk_AutoSwitch(clksrc)); //切换时钟 // CLK_CSSEnable();//开启时钟安全系统 } /自动切换新时钟源(仅HSI/HSE) //newsrc:0,HSI // 1,HSE // 2,LSI // 3,LSE //返回值:0,修改成功;1,修改失败. U8 System_Clk_AutoSwitch(U8 newsrc) { U16 timeout=0xffff; U8 oldsrc=CLK_SCSR; //老的时钟源 CLK_SWCR|=1<<1; //使能时钟切换功能 CLK_SWCR&=~(1<<2); //关闭切换中断 if(newsrc==0) { CLK_SWR=0X01; //HSI } else if(newsrc==1)CLK_SWR=0X04; //HSE else if(newsrc==2) { CLK_ICKCR |= 1<<2;//使能LSI while(!(CLK_ICKCR&1<<3)); CLK_SWR=0X02; //LSI } else if(newsrc==3)CLK_SWR=0X08; //LSE while((CLK_SWCR&(1<<0))&&timeout)timeout--; //等待切换完成 if(oldsrc==0X01&&newsrc!=0)CLK_ICKCR&=~(1<<0); //关闭HSI else if(oldsrc==0X04&&newsrc!=1)CLK_ECKCR&=~(1<<0); //关闭HSE else if(oldsrc==0X02&&newsrc!=2)CLK_ICKCR&=~(1<<2); //关闭LSI else if(oldsrc==0X08&&newsrc!=3)CLK_ECKCR&=~(1<<2); //关闭LSE if(timeout)return 0; else return 1; }[/mw_shl_code]
[mw_shl_code=c,true]main() { stm8_clock_init(2,3); //切换时钟到内部LSI 8分频 while() { } }[/mw_shl_code]
我想把默认的系统时钟从HSI切换到LSI,为了降低功耗,可是在切换的时候到 [mw_shl_code=c,true]CLK_SWR=0X02; //LSI[/mw_shl_code] 就出错了,

我用的单片机是STM8L152C6,这是什么原因呢?求帮助哦!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-29 10:57:43 | 显示全部楼层
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-3-6
在线时间
0 小时
 楼主| 发表于 2014-7-29 11:32:39 | 显示全部楼层
反复试验后发现,切换LSI时钟时,不分频能正常切换,分频就出错。这是怎么回事呢?
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-3-6
在线时间
0 小时
 楼主| 发表于 2014-7-29 11:41:28 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我是参考的你程序写的,你在切换时钟前,还对FLASH进行了操作,这块没看太懂。
void stm8_clock_init(u8 clksrc,u8 div)
{
u16 fwait=0;
fwait=STMFLASH_ReadOptionByte(OPT_FLASHWAIT_ADDR); //读取wait值
if(clksrc==1&&STM8_HSE_B16M&&div==0) //HSE做时钟,且外部晶振大于16M,且未分频
{
if(fwait!=0X01)//没有设置wait值,则需要设置

STMFLASH_Unlock(1); //先解锁  
STMFLASH_ProgramOptionByte(OPT_FLASHWAIT_ADDR,1); //大于16Mhz,写入1个flash等待周期
STMFLASH_ProgramOptionByte(OPT_HSESTARTUP_ADDR,0XB4); //稳定周期设置为128个时钟周期 
STMFLASH_Lock(1);  //上锁 
}

}else //否则,不需要flash等待周期
{
  if(fwait==0X01)//设置了wait值,则需要去掉
{
STMFLASH_Unlock(1); 
STMFLASH_EraseOptionByte(OPT_FLASHWAIT_ADDR); //HSI,不需要FLASH等待周期,提高速度
STMFLASH_EraseOptionByte(OPT_HSESTARTUP_ADDR); //不需要稳定周期
STMFLASH_Lock(1); 
}  
}
System_Clk_DivSet(div); //设置分频
while(System_Clk_AutoSwitch(clksrc)); //切换时钟
}能不能帮忙解释一下呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-29 20:23:25 | 显示全部楼层
回复【4楼】little:
---------------------------------
无解释。。。好久没搞STM8S,都忘了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-20
在线时间
0 小时
发表于 2014-7-31 16:28:44 | 显示全部楼层
还没用过这样的功能。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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